diff --git a/info.json b/info.json index ca95a41..fcb2ed6 100644 --- a/info.json +++ b/info.json @@ -3,6 +3,9 @@ "3d_armor":{ "author":"stu" }, + "ambience":{ + "author":"TenPlus1" + }, "ancient_bones":{ "author":"karlexceed" }, @@ -19,6 +22,9 @@ "author":"mt-mods", "required":["xcompat"] }, + "biome_lib":{ + "author":"mt-mods" + }, "bucket_wooden":{ "author":"Hume2" }, @@ -34,9 +40,27 @@ "coloredstrings":{ "author":"Alib234" }, + "denseores":{ + "author":"benedict424" + }, + "desertores":{ + "author":"DumbDave961" + }, + "dfcaverns":{ + "author":"FaceDeer" + }, "discovery_maps":{ "author":"TomCon" }, + "dmobs":{ + "author":"TenPlus1", + "notes":"Dragons are too frequent, nyan cats are annoying.", + "required":["mobs"], + "status":"abandoned" + }, + "ebiomes":{ + "author":"CowboyLv" + }, "ethereal":{ "author":"TenPlus1", "colloquial_name":"Ethereal NG", @@ -69,6 +93,31 @@ "handholds_redo":{ "author":"TestificateMods" }, + "livingcaves":{ + "author":"Liil" + }, + "livingcavesmobs":{ + "author":"mt-mods", + "required":["livingcaves"] + }, + "livingdesert":{ + "author":"Liil" + }, + "livingjungle":{ + "author":"mt-mods" + }, + "lumpblocks":{ + "author":"SilverSandstone" + }, + "marinara":{ + "author":"mt-mods", + "notes":"Needs TNT.", + "required":["mobs"] + }, + "marinaramobs":{ + "author":"Liil", + "required":["marinara","mobs"] + }, "mesecons":{ "author":"Jeija", "notes":"Add its provides.." @@ -104,19 +153,46 @@ "author":"ClothierEdward", "required":["awards"] }, + "moreblocks":{ + "author":"Calinou" + }, + "morebricks":{ + "author":"CalebJ" + }, "moreores":{ "author":"Calinou" }, + "moretrees":{ + "author":"mt-mods" + }, "multitools":{ "author":"ChimneySwift" }, + "nativevillages":{ + "author":"Liil", + "required":["people"] + }, + "naturalbiomes":{ + "author":"Liil" + }, "nutritional":{ "author":"ghurir" }, + "people":{ + "author":"Liil", + "required":["mobs"] + }, + "plantlife_modpack":{ + "author":"mt-mods", + "required":["biome_lib"] + }, "priviledges_manager":{ "author":"Impulse", "status":"untested" }, + "renewable_desert_stone":{ + "author":"Emandac" + }, "ropes":{ "author":"FaceDeer" }, @@ -129,6 +205,10 @@ "provides":["autobahn","basic_materials","compost","datastorage","doc","hyperloop","lcdlib","minecart","nanobasic","networks","safer_lua","signs_bot","stamina","ta4_addons","ta4_jetpack","ta4_paraglider","techage","techpack_stairway","towercrane","tubelib2","unified_inventory"], "required":["3d_armor","xcompat"] }, + "technic_plus":{ + "author":"mt-mods", + "notes":"This is a rewrite of technic for performance improves and new machines." + }, "too_many_tnt":{ "author":"SkyBuilder1717", "notes":"Remember to enable TNT.", @@ -169,9 +249,21 @@ "uraniumstuff":{ "author":"Epoxum" }, + "vizlib":{ + "author":"OgelGames", + "notes":"I forgot to note which mods make use of this." + }, "wetmud":{ "author":"Nicu" }, + "wilhelminessounds":{ + "author":"Liil", + "required":["ambience"] + }, + "winuserleafdecay":{ + "author":"Liil", + "notes":"Compatibility for Windows hosts." + }, "worldedit":{ "author":"sfan5" }, @@ -249,17 +341,23 @@ "Unnamed Luanti Technic Pack":{ "mods":{ "3d_armor":true, + "ambience":true, "ancient_bones":true, "anvil":true, "automobiles_pck":true, "awards":true, "basic_materials":true, + "biome_lib":true, "bucket_wooden":true, "ccompass":true, "charcoal":true, "colored_chests":true, "coloredstrings":true, + "denseores":true, + "desertores":true, + "dfcaverns":true, "discovery_maps":true, + "ebiomes":true, "everness":true, "eye_spy":true, "fakelib":true, @@ -268,6 +366,13 @@ "grass_string":true, "hammersredo":true, "handholds_redo":true, + "livingcaves":true, + "livingcavesmobs":true, + "livingdesert":true, + "livingjungle":true, + "lumpblocks":true, + "marinara":true, + "marinaramobs":true, "mesecons":true, "mob_horse":true, "mob_mese_monster_classic":true, @@ -277,13 +382,25 @@ "mobs_water":true, "more_ladders":true, "moreawards":true, + "moreblocks":true, + "morebricks":true, "moreores":true, + "moretrees":true, "multitools":true, + "nativevillages":true, + "naturalbiomes":true, "nutritional":true, + "people":true, + "plantlife_modpack":true, + "priviledges_manager":true, + "renewable_desert_stone":true, "ropes":true, + "stamina":true, + "technic_plus":true, "too_many_tnt":true, "toolranks":true, "toolranks_extras":true, + "towercrane":true, "travelnet":true, "treecapitator":true, "unified_inventory":true, @@ -291,7 +408,10 @@ "unifiedbricks":true, "unifieddyes":true, "uraniumstuff":true, + "vizlib":true, "wetmud":true, + "wilhelminessounds":true, + "winuserleafdecay":true, "worldedit":true, "x_farming":true, "xcompat":true, diff --git a/mods/ambience/README.md b/mods/ambience/README.md new file mode 100644 index 0000000..93b4b6c --- /dev/null +++ b/mods/ambience/README.md @@ -0,0 +1,47 @@ +Ambience Redo mod for Minetest + by TenPlus1 + +Based on Immersive Sounds .36 mod by Neuromancer and optimized to run on servers with a brand new API to quickly and easily add sound sets to your world, it also has new fire sounds for use with Fire Redo mod... + + +Four new functions are available to add and change sound sets, and two commands to adjust player volume for music and sounds (api.txt file shows detailed usage): + +ambience.add_set(set_name, def) + +ambience.add_to_set(set_name, sound_table) + +ambience.get_set(set_name) + +ambience.del_set(set_name) + +/mvol (volume) +/svol (volume) + + +Changelog: +- 0.1 - Initial release +- 0.2 - Code change and new water sounds added +- 0.3 - Works with Fire Redo mod to provide fire sounds +- 0.4 - Code optimized +- 0.5 - Changed to kilbiths smaller sound files and removed canadianloon1, adjusted timings +- 0.6 - Using new find_nodes_in_area features to count nodes and speed up execution (thanks everamzah) +- 0.7 - Code tweaks and added Jungle sounds for day and night time +- 0.8 - Override default water sounds for 0.4.14 dev and above, add separate gain for each sound +- 0.9 - Plays music files on server or local client when found at midnight, files to be named "ambience_music.1.ogg" changing number each up to 9. +- 1.0 - Added icecrack sound when walking on snow/ice flows, also tidied code +- 1.1 - Using newer functions, Minetest 0.4.16 and above needed to run +- 1.2 - Added PlayerPlus compatibility, removed fire sounds, added volume changes +- 1.3 - Added API for use with other mods, code rewrite +- 1.4 - Re-ordered water sets to come before fire and lava, day/night sounds play when leaves around and above ground +- 1.5 - Added 'flame_sound' and fire redo check, code tidy and tweak, added ephemeral flag for background sounds. +- 1.6 - Finding env_sounds disables water and lava sets, added 'ambience_water_move' flag to override water walking sounds, use eye level for head node. +- 1.7 - Music will play every 20-30 minutes if found, use '/mvol 0' to stop playing music or disable in-game. +- 1.8 - Players can set induvidual volume for sound and music which is saved. +- 1.9 - Tidy code, refactor music playing, add biome name to sound_check. +- 2.0 - Add Mineclone support, add ethereal leaf check, remove minetest.after for custom timer, add Polish translation, tweak & tidy code. +- 2.1 - Add ambience.group_total() function for easy counting of group: nodes inside a set. +- 2.2 - Adds background sounds to sets that play looped in the background while normal sounds play on top (when conditions met), and sound chance. +- 2.3 - Add 'ambience_music_interval' setting [default is 1200, 0 to disable]. Optimize code. + + +Code license: MIT diff --git a/mods/ambience/api.txt b/mods/ambience/api.txt new file mode 100644 index 0000000..a8502bb --- /dev/null +++ b/mods/ambience/api.txt @@ -0,0 +1,136 @@ + +Ambience Lite API +================= + +This short guide will show you how to add sound sets into ambience mod for the +api to use and play sounds accordingly. Please note that the order they are +added will affect sound checks, so high priority sets first. + + +Function Usage +============== + + +Adding Sound Set +---------------- + +ambience.add_set(set_name, def) + 'set_name' contains the name of the sound set to add + 'def' contains the following: + 'frequency' how often the sound set is played (1 to 1000) higher is more + 'nodes' contains a table of nodes needed for checks + 'background' contains a table of sounds that play in the background when + sound_check conditions are met. + 'sounds' contains a table of sounds that play on top of any background + sounds that can stop when conditions are not met, or can be + ephemeral for shorter sounds. + 'sound_check(def)' function to check if sounds can be played, def contains: + 'player' player userdata + 'pos' position of player + 'tod' time of day + 'totals' totals for each node e.g. def.totals["default:sand"] + 'positions' position data for every node found + 'head_node' name of node at player head level + 'feet_node' nameof node at player foot level + 'biome' name of biome at current position + +This will let you add a set or sounds with the frequency it's used and check +function for it to play. If ephemeral is true then no handler will be used and sound will be played in background alongside other sounds. + +e.g. + +ambience.add_set("village", { + frequency = 500, + nodes = {"mymod:village_sound_block"}, -- activates sounds when in range + background = { + {"name = "village_background", gain = 0.5, fade = 1.0}, + }, + sounds = { + {name = "dogbark", gain = 0.4, ephemeral = true, chance = 7}, -- quick sound effect + {name = "talking_villagers", gain = 0.3, chance = 3}, -- stops when out of range + {name = "chicken", gain = 0.6, ephemeral = true, chance = 5}, + {name = "chicken", gain = 0.6, pitch = 1.2, ephemeral = true, chance = 5}, + }, + sound_check = function(def) + local number = def.totals["mymod:village_sound_block"] or 0 + if number > 0 then + return "village" + end + end, +}) + +ambience.add_set("windy", { + frequency = 80, + nodes = {"default:sand"}, + sounds = { + {name = "wind", length = 9, gain = 0.3, fade = 1.0}, -- fade in sound + {name = "desertwind", length = 8, gain = 0.3}, + {name = "crow", length = 3, ephemeral = true}, + }, + sound_check = function(def) + local number = def.totals["default:sand"] or 0 -- yep, can also be nil + if def.pos.y > 0 and number > 30 then -- above ground near plenty sand + return "windy", 0.2 -- return set to play and optional gain volume + end + end +}) + + +Counting group: nodes +--------------------- + +Instead of counting each node total for things like leaves within the sound_check function, you could use the following helper function to return their total instead e.g. + +local number = ambience.group_totals(def.totals, "leaves") -- count all group:leaves + + +Adding sound to existing Set +---------------------------- + +ambience.add_to_set(set_name, sound_table) + +e.g. + +ambience.add_to_set("cave", {name = "monster_whispers", pitch = 1.2, length = 8}) + + +Getting Sound Set +----------------- + +ambience.get_set(set_name) + +This returns a table containing all of the set information like example above. + +e.g. + +local myset = ambience.get_set("windy") -- returns everything inside {} above. + + +Deleting Sound Set +------------------ + +ambience.del_set(set_name) + +This will remove a sound set from the list. + +e.g. + +ambience.del_set("windy") + + +Additional Commands +=================== + +Two volume commands have been added to set sound and music volume: + +/svol (0.1 to 1.0) +/mvol (0.1 to 1.0) -- 0 can be used to stop music curently playing + + +Music +===== + +Music can be stored in the sounds folder either on server or locally and so long +as it is named 'ambience_music.1', 'ambience_music.2' etc. then it will select +a song randomly to play every 20 minutes. + diff --git a/mods/ambience/init.lua b/mods/ambience/init.lua new file mode 100644 index 0000000..970e5b6 --- /dev/null +++ b/mods/ambience/init.lua @@ -0,0 +1,403 @@ + +ambience = {} + +-- settings + +local SOUNDVOLUME = 1.0 +local MUSICVOLUME = 0.6 +local MUSICINTERVAL = tonumber(core.settings:get("ambience_music_interval")) or (60 * 20) +local radius = 6 +local playing = {} -- user settings, timers and current set playing +local sound_sets = {} -- all the sounds and their settings +local sound_set_order = {} -- needed because pairs loops randomly through tables +local set_nodes = {} -- all the nodes needed for sets + +-- translation and local + +local S = core.get_translator("ambience") +local get_id = core.get_node_raw +local get_id_name = core.get_name_from_content_id +local get_node = core.get_node + +if get_id then get_node = function(pos) + + local id, p1, p2, pos_ok = get_id(pos.x, pos.y, pos.z) + + return {name = get_id_name(id), param1 = p1, param2 = p2, loaded = pos_ok} + end +end + +-- add set to list + +function ambience.add_set(set_name, def) + + if not set_name or not def then return end + + sound_sets[set_name] = { + frequency = def.frequency or 50, + background = def.background or {}, + sounds = def.sounds or {}, + sound_check = def.sound_check, + nodes = def.nodes + } + + -- add set name to the sound_set_order table + local can_add = true + + for i = 1, #sound_set_order do + + if sound_set_order[i] == set_name then can_add = false end + end + + if can_add then table.insert(sound_set_order, set_name) end + + -- add any missing nodes to the set_nodes table + if def.nodes then + + for i = 1, #def.nodes do + + can_add = def.nodes[i] + + for j = 1, #set_nodes do + + if def.nodes[i] == set_nodes[j] then can_add = false end + end + + if can_add then table.insert(set_nodes, can_add) end + end + end +end + +-- add sound to existing set + +function ambience.add_to_set(set_name, def) + + if not set_name or not def or not sound_sets[set_name] then return end + + table.insert(sound_sets[set_name].sounds, def) +end + +-- return set from list using name + +function ambience.get_set(set_name) + return sound_sets[set_name] +end + +-- remove set from list + +function ambience.del_set(set_name) + + sound_sets[set_name] = nil + + local can_del = false + + for i = 1, #sound_set_order do + + if sound_set_order[i] == set_name then can_del = i end + end + + if can_del then table.remove(sound_set_order, can_del) end +end + +-- return node total belonging to a specific group: + +function ambience.group_total(ntab, ngrp) + + local tot = 0 + local def, grp + + for _,n in pairs(ntab) do + + def = core.registered_nodes[_] + grp = def and def.groups and def.groups[ngrp] + + if grp and grp > 0 then + tot = tot + n + end + end + + return tot +end + +-- setup table when player joins + +core.register_on_joinplayer(function(player) + + if player then + + local name = player:get_player_name() + local meta = player:get_meta() + + playing[name] = { + mvol = tonumber(meta:get_string("ambience.mvol")) or MUSICVOLUME, + svol = tonumber(meta:get_string("ambience.svol")) or SOUNDVOLUME, + timer = 0, music = 0, music_handler = nil, set = "nil" + } + end +end) + +-- remove table when player leaves + +core.register_on_leaveplayer(function(player) + if player then playing[player:get_player_name()] = nil end +end) + +-- plays music and selects sound set + +local function get_ambience(player, tod, name) + + local p = playing[name] + + -- if enabled, play local/server music on interval check + if MUSICINTERVAL > 0 and p and p.mvol > 0 then + + -- increase music time interval + p.music = p.music + 1 + + -- if not already playing, play music on interval check + if p.music > MUSICINTERVAL and not p.music_handler then + + p.music_handler = core.sound_play("ambience_music", + {to_player = name, gain = p.mvol}) + + p.music = 0 -- reset interval + + -- after 5 minutes (a normal song length) reset music timers + elseif p.music_handler and p.music > 300 then + + p.music = 0 ; p.music_handler = nil +--print("--- resetting music timers") + end +--print("-- music timer", playing[name].music .. "/" .. MUSICINTERVAL) + end + + -- get foot and head level nodes at player position + local pos = player:get_pos() ; if not pos then return end + local eyeh = player:get_properties().eye_height or 1.47 -- eye level with fallback + local nod_head = get_node({x = pos.x, y = pos.y + eyeh, z = pos.z}).name + local nod_feet = get_node({x = pos.x, y = pos.y + 0.2, z = pos.z}).name + + -- get all set nodes around player + local ps, cn = core.find_nodes_in_area( + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) + + -- get biome data + local bdata = core.get_biome_data(pos) + local biome = bdata and core.get_biome_name(bdata.biome) or "" + + -- loop through sets in order and choose first that meets conditions set + for n = 1, #sound_set_order do + + local set = sound_sets[ sound_set_order[n] ] + + if set and set.sound_check then + + -- pass settings to set function for condition check + local set_name, gain = set.sound_check({ + player = player, + pos = pos, + tod = tod, + totals = cn, + positions = ps, + head_node = nod_head, + feet_node = nod_feet, + biome = biome + }) + + -- if conditions met return set name and gain value + if set_name then return set_name, gain end + end + end + + return nil, nil +end + +-- players routine + +local timer = 0 +local random = math.random + +core.register_globalstep(function(dtime) + + local players = core.get_connected_players() + local pname + + -- reduce sound timer for each player and stop/reset when needed + for _, player in pairs(players) do + + pname = player:get_player_name() + + local p = playing[pname] + + if p and p.timer and p.timer > 0 then + + p.timer = p.timer - dtime + + if p.timer <= 0 then + + if p.handler then + core.sound_stop(p.handler) + end + + p.set = nil ; p.gain = nil ; p.handler = nil + end + end + end + + -- one second timer + timer = timer + dtime ; if timer < 1 then return end ; timer = 0 + + local tod = core.get_timeofday() + + -- loop through players + for _, player in pairs(players) do + + pname = player:get_player_name() + + local p = playing[pname] + local set_name, MORE_GAIN = get_ambience(player, tod, pname) + local set_def = sound_sets[set_name] + local ok = p and true -- everything starts off ok if player found + + -- are we playing any available background sounds? + if ok and not p.bg and set_def and #set_def.background > 0 then + + -- choose a random sound from the background set + local bg_num = random(#set_def.background) + local bg_amb = set_def.background[bg_num] + + -- only play sound if set differs from last one played + if set_name ~= p.bg_set then + + p.bg = core.sound_play(bg_amb.name, { + to_player = pname, + gain = (bg_amb.gain or 0.3) * p.svol, + pitch = bg_amb.pitch, fade = bg_amb.fade, loop = true + }) + +--print("-- bg start", p.bg, set_name) + + p.bg_set = set_name + end + + elseif ok and p.bg and set_name ~= p.bg_set then + +--print("-- bg stop", p.bg, set_name, p.bg_set) + + core.sound_stop(p.bg) + + p.bg = nil ; p.bg_set = nil + end + + if ok and p.handler then -- are we playing something already? + + -- stop current sound if another set active or gain changed + if p.set ~= set_name or p.gain ~= MORE_GAIN then + +--print ("-- change stop", set_name, p.handler) + + core.sound_stop(p.handler) + + p.set = nil ; p.gain = nil ; p.handler = nil ; p.timer = 0 + else + ok = false -- sound set still playing, skip new sound + end + end + + local chance = random(1000) + + -- if chance is lower than set frequency then use set + if ok and set_name and chance < set_def.frequency + and set_def.sounds and #set_def.sounds > 0 then + + local amb = set_def.sounds[random(#set_def.sounds)] -- choose random set + + -- selected sound chance of playing from a set + if random((amb.chance or 1)) == 1 then + + -- play sound + p.handler = core.sound_play(amb.name, { + to_player = pname, + gain = ((amb.gain or 0.3) + (MORE_GAIN or 0)) * p.svol, + pitch = amb.pitch or 1.0, fade = amb.fade + }, amb.ephemeral) + +--print ("playing... " .. amb.name .. " (" .. chance .. " < " +-- .. p.frequency .. ") @ ", MORE_GAIN, p.handler) + end + + -- save what player is currently listening to if handler found + if p.handler then + p.set = set_name ; p.gain = MORE_GAIN ; p.timer = (amb.length or 5) + end + end + end +end) + +-- sound volume command + +core.register_chatcommand("svol", { + params = S(""), + description = S("set sound volume (0.1 to 1.0)"), + privs = {}, + + func = function(name, param) + + local svol = tonumber(param) or playing[name].svol + + if svol < 0.1 then svol = 0.1 end + if svol > 1.0 then svol = 1.0 end + + local player = core.get_player_by_name(name) + local meta = player:get_meta() + + meta:set_string("ambience.svol", svol) + + playing[name].svol = svol + + return true, S("Sound volume set to @1", svol) + end +}) + +-- music volume command (0 stops music) + +core.register_chatcommand("mvol", { + params = S(""), + description = S("set music volume (0.1 to 1.0, 0 to stop music)"), + privs = {}, + + func = function(name, param) + + local mvol = tonumber(param) or playing[name].mvol + + -- stop music currently playing by setting volume to 0 + if mvol == 0 and playing[name].music_handler then + + core.sound_stop(playing[name].music_handler) + + playing[name].music_handler = nil + + core.chat_send_player(name, S("Music stopped!")) + end + + if mvol < 0 then mvol = 0 end + if mvol > 1.0 then mvol = 1.0 end + + local player = core.get_player_by_name(name) + local meta = player:get_meta() + + meta:set_string("ambience.mvol", mvol) + + playing[name].mvol = mvol + + return true, S("Music volume set to @1", mvol) + end +}) + +-- load default sound sets + +dofile(core.get_modpath("ambience") .. "/soundsets.lua") + + +print("[MOD] Ambience Lite loaded") diff --git a/mods/ambience/license.txt b/mods/ambience/license.txt new file mode 100644 index 0000000..d8e00cd --- /dev/null +++ b/mods/ambience/license.txt @@ -0,0 +1,95 @@ +The MIT License (MIT) + +Copyright (c) 2022 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Sound licenses: + +--Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html + +--Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html + +--Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html + +--Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html + +--Bats In Cave Sound, License: CC0 | Recorded by SaloSensei , https://freesound.org/people/SaloSensei/sounds/616219/ + +--Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html + +-- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html + +--HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ + +--drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 + +--best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird, http://soundbible.com/1515-Best-Cardinal-Bird.html + +--birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/ (end) + +--robin2: Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/ (end) + +--Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ + +--bluejay.wav, Creative Commons 0 License, UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ + +--scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ + +--dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ + +ComboWind uses: +--wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ +--drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ + +--Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html + +--small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ + +--Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ + +--earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 + +--fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ + +--seagull, Attribution 3.0 License., hazure, http://www.freesound.org/people/hazure/sounds/23707/, + +--seagull_2, DonnyDB -- https://freesound.org/s/765399/ -- License: Attribution NonCommercial 4.0 +desert: +coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ +http://www.freesound.org/people/Proxima4/sounds/104319/ +Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ +Rattlesnake Rattle, Public Domain, fws.gov, http://soundbible.com/237-Rattlesnake-Rattle.html + +flying: +crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ + +desert wind: +Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ + +http://www.freesfx.co.uk/soundeffects/forests-jungles/ + +icecrack.ogg by ecfike, Creative Commons 0 license (https://freesound.org/people/ecfike/sounds/177212/) + +big_splash.ogg by gubodup, Creative Commons 0 License (https://freesound.org/people/qubodup/sounds/442773/) + +wooden_frog, wooden frog e.WAV by ERH -- https://freesound.org/s/34512/ -- License: Attribution 4.0 + +screenshot.jpg created using https://www.textstudio.com/ image by swvrsy (cc0) diff --git a/mods/ambience/locale/ambience.eo.tr b/mods/ambience/locale/ambience.eo.tr new file mode 100644 index 0000000..7bf35f4 --- /dev/null +++ b/mods/ambience/locale/ambience.eo.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=agordi sonlaŭtecon (0.1 ĝis 1.0) +Sound volume set to @1=Sonlaŭteco agordita al @1 += +set music volume (0.1 to 1.0, 0 to stop music)=agordi muziklaŭtecon (0.1 ĝis 1.0; malŝalti muzikon per 0) +Music volume set to @1=Muziklaŭteco agordita al @1 diff --git a/mods/ambience/locale/ambience.es.tr b/mods/ambience/locale/ambience.es.tr new file mode 100644 index 0000000..d31fc47 --- /dev/null +++ b/mods/ambience/locale/ambience.es.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=establecer volumen de sonido (0.1 a 1.0) +Sound volume set to @1=Volumen de sonido establecido a @1 += +set music volume (0.1 to 1.0, 0 to stop music)=establecer volumen de música (0.1 a 1.0, 0 para detener la música) +Music volume set to @1=Volumen de música establecido a @1 diff --git a/mods/ambience/locale/ambience.pl.tr b/mods/ambience/locale/ambience.pl.tr new file mode 100644 index 0000000..28674e0 --- /dev/null +++ b/mods/ambience/locale/ambience.pl.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=ustaw głośność dźwięku (0.1 do 1.0) +Sound volume set to @1=Głośność dźwięku ustawiona na @1 += +set music volume (0.1 to 1.0, 0 to stop music)=ustaw głośność muzyki (0.1 do 1.0, 0 aby zatrzymać muzykę) +Music volume set to @1=Głośność muzyki ustawiona na @1 diff --git a/mods/ambience/locale/template.txt b/mods/ambience/locale/template.txt new file mode 100644 index 0000000..5016ce5 --- /dev/null +++ b/mods/ambience/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)= +Sound volume set to @1= += +set music volume (0.1 to 1.0, 0 to stop music)= +Music volume set to @1= diff --git a/mods/ambience/mod.conf b/mods/ambience/mod.conf new file mode 100644 index 0000000..43c57ea --- /dev/null +++ b/mods/ambience/mod.conf @@ -0,0 +1,4 @@ +name = ambience +description = Adds realistic sound effects into your world. +optional_depends = default, mcl_core, mclx_core +min_minetest_version = 5.0 diff --git a/mods/ambience/screenshot.jpg b/mods/ambience/screenshot.jpg new file mode 100644 index 0000000..b75dd70 Binary files /dev/null and b/mods/ambience/screenshot.jpg differ diff --git a/mods/ambience/settingtypes.txt b/mods/ambience/settingtypes.txt new file mode 100644 index 0000000..6159713 --- /dev/null +++ b/mods/ambience/settingtypes.txt @@ -0,0 +1,5 @@ +ambience_music_interval (Ambience music interval [0 to disable]) int 1200 + +ambience_water_move (Ambience water movement) bool true + +ambience_water_splash (Big splash when jumping in water) bool false diff --git a/mods/ambience/sounds/bats.ogg b/mods/ambience/sounds/bats.ogg new file mode 100644 index 0000000..a4f4839 Binary files /dev/null and b/mods/ambience/sounds/bats.ogg differ diff --git a/mods/ambience/sounds/beach.ogg b/mods/ambience/sounds/beach.ogg new file mode 100644 index 0000000..1ff928e Binary files /dev/null and b/mods/ambience/sounds/beach.ogg differ diff --git a/mods/ambience/sounds/big_splash.ogg b/mods/ambience/sounds/big_splash.ogg new file mode 100644 index 0000000..f56e5cd Binary files /dev/null and b/mods/ambience/sounds/big_splash.ogg differ diff --git a/mods/ambience/sounds/bird1.ogg b/mods/ambience/sounds/bird1.ogg new file mode 100644 index 0000000..71456c4 Binary files /dev/null and b/mods/ambience/sounds/bird1.ogg differ diff --git a/mods/ambience/sounds/bird2.ogg b/mods/ambience/sounds/bird2.ogg new file mode 100644 index 0000000..2f2ba5c Binary files /dev/null and b/mods/ambience/sounds/bird2.ogg differ diff --git a/mods/ambience/sounds/bluejay.ogg b/mods/ambience/sounds/bluejay.ogg new file mode 100644 index 0000000..85f1314 Binary files /dev/null and b/mods/ambience/sounds/bluejay.ogg differ diff --git a/mods/ambience/sounds/canadianloon2.ogg b/mods/ambience/sounds/canadianloon2.ogg new file mode 100644 index 0000000..669c1b1 Binary files /dev/null and b/mods/ambience/sounds/canadianloon2.ogg differ diff --git a/mods/ambience/sounds/cardinal.ogg b/mods/ambience/sounds/cardinal.ogg new file mode 100644 index 0000000..3fcaff9 Binary files /dev/null and b/mods/ambience/sounds/cardinal.ogg differ diff --git a/mods/ambience/sounds/caverealms_crystal.ogg b/mods/ambience/sounds/caverealms_crystal.ogg new file mode 100644 index 0000000..e23abfc Binary files /dev/null and b/mods/ambience/sounds/caverealms_crystal.ogg differ diff --git a/mods/ambience/sounds/caverealms_deep_whoosh.ogg b/mods/ambience/sounds/caverealms_deep_whoosh.ogg new file mode 100644 index 0000000..c1fcbec Binary files /dev/null and b/mods/ambience/sounds/caverealms_deep_whoosh.ogg differ diff --git a/mods/ambience/sounds/coyote.ogg b/mods/ambience/sounds/coyote.ogg new file mode 100644 index 0000000..db9f692 Binary files /dev/null and b/mods/ambience/sounds/coyote.ogg differ diff --git a/mods/ambience/sounds/craw.ogg b/mods/ambience/sounds/craw.ogg new file mode 100644 index 0000000..65d4e89 Binary files /dev/null and b/mods/ambience/sounds/craw.ogg differ diff --git a/mods/ambience/sounds/crestedlark.ogg b/mods/ambience/sounds/crestedlark.ogg new file mode 100644 index 0000000..e3f08d6 Binary files /dev/null and b/mods/ambience/sounds/crestedlark.ogg differ diff --git a/mods/ambience/sounds/cricket.ogg b/mods/ambience/sounds/cricket.ogg new file mode 100644 index 0000000..5fd4938 Binary files /dev/null and b/mods/ambience/sounds/cricket.ogg differ diff --git a/mods/ambience/sounds/deer.ogg b/mods/ambience/sounds/deer.ogg new file mode 100644 index 0000000..e98cfd2 Binary files /dev/null and b/mods/ambience/sounds/deer.ogg differ diff --git a/mods/ambience/sounds/desertwind.ogg b/mods/ambience/sounds/desertwind.ogg new file mode 100644 index 0000000..854c65b Binary files /dev/null and b/mods/ambience/sounds/desertwind.ogg differ diff --git a/mods/ambience/sounds/drippingwater1.ogg b/mods/ambience/sounds/drippingwater1.ogg new file mode 100644 index 0000000..85d26d8 Binary files /dev/null and b/mods/ambience/sounds/drippingwater1.ogg differ diff --git a/mods/ambience/sounds/drippingwater2.ogg b/mods/ambience/sounds/drippingwater2.ogg new file mode 100644 index 0000000..16690f5 Binary files /dev/null and b/mods/ambience/sounds/drippingwater2.ogg differ diff --git a/mods/ambience/sounds/frog.ogg b/mods/ambience/sounds/frog.ogg new file mode 100644 index 0000000..3786434 Binary files /dev/null and b/mods/ambience/sounds/frog.ogg differ diff --git a/mods/ambience/sounds/gull.ogg b/mods/ambience/sounds/gull.ogg new file mode 100644 index 0000000..a5108b9 Binary files /dev/null and b/mods/ambience/sounds/gull.ogg differ diff --git a/mods/ambience/sounds/hornedowl.ogg b/mods/ambience/sounds/hornedowl.ogg new file mode 100644 index 0000000..d0647ed Binary files /dev/null and b/mods/ambience/sounds/hornedowl.ogg differ diff --git a/mods/ambience/sounds/icecrack.ogg b/mods/ambience/sounds/icecrack.ogg new file mode 100644 index 0000000..7b5470e Binary files /dev/null and b/mods/ambience/sounds/icecrack.ogg differ diff --git a/mods/ambience/sounds/jungle_day_1.ogg b/mods/ambience/sounds/jungle_day_1.ogg new file mode 100644 index 0000000..d24d0f4 Binary files /dev/null and b/mods/ambience/sounds/jungle_day_1.ogg differ diff --git a/mods/ambience/sounds/jungle_night_1.ogg b/mods/ambience/sounds/jungle_night_1.ogg new file mode 100644 index 0000000..c6af876 Binary files /dev/null and b/mods/ambience/sounds/jungle_night_1.ogg differ diff --git a/mods/ambience/sounds/jungle_night_2.ogg b/mods/ambience/sounds/jungle_night_2.ogg new file mode 100644 index 0000000..b678c1b Binary files /dev/null and b/mods/ambience/sounds/jungle_night_2.ogg differ diff --git a/mods/ambience/sounds/lava.ogg b/mods/ambience/sounds/lava.ogg new file mode 100644 index 0000000..eec58c9 Binary files /dev/null and b/mods/ambience/sounds/lava.ogg differ diff --git a/mods/ambience/sounds/license.txt b/mods/ambience/sounds/license.txt new file mode 100644 index 0000000..6dbdc6e --- /dev/null +++ b/mods/ambience/sounds/license.txt @@ -0,0 +1,5 @@ +Royalty-Free to Use (https://pixabay.com/sound-effects/film-special-effects-0005-crystal-lamp-with-swing-front-107459/) + caverealms_crystal.ogg + +Royalty Free to Use (https://pixabay.com/sound-effects/film-special-effects-deep-whoosh-bass-impact-effect-04-407108/) + caverealms_deep_whoosh.ogg diff --git a/mods/ambience/sounds/peacock.ogg b/mods/ambience/sounds/peacock.ogg new file mode 100644 index 0000000..7e132e0 Binary files /dev/null and b/mods/ambience/sounds/peacock.ogg differ diff --git a/mods/ambience/sounds/river.ogg b/mods/ambience/sounds/river.ogg new file mode 100644 index 0000000..6af629a Binary files /dev/null and b/mods/ambience/sounds/river.ogg differ diff --git a/mods/ambience/sounds/robin.ogg b/mods/ambience/sounds/robin.ogg new file mode 100644 index 0000000..0f7729c Binary files /dev/null and b/mods/ambience/sounds/robin.ogg differ diff --git a/mods/ambience/sounds/scuba.ogg b/mods/ambience/sounds/scuba.ogg new file mode 100644 index 0000000..cbff3f8 Binary files /dev/null and b/mods/ambience/sounds/scuba.ogg differ diff --git a/mods/ambience/sounds/seagull.ogg b/mods/ambience/sounds/seagull.ogg new file mode 100644 index 0000000..01968e9 Binary files /dev/null and b/mods/ambience/sounds/seagull.ogg differ diff --git a/mods/ambience/sounds/seagull_2.ogg b/mods/ambience/sounds/seagull_2.ogg new file mode 100644 index 0000000..39ed6cc Binary files /dev/null and b/mods/ambience/sounds/seagull_2.ogg differ diff --git a/mods/ambience/sounds/waterfall.ogg b/mods/ambience/sounds/waterfall.ogg new file mode 100644 index 0000000..bc1e755 Binary files /dev/null and b/mods/ambience/sounds/waterfall.ogg differ diff --git a/mods/ambience/sounds/wind.ogg b/mods/ambience/sounds/wind.ogg new file mode 100644 index 0000000..db514c4 Binary files /dev/null and b/mods/ambience/sounds/wind.ogg differ diff --git a/mods/ambience/sounds/wolves.ogg b/mods/ambience/sounds/wolves.ogg new file mode 100644 index 0000000..1c5a1b8 Binary files /dev/null and b/mods/ambience/sounds/wolves.ogg differ diff --git a/mods/ambience/sounds/wooden_frog.ogg b/mods/ambience/sounds/wooden_frog.ogg new file mode 100644 index 0000000..52a78be Binary files /dev/null and b/mods/ambience/sounds/wooden_frog.ogg differ diff --git a/mods/ambience/soundsets.lua b/mods/ambience/soundsets.lua new file mode 100644 index 0000000..bc0b7b3 --- /dev/null +++ b/mods/ambience/soundsets.lua @@ -0,0 +1,510 @@ +--[[ + Default Sound Sets + ------------------ + + Order is very important when adding a sound set so it will play + certain sound sets before any another. +--]] + +-- mod support + +local mod_def = core.get_modpath("default") +local mod_mcl = core.get_modpath("mcl_core") + +-- Big Splash jumping in water + +if core.settings:get_bool("ambience_water_splash") == true then + + local players = {} + + core.register_on_joinplayer(function(player) + players[player:get_player_name()] = {in_water = nil, old_pos = -31000} + end) + + core.register_on_leaveplayer(function(player) + players[player:get_player_name()] = nil + end) + + ambience.add_set("big_splash", { + + frequency = 1000, + + sounds = { + {name = "big_splash", gain = 0.3, length = 4, ephemeral = true}, + {name = "big_splash", gain = 0.3, length = 4, ephemeral = true, pitch = 0.9}, + {name = "big_splash", gain = 0.3, length = 4, ephemeral = true, pitch = 1.1} + }, + + sound_check = function(def) + + local hdef = core.registered_nodes[def.head_node] + local fdef = core.registered_nodes[def.feet_node] + local name = def.player:get_player_name() + + if hdef and hdef.groups.water and fdef and fdef.groups.water then + + local diff = players[name].old_pos - def.pos.y + + if not players[name].in_water and diff > 1 then + + players[name].in_water = 2 + + return "big_splash" + end + + players[name].in_water = 2 + else + if fdef and fdef.groups.water then + players[name].in_water = 1 + else + players[name].in_water = nil + end + end + + players[name].old_pos = def.pos.y + end + }) +end + +-- Underwater sounds play when player head is submerged + +ambience.add_set("underwater", { + + frequency = 1000, + +-- This is an example of how it could be used as a background sound also +-- background = { +-- {name = "scuba", length = 8}, +-- {name = "scuba", pitch = 1.2, length = 8} +-- }, + + sounds = { + {name = "scuba", length = 8, loop = true} + }, + + sound_check = function(def) + + local nodef = core.registered_nodes[def.head_node] + + if nodef and nodef.groups.water then + return "underwater" + end + end +}) + +-- add new sound to above set + +ambience.add_to_set("underwater", {name = "scuba", pitch = 1.2, length = 8, loop = true}) + +-- Splashing sound plays when player walks inside water nodes (if enabled) + +if core.settings:get_bool("ambience_water_move") ~= false then + + -- override default water sounds + + if mod_def then + core.override_item("default:water_source", { sounds = {} }) + core.override_item("default:water_flowing", { sounds = {} }) + core.override_item("default:river_water_source", { sounds = {} }) + core.override_item("default:river_water_flowing", { sounds = {} }) + elseif mod_mcl then + core.override_item("mcl_core:water_source", { sounds = {} }) + core.override_item("mcl_core:water_flowing", { sounds = {} }) + core.override_item("mclx_core:river_water_source", { sounds = {} }) + core.override_item("mclx_core:river_water_flowing", { sounds = {} }) + end + + ambience.add_set("splash", { + + frequency = 1000, + + sounds = { + {name = "default_water_footstep", length = 2} + }, + + sound_check = function(def) + + local nodef = core.registered_nodes[def.feet_node] + + if nodef and nodef.groups.water then + + local control = def.player:get_player_control() + + if control.up or control.down or control.left or control.right then + return "splash" + end + end + end + }) +end + +-- check for env_sounds mod, if not found enable water flowing and lava sounds +if not core.get_modpath("env_sounds") then + + -- Water sound plays when near flowing water + + ambience.add_set("flowing_water", { + + frequency = 1000, + + sounds = { + {name = "waterfall", length = 6} + }, + + nodes = {"group:water"}, + + sound_check = function(def) + + local c = (def.totals["default:water_flowing"] or 0) + + (def.totals["mcl_core:water_flowing"] or 0) + + if c > 40 then return "flowing_water", 0.5 + + elseif c > 5 then return "flowing_water" end + end + }) + + -- River sound plays when near flowing river + + ambience.add_set("river", { + + frequency = 1000, + + sounds = { + {name = "river", length = 4, gain = 0.1} + }, + + sound_check = function(def) + + local c = (def.totals["default:river_water_flowing"] or 0) + + (def.totals["mclx_core:river_water_flowing"] or 0) + + if c > 20 then return "river", 0.5 + + elseif c > 5 then return "river" end + end + }) + + -- Lava sound plays when near lava + + ambience.add_set("lava", { + + frequency = 1000, + + sounds = { + {name = "lava", length = 7} + }, + + nodes = {"group:lava"}, + + sound_check = function(def) + + local c = (def.totals["default:lava_source"] or 0) + + (def.totals["default:lava_flowing"] or 0) + + (def.totals["mcl_core:lava_source"] or 0) + + (def.totals["mcl_core:lava_flowing"] or 0) + + if c > 20 then return "lava", 0.5 + + elseif c > 5 then return "lava" end + end + }) +else + print ("[MOD] Ambience - Using env_sounds for water and lava sounds.") +end + +-- Beach sounds play when pos above 0 and below 6 and 100+ water source found + +ambience.add_set("beach", { + + frequency = 40, + + background = { + {name = "beach", length = 13}, + }, + + sounds = { + {name = "seagull", length = 4.5, ephemeral = true, chance = 2}, + {name = "seagull", length = 4.5, pitch = 1.2, ephemeral = true, chance = 2}, + --{name = "beach", length = 13}, + {name = "gull", length = 1, ephemeral = true, chance = 2}, + {name = "seagull_2", length = 4, ephemeral = true, chance = 2} + }, + + nodes = {"group:water"}, + + sound_check = function(def) + + local c = (def.totals["default:water_source"] or 0) + + (def.totals["mcl_core:water_source"] or 0) + + if def.pos.y > 0 and def.pos.y < 6 and c > 100 then + return "beach" + end + end +}) + +-- Ice sounds play when 100 or more ice are nearby + +ambience.add_set("ice", { + + frequency = 80, + + sounds = { + {name = "icecrack", length = 5, gain = 1.1}, + {name = "desertwind", length = 8}, + {name = "wind", length = 9} + }, + + nodes = (mod_mcl and {"mcl_core:ice", "mcl_core:packed_ice"} or {"default:ice"}), + + sound_check = function(def) + + local c = (def.totals["default:ice"] or 0) + +(def.totals["mcl_core:ice"] or 0) + + (def.totals["mcl_core:packed_ice"] or 0) + + if c > 400 then return "ice" end + end +}) + +-- Desert sounds play when near 150+ desert or normal sand + +ambience.add_set("desert", { + + frequency = 20, + + sounds = { + {name = "coyote", length = 2.5, ephemeral = true}, + {name = "wind", length = 9}, + {name = "desertwind", length = 8} + }, + + nodes = { + (mod_mcl and "mcl_core:redsand" or "default:desert_sand"), + (mod_mcl and "mcl_core:sand" or "default:sand") + }, + + sound_check = function(def) + + local c = (def.totals["default:desert_sand"] or 0) + + (def.totals["default:sand"] or 0) + + (def.totals["mcl_core:sand"] or 0) + + (def.totals["mcl_core:redsand"] or 0) + + if c > 150 and def.pos.y > 10 then return "desert" end + end +}) + +-- Cave sounds play when below player position Y -25 and water nearby + +ambience.add_set("cave", { + + frequency = 60, + + sounds = { + {name = "drippingwater1", length = 1.5, ephemeral = true}, + {name = "drippingwater2", length = 1.5, ephemeral = true}, + {name = "drippingwater2", length = 1.5, pitch = 1.2, ephemeral = true}, + {name = "drippingwater2", length = 1.5, pitch = 1.4, ephemeral = true}, + {name = "bats", length = 5, ephemeral = true} + }, + + sound_check = function(def) + + local c = (def.totals["default:water_source"] or 0) + + (def.totals["mcl_core:water_source"] or 0) + + if c > 0 and def.pos.y < -25 then return "cave" end + end +}) + +-- Jungle sounds play during day and when around 90 jungletree trunks + +ambience.add_set("jungle", { + + frequency = 200, + + sounds = { + {name = "jungle_day_1", length = 7}, + {name = "deer", length = 7, ephemeral = true}, + {name = "canadianloon2", length = 14}, + {name = "bird1", length = 11}, + {name = "peacock", length = 2, ephemeral = true}, + {name = "peacock", length = 2, pitch = 1.2, ephemeral = true}, + {name = "wooden_frog", length = 2, gain = 0.2, ephemeral = true} + }, + + nodes = {(mod_mcl and "mcl_trees:tree_jungle" or "default:jungletree")}, + + sound_check = function(def) + + local c = (def.totals["default:jungletree"] or 0) + + (def.totals["mcl_trees:tree_jungle"] or 0) + + if def.tod > 0.2 and def.tod < 0.8 and c > 79 then return "jungle" end + end +}) + +-- Jungle sounds play during night and when around 90 jungletree trunks + +ambience.add_set("jungle_night", { + + frequency = 200, + + sounds = { + {name = "jungle_night_1", length = 4, ephemeral = true}, + {name = "jungle_night_2", length = 4, ephemeral = true}, + {name = "deer", length = 7, ephemeral = true}, + {name = "frog", length = 1, ephemeral = true}, + {name = "frog", length = 1, pitch = 1.3, ephemeral = true}, + {name = "wooden_frog", length = 2, gain = 0.2, ephemeral = true} + }, + + sound_check = function(def) + + -- jungle tree was added in last set, so doesnt need to be added in this one + local c = (def.totals["default:jungletree"] or 0) + + (def.totals["mcl_trees:tree_jungle"] or 0) + + if (def.tod < 0.2 or def.tod > 0.8) and c > 79 then return "jungle_night" end + end +}) + +-- Daytime sounds play during day when around leaves and above ground + +ambience.add_set("day", { + + frequency = 40, + + sounds = { + {name = "cardinal", length = 3, ephemeral = true}, + {name = "craw", length = 3, ephemeral = true}, + {name = "bluejay", length = 6, ephemeral = true}, + {name = "robin", length = 4, ephemeral = true}, + {name = "robin", length = 4, pitch = 1.2, ephemeral = true}, + {name = "bird1", length = 11}, + {name = "bird2", length = 6, ephemeral = true}, + {name = "crestedlark", length = 6, ephemeral = true}, + {name = "crestedlark", length = 6, pitch = 1.1, ephemeral = true}, + {name = "peacock", length = 2, ephemeral = true}, + {name = "peacock", length = 2, pitch = 1.2, ephemeral = true}, + {name = "wind", length = 9} + }, + + nodes = {"group:leaves"}, + + sound_check = function(def) + + -- use handy function to count all nodes in group:leaves + local c = ambience.group_total(def.totals, "leaves") + + if (def.tod > 0.2 and def.tod < 0.8) and def.pos.y > 0 and c > 50 then + return "day" + end + end +}) + +-- Nighttime sounds play at night when above ground near leaves + +ambience.add_set("night", { + + frequency = 40, + + sounds = { + {name = "hornedowl", length = 2, ephemeral = true}, + {name = "hornedowl", length = 2, pitch = 1.1, ephemeral = true}, + {name = "wolves", length = 4, gain = 0.4, ephemeral = true}, + {name = "cricket", length = 6, ephemeral = true}, + {name = "deer", length = 7, ephemeral = true}, + {name = "frog", length = 1, ephemeral = true}, + {name = "frog", length = 1, pitch = 1.2, ephemeral = true}, + {name = "wind", length = 9} + }, + + sound_check = function(def) + + -- use handy function to count all nodes in group:leaves + local c = ambience.group_total(def.totals, "leaves") + + if (def.tod < 0.2 or def.tod > 0.8) and def.pos.y > 0 and c > 50 then + return "night" + end + end +}) + +-- Winds play when player is above 50 y-pos or near 150+ snow blocks + +ambience.add_set("high_up", { + + frequency = 40, + + sounds = { + {name = "desertwind", length = 8}, + {name = "desertwind", length = 8, pitch = 1.3}, + {name = "wind", length = 9}, + {name = "wind", length = 9, pitch = 1.4} + }, + + nodes = {(mod_mcl and "mcl_core:snowblock" or "default:snowblock")}, + + sound_check = function(def) + + local c = (def.totals["default:snowblock"] or 0) + + (def.totals["mcl_core:snowblock"] or 0) + + if def.pos.y > 50 or c > 100 then return "high_up" end + end +}) + +-- caverealms sounds + +if core.get_modpath("caverealms") then + + -- salt crystal biome + + ambience.add_set("caverealms_crystal", { + + frequency = 50, + + sounds = { + {name = "caverealms_crystal", length = 3, ephemeral = true}, + {name = "caverealms_crystal", length = 3, pitch = 0.9, ephemeral = true}, + {name = "caverealms_crystal", length = 3, pitch = 1.2, ephemeral = true}, + }, + + nodes = ({"caverealms:stone_with_salt"}), + + sound_check = function(def) + + local c = (def.totals["caverealms:stone_with_salt"] or 0) + + if c > 250 then return "caverealms_crystal" end + end + }) + + -- moss, algae, lichen area rumble + + ambience.add_set("caverealms_rumble", { + + frequency = 50, + + sounds = { + {name = "caverealms_deep_whoosh", length = 3, ephemeral = true}, + {name = "caverealms_deep_whoosh", length = 3, pitch = 0.6, ephemeral = true}, + {name = "caverealms_deep_whoosh", length = 3, pitch = 0.8, ephemeral = true}, + }, + + nodes = ({"caverealms:stone_with_moss", "caverealms:stone_with_algae", + "caverealms:stone_with_lichen"}), + + sound_check = function(def) + + local c = (def.totals["caverealms:stone_with_moss"] or 0) + + (def.totals["caverealms:stone_with_algae"] or 0) + + (def.totals["caverealms:stone_with_lichen"] or 0) + + if def.pos.y < -50 and c > 150 then return "caverealms_rumble" end + end + }) +end diff --git a/mods/biome_lib/.github/workflows/luacheck.yml b/mods/biome_lib/.github/workflows/luacheck.yml new file mode 100644 index 0000000..3c99a99 --- /dev/null +++ b/mods/biome_lib/.github/workflows/luacheck.yml @@ -0,0 +1,10 @@ +name: luacheck +on: [push, pull_request] +jobs: + luacheck: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + - name: Luacheck + uses: lunarmodules/luacheck@master diff --git a/mods/biome_lib/.luacheckrc b/mods/biome_lib/.luacheckrc new file mode 100644 index 0000000..827b26b --- /dev/null +++ b/mods/biome_lib/.luacheckrc @@ -0,0 +1,18 @@ +unused_args = false + +globals = { + "biome_lib" +} + +read_globals = { + -- Stdlib + string = {fields = {"split", "trim"}}, + table = {fields = {"copy"}}, + + -- Minetest + "minetest", "vector", + "dump", "PerlinNoise", + + -- mods + "default", +} diff --git a/mods/biome_lib/API.txt b/mods/biome_lib/API.txt new file mode 100644 index 0000000..61c4532 --- /dev/null +++ b/mods/biome_lib/API.txt @@ -0,0 +1,665 @@ +This document describes the Plantlife mod API. + +Last revision: 2021-04-20 + + +========= +Functions +========= + +There are two main functions defined by this mod: + +biome_lib.register_active_spawner() +biome_lib.register_on_generate() + +There are also several internal, helper functions that can be called if so +desired, but they are not really intended for use by other mods and may change +at any time. They are briefly described below these main functions, but see +init.lua for details. + +Most functions in biome_lib are either declared locally or kept within its +own namespace to avoid collisions/conflicts with other mods. + +===== +biome_lib.register_active_spawner(biome) +biome_lib.register_active_spawner(sdelay, splant, sradius, schance, ssurface, savoid) + +This first function is an ABM-based spawner function originally created as +part of Ironzorg's flowers mod. It has since been largely extended and +expanded. There are two ways to call this function: You can either pass it +several individual string and number parameters to use the legacy interface, +or you can pass a single biome definition as a table, with all of your options +spelled out nicely. This is the preferred method. + +When used with the legacy interface, you must specify the parameters exactly +in order, with the first five being mandatory (even if some are set to nil), +and the last one being optional: + +sdelay: The value passed to the ABM's interval parameter, in seconds. +splant: The node name of the item to spawn (e.g. + "flowers:flower_rose"). A plant will of course only be + spawned if the node about to be replaced is air. +sradius: Don't spawn within this many nodes of the avoid items + mentioned below. If set to nil, this check is skipped. +schance: The value passed to the ABM's chance parameter, normally in + the 10-100 range (1-in-X chance of operating on a given node) +ssurface: String with the name of the node on which to spawn the plant + in question, such as "default:sand" or + "default:dirt_with_grass". It is not recommended to put air, + stone, or plain dirt here if you can use some other node, as + doing so will cause the engine to process potentially large + numbers of such nodes when deciding when to execute the ABM + and where it should operate. +savoid: Table with a list of groups and/or node names to avoid when + spawning the plant, such as {"group:flowers", "default:tree"}. + +When passed a table as the argument, and thus using the modern calling method, +you must pass a number of arguments in the form of an ordinary keyed-value +table. Below is a list of everything supported by this function: + +biome = { + spawn_plants = something, -- [*] String or table; see below. + spawn_delay = number, -- same as sdelay, above. + spawn_chance = number, -- same as schance, above. + spawn_surfaces = {table}, -- List of node names on which the plants + -- should be spawned. As with the single-node "ssurface" + -- option in the legacy API, you should not put stone, air, + -- etc. here. + + ---- From here down are a number of optional parameters. You will + ---- most likely want to use at least some of these to limit how and + ---- where your objects are spawned. + + label = string, -- set this to identify the ABM for Minetest's profiler + avoid_nodes = {table}, -- same meaning as savoid, above + avoid_radius = num, -- same as sradius + seed_diff = num, -- The Perlin seed difference value passed to the + -- minetest.get_perlin() function. Used along with + -- the global Perlin controls below to create the + -- "biome" in which the plants will spawn. Defaults + -- to 0 if not provided. + light_min = num, -- Minimum amount of light necessary to make a plant + -- spawn. Defaults to 0. + light_max = num, -- Maximum amount of light needed to spawn. Defaults + -- to the engine's MAX_LIGHT value of 14. + neighbors = {table}, -- List of neighboring nodes that need to be + -- immediately next to the node the plant is about to + -- spawn on. Can also be a string with a single node + -- name. It is both passed to the ABM as the + -- "neighbors" parameter, and is used to manually + -- check the adjacent nodes. It only takes one of + -- these for the spawn routine to mark the target as + -- spawnable. Defaults to nil (ignored). + ncount = num, -- There must be at least this many of the above + -- neighbors in the eight spaces immediately + -- surrounding the node the plant is about to spawn on + -- for it to happen. If not provided, this check is + -- disabled. + facedir = num, -- The value passed to the param2 variable when adding + -- the node to the map. Defaults to 0. Be sure that + -- the value you use here (and the range thereof) is + -- appropriate for the type of node you're spawning. + random_facedir = {table}, -- If set, the table should contain two values. + -- If they're both provided, the spawned plant will be + -- given a random facedir value in the range specified + -- by these two numbers. Overrides the facedir + -- parameter above, if it exists. Use {0,3} if you + -- want the full range for wallmounted nodes, or {2,5} + -- for most everything else, or any other pair of + -- numbers appropriate for the node you want to spawn. + depth_max = num, -- If the object spawns on top of a water source, the + -- water must be at most this deep. Defaults to 1. + min_elevation = num, -- Surface must be at this altitude or higher to + -- spawn at all. Defaults to -16 meters. + max_elevation = num, -- Surface must be no higher than this altitude. + -- Defaults to +48. + near_nodes = {table}, -- List of nodes that must be somewhere in the + -- vicinity in order for the plant to spawn. Can also + -- be a string with a single node name. If not + -- provided, this check is disabled. + near_nodes_size = num, -- How large of an area to check for the above + -- node. Specifically, this checks a flat, horizontal + -- area centered on the node to be spawned on. + -- Defaults to 0, but is ignored if the above + -- near_nodes value is not set. + near_nodes_vertical = num, -- Used with the size value above, this extends + -- the vertical range of the near nodes search. + -- Basically, this turns the flat region described + -- above into a cuboid region. The area to be checked + -- will extend this high and this low above/below the + -- target node, centered thereon. Defaults to 1 (only + -- check the layer above, the layer at, and the layer + -- below the target node), but is ignored if + -- near_nodes is not set. + near_nodes_count = num, -- How many of the above nodes must be within that + -- radius. Defaults to 1 but is ignored if near_nodes + -- isn't set. Bear in mind that the total area to be + -- checked is equal to: + -- (near_nodes_size^2)*near_nodes_vertical*2 + -- For example, if size is 10 and vertical is 4, then + -- the area is (10^2)*8 = 800 nodes in size, so you'll + -- want to make sure you specify a value appropriate + -- for the size of the area being tested. + air_size = num, -- How large of an area to check for air above and + -- around the target. If omitted, only the space + -- above the target is checked. This does not check + -- for air at the sides or below the target. + air_count = num, -- How many of the surrounding nodes need to be air + -- for the above check to return true. If omitted, + -- only the space above the target is checked. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Minimum temperature needed for the desired object + -- to spawn. This is a 2d Perlin value, which has an + -- inverted range of +1 to -1. Larger values + -- represent *colder* temperatures, so this value is + -- actually the upper end of the desired Perlin range. + -- See the temperature map section at the bottom of + -- this document for details on how these values work. + -- Defaults to +1 (unlimited coldness). + temp_max = num, -- Maximum temperature/lower end of the Perlin range. + -- Defaults to -1 (unlimited heat). + humidity_min = num, -- Minimum humidity for the plant to spawn in. Like + -- the temperature map, this is a Perlin value where + -- lower numbers mean more humidity in the area. + -- Defaults to +1 (0% humidity). + humidity_max = num, -- Maximum humidity for the plant to spawn at. + -- Defaults to -1 (100% humidity). + verticals_list = {table}, -- List of nodes that should be considered to be + -- natural walls. + alt_wallnode = "string", -- If specified, this node will be substituted in + -- place of the plant(s) defined by spawn_plants + -- above, if the spawn target has one or more adjacent + -- walls. In such a case, the two above facedir + -- parameters will be ignored. + spawn_on_side = bool, -- Set this to true to immediately spawn the node on + -- one side of the target node rather than the top. + -- The code will search for an airspace to the side of + -- the target, then spawn the plant at the first one + -- found. The above facedir and random_facedir + -- parameters are ignored in this case. If the above + -- parameters for selecting generic wall nodes are + -- provided, this option is ignored. Important note: + -- the facedir values assigned by this option only + -- make sense with wallmounted nodes (nodes which + -- don't use facedir won't be affected). + choose_random_wall = bool, -- if set to true, and searching for walls is + -- being done, just pick any random wall if there is + -- one, rather than returning the first one. + spawn_on_bottom = bool, -- If set to true, spawn the object below the + -- target node instead of above it. The above + -- spawn_on_side variable takes precedence over this + -- one if both happen to be true. When using this + -- option with the random facedir function above, the + -- values given to the facedir parameter are for + -- regular nodes, not wallmounted. + spawn_replace_node = bool, -- If set to true, the target node itself is + -- replaced by the spawned object. Overrides the + -- spawn_on_bottom and spawn_on_side settings. +} + +[*] spawn_plants must be either a table or a string. If it's a table, the +values therein are treated as a list of nodenames to pick from randomly on +each application of the ABM code. The more nodes you can pack into this +parameter to avoid making too many calls to this function, the lower the CPU +load will likely be. + +You can also specify a string containing the name of a function to execute. +In this case, the function will be passed a single position parameter +indicating where the function should place the desired object, and the checks +for spawning on top vs. sides vs. bottom vs. replacing the target node will be +skipped. + +By default, if a biome node, size, and count are not defined, the biome +checking is disabled. Same holds true for the nneighbors bit above that. + + +===== +biome_lib.register_on_generate(biome, nodes_or_function_or_treedef) + +To register an object to be spawned at mapgen time rather than via an ABM, +call this function with two parameters: a table with your object's biome +information, and a string, function, or table describing what to do if the +engine finds a suitable surface node (see below). + +The biome table contains quite a number of options, though there are fewer +here than are available in the ABM-based spawner, as some stuff doesn't make +sense at map-generation time. + +biome = { + surface = something, -- What node(s). May be a string such as + -- "default:dirt_with_grass" or a table with + -- multiple such entries. + + ---- Everything else is optional, but you'll definitely want to use + ---- some of these other fields to limit where and under what + ---- conditions the objects are spawned. + + below_nodes = {table}, -- List of nodes that must be below the target + -- node. Useful in snow biomes to keep objects from + -- spawning in snow that's on the wrong surface for + -- that object. + avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are + -- not supported here. + avoid_radius = num, -- How much distance to leave between the object to be + -- added and the objects to be avoided. If this or + -- the avoid_nodes value is nil/omitted, this check is + -- skipped. Avoid using excessively large radii. + rarity = num, -- How rare should this object be in its biome? Larger + -- values make objects more rare, via: + -- math.random() * 100 > this + rarity_fertility -- The amount that the rarity is reduced by fertility. + = num, -- This makes the rarity field the upper bound for + -- rarity, and (rarity - rarity_fertility) the lower + -- bound. Defaults to 0. + max_count = num, -- The absolute maximum number of your object that + -- should be allowed to spawn in a 5x5x5 mapblock area + -- (80x80x80 nodes). Defaults to 5, but be sure you + -- set this to some reasonable value depending on your + -- object and its size if 5 is insufficient. + tries = num, -- the number of attempts that will be made to spawn + -- an object, defaults to 2. This means if the first + -- attempt fails due to something blocking the object + -- for example, another attempt will be made in + -- another random location. + seed_diff = num, -- Perlin seed-diff value. Defaults to 0, which + -- causes the function to inherit the global value of + -- 329. + neighbors = {table}, -- What ground nodes must be right next to and at the + -- same elevation as the node to be spawned on. + ncount = num, -- At least this many of the above nodes must be next + -- to the node to spawn on. Any value greater than 8 + -- will probably cause the code to never spawn + -- anything. Defaults to 0. + depth = num, -- How deep/thick of a layer the spawned-on node must + -- be. Typically used for water. + min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to + -- -16 meters. + max_elevation = num, -- Max elevation. Defaults to +48m. + near_nodes = {table}, -- what nodes must be in the general vicinity of the + -- object being spawned. + near_nodes_size = num, -- how wide of a search area to look for the nodes + -- in that list. + near_nodes_vertical = num, -- How high/low of an area to search from the + -- target node. + near_nodes_count = num, -- at least this many of those nodes must be in + -- the area. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Coldest allowable temperature for a plant to spawn + -- (that is, the largest Perlin value). + temp_max = num, -- warmest allowable temperature to spawn a plant + -- (lowest Perlin value). + verticals_list = {table}, -- Same as with the spawn_on_surfaces function. + check_air = bool, -- Flag to tell the mapgen code to check for air above + -- the spawn target. Defaults to true if not + -- explicitly set to false. Set this to false VERY + -- SPARINGLY, as it will slow the map generator down. + delete_above = bool, -- Flag to tell the mapgen code to delete the two + -- nodes directly above the spawn target just before + -- adding the plant or tree. Useful when generating + -- in snow biomes. Defaults to false. + delete_above_surround = bool, -- Flag to tell the mapgen code to also + -- delete the five nodes surrounding the above space, + -- and the five nodes above those, resulting in a two- + -- node-deep cross-shaped empty region above/around + -- the spawn target. Useful when adding trees to snow + -- biomes. Defaults to false. + spawn_replace_node = bool, -- same as with the ABM spawner. + random_facedir = {table}, -- same as with the ABM spawner. +} + +Regarding nodes_or_function_or_treedef, this must either be a string naming +a node to spawn, a table with a list of nodes to choose from, a table with an +L-Systems tree definition, or a function. + +If you specified a string, the code will attempt to determine whether that +string specifies a valid node name. If it does, that node will be placed on +top of the target position directly (unless one of the other mapgen options +directs the code to do otherwise). + +If you specified a table and there is no "axiom" field, the code assumes that +it is a list of nodes. Simply name one node per entry in the list, e.g. +{"default:junglegrass", "default:dry_shrub"} and so on, for as many nodes as +you want to list. A random node from the list will be chosen each time the +code goes to place a node. + +If you specified a table, and there *is* an "axiom" field, the code assumes +that this table contains an L-Systems tree definition, which will be passed +directly to the engine's spawn_tree() function along with the position on +which to spawn the tree. + +You can also supply a function to be directly executed, which is given the +current node position (the usual "pos" table format) as its sole argument. It +will be called in the form: + + somefunction(pos) + +===== +biome_lib.update_plant(options) + +This third function is used to turn the spawned nodes above into something +else over time. This function has no return value, and accepts a biome +definition table as the only parameter. These are defined like so: + +options = { + label = string, -- set this to identify the ABM for Minetest's + -- profiler. If not set, biome_lib will set it to + -- "biome_lib.update_plant(): " appended with the node + -- in grow_plant (or the first item if it's a table) + grow_plant = "string" or {table}, -- Name(s) of the node(s) to be grown + -- into something else. This value is passed to the + -- ABM as the "nodenames" parameter, so the plants + -- themselves are the ABM trigger, rather than + -- the ground they spawned on. A plant will only grow + -- if the node above it is air. If you use a table, + -- note that all nodes referenced therein will be + -- grown into the same final object. + grow_delay = num, -- Passed as the ABM "interval" parameter, as with + -- spawning. + grow_chance = num, -- Passed as the ABM "chance" parameter. + grow_result = "string", -- Name of the node into which the grow_plant + -- node(s) should transform when the ABM executes. + + ---- Everything from here down is optional. + + dry_early_node = "string", -- This value is ignored except for jungle + -- grass (a corner case needed by that mod), where it + -- indicates which node the grass must be on in order + -- for it to turn from the short size to + -- "default:dry_shrub" instead of the medium size. + grow_nodes = {table}, -- One of these nodes must be under the plant in + -- order for it to grow at all. Normally this should + -- be the same as the list of surfaces passed to the + -- spawning ABM as the "nodenames" parameter. This is + -- so that the plant can be manually placed on + -- something like a flower pot or something without it + -- necessarily growing and perhaps dieing. Defaults + -- to "default:dirt_with_grass". + facedir = num, -- Same as with spawning a plant. + need_wall = bool, -- Set this to true if you the plant needs to grow + -- against a wall. Defaults to false. + verticals_list = {table}, -- same as with spawning a plant. + choose_random_wall = bool, -- same as with spawning a plant. + grow_vertically = bool, -- Set this to true if the plant needs to grow + -- vertically, as in climbing poison ivy. Defaults to + -- false. + height_limit = num, -- Set this to limit how tall the desired node can + -- grow. The mod will search straight down from the + -- position being spawned at to find a ground node, + -- set via the field below. Defaults to 5 nodes. + ground_nodes = {table}, -- What nodes should be treated as "the ground" + -- below a vertically-growing plant. Usually this + -- should be the same as the grow_nodes table, but + -- might also include, for example, water or some + -- other surrounding material. Defaults to + -- "default:dirt_with_grass". + grow_function = something, -- [*] see below. + seed_diff = num, -- [*] see below. +} + +[*] grow_function can take one of three possible settings: it can be nil (or + not provided), a string, or a table. + +If it is not provided or it's set to nil, all of the regular growing code is +executed normally, the value of seed_diff, if any, is ignored, and the node to +be placed is assumed to be specified in the grow_result variable. + +If this value is set to a simple string, this is treated as the name of the +function to use to grow the plant. In this case, all of the usual growing +code is executeed, but then instead of a plant being simply added to the +world, grow_result is ignored and the named function is executed and passed a +few parmeters in the following general form: + + somefunction(pos, perlin1, perlin2) + +These values represent the current position (the usual table), the Perlin +noise value for that spot in the generic "plants can grow here" map for the +seed_diff value above, the Perlin value for that same spot from the +temperature map, and the detected neighboring wall face, if there was one (or +nil if not). If seed_diff is not provided, it defaults to 0. + +If this variable is instead set to a table, it is treated an an L-Systems tree +definition. All of the growing code is executed in the usual manner, then the +tree described by that definition is spawned at the current position instead, +and grow_result is ignored. + + +===== +biome_lib.find_adjacent_wall(pos, verticals, randomflag) + +Of the few helper functions, this one expects a position parameter and a table +with the list of nodes that should be considered as walls. The code will +search around the given position for a neighboring wall, returning the first +one it finds as a facedir value, or nil if there are no adjacent walls. + +If randomflag is set to true, the function will just return the facedir of any +random wall it finds adjacent to the target position. Defaults to false if +not specified. + +===== +biome_lib.is_node_loaded(pos) + +This acts as a wrapper for the minetest.get_node_or_nil(node_pos) +function and accepts a single position parameter. Returns true if the node in +question is already loaded, or false if not. + + +===== +biome_lib.dbg(string, level) + +This is a simple debug output function which takes one string parameter. It +just checks if DEBUG is true and outputs the phrase "[Plantlife] " followed by +the supplied string, via the print() function, if so. + +'level' is a number that, if supplied, dictates the lowest 'biome_lib_debug' +can be set to in minetest.conf for this message to be displayed. Both the +default log level and the default message level are 0, thus always showing the +supplied message. + +Although it's not set in stone, a good practice is to use a level of 0 (or +just omit the value) for anything that generally important enough that it +ought always be shown, 1 for errors, 2 for warnings, 3 for info, 4 for verbose +spammy stuff. + +===== +biome_lib.generate_ltree(pos, treemodel) +biome_lib.grow_ltree(pos, treemodel) + +In the case of the growing code and the mapgen-based tree generator code, +generating a tree is done via the above two calls, which in turn immediately +call the usual spawn_tree() functions. This rerouting exists as a way for +other mods to hook into biome_lib's tree-growing functions in general, +perhaps to execute something extra whenever a tree is spawned. + +biome_lib.generate_ltree(pos, treemodel) is called any time a tree is spawned +at map generation time. 'pos' is the position of the block on which the tree +is to be placed. 'treemodel' is the standard L-Systems tree definition table +expected by the spawn_tree() function. Refer to the 'trunk' field in that +table to derive the name of the tree being spawned. + +biome_lib.grow_ltree(pos, treemodel) does the same sort of thing whenever a +tree is spawned within the abm-based growing code, for example when growing a +sapling into a tree. + + +===== +There are other, internal helper functions that are not meant for use by other +mods. Don't rely on them, as they are subject to change without notice. + +====================== +Fertile Ground Mapping +====================== + +The mod uses Perlin noise to create "biomes" of the various plants, via the +minetest.get_perlin() function. At present, there are three layers of +Perlin noise used. + +The first one is for a "fertile ground" layer, which I tend to refer to as the +generic "stuff can potentially grow here" layer. Its values are hard-coded: + + perlin_octaves = 3 + perlin_persistence = 0.6 + perlin_scale = 100 + +For more information on how Perlin noise is generated, you will need to search +the web, as these default values were from that which is used by minetest_game +to spawn jungle grass at mapgen time, and I'm still learning how Perlin noise +works. ;-) + + +=================== +Temperature Mapping +=================== + +The second Perlin layer is a temperature map, with values taken from +SPlizard's Snow Biomes mod so that the two will be compatible, since that mod +appears to be the standard now. Those values are: + + temperature_seeddiff = 112 + temperature_octaves = 3 + temperature_persistence = 0.5 + temperature_scale = 150 + +The way Perlin values are used by this mod, in keeping with the snow mod's +apparent methods, larger values returned by the Perlin function represent +*colder* temperatures. In this mod, the following table gives a rough +approximation of how temperature maps to these values, normalized to +0.53 = 0 °C and +1.0 = -25 °C. + +Perlin Approx. Temperature +-1.0 81 °C ( 178 °F) +-0.75 68 °C ( 155 °F) +-0.56 58 °C ( 136 °F) +-0.5 55 °C ( 131 °F) +-0.25 41 °C ( 107 °F) +-0.18 38 °C ( 100 °F) + 0 28 °C ( 83 °F) + 0.13 21 °C ( 70 °F) + 0.25 15 °C ( 59 °F) + 0.5 2 °C ( 35 °F) + 0.53 0 °C ( 32 °F) + 0.75 -12 °C ( 11 °F) + 0.86 -18 °C ( 0 °F) + 1.0 -25 °C (- 13 °F) + +Included in this table are even 0.25 steps in Perlin values along with some +common temperatures on both the Centigrade and Fahrenheit scales. Note that +unless you're trying to model the Moon or perhaps Mercury in your mods/maps, +you probably won't need to bother with Perlin values of less than -0.56 or so. + + +================ +Humidity Mapping +================ + +Last but not least is a moisture/humidity map. Like the temperature map +above, Perlin values can be tested to determine the approximate humidity of +the *air* in the area. This humidity map is basically the perlin layer used +for deserts. + +A value of +1.0 is very moist (basically a thick fog, if it could be seen), a +value of roughly +0.25 represents the edge of a desert as usually seen in the +game, and a value of -1.0 is as dry as a bone. + +This does not check for nearby water, just general air humidity, and that +being the case, nearby ground does not affect the reported humidity of a +region (because this isn't yet possible to calculate yet). Use the near_nodes +and avoid_nodes parameters and their related options to check for water and +such. + +The Perlin values use for this layer are: + + humidity_seeddiff = 9130 + humidity_octaves = 3 + humidity_persistence = 0.5 + humidity_scale = 250 + +And this particular one is mapped slightly differently from the others: + + noise3 = perlin3:get2d({x=p_top.x+150, y=p_top.z+50}) + +(Note the +150 and +50 offsets) + + +================== +Default game nodes +================== + +Although this project was intended to be used with minetest_game, it can be +configured to work with something else instead. All you need to do is provide +the names of the nodes in your game you want biome_lib's internals to use. + +See settingtypes.txt for a list. Any item listed there can be changed either +by adding it to your minetest.conf, or by using the "all settings" menu in +Minetest, whatever's appropriate for your particular setup. + +================== +Engine Decorations +================== + +If a call to biome_lib.register_on_generate() contains items and biome +definition settings that are suitable, biome_lib will pass that call on to the +engine instead, to use its built-in decorations feature, since it'll be much +faster than Lua. + +For this to work, first the item to be added must either be a node, or a +table with a list of nodes that biome_lib would normally pick from randomly. +That is to say, you cannot specify an L-tree or a function here, as the engine +does not support that sort of thing (biome_lib will just switch to its normal +handling if you do). + +Second, these biome definition items must not be present: + +* below_nodes +* avoid_nodes +* avoid_radius +* neighbors +* ncount +* depth +* near_nodes_size +* near_nodes_vertical +* temp_min +* temp_max +* verticals_list +* delete_above +* delete_above_surround + +The plantlife_limit definition item is ignored when checking if a particular +call can be routed to the engine. + +The call given to the engine will use the remaining biome definition items in +the following manner: + +deco_type = "simple", +flags = "all_floors" +decoration = node or table with node list +place_on = surface +y_min = min_elevation +y_max = max_elevation +spawn_by = near_nodes +num_spawn_by = near_nodes_count +param2 = \_ set to the range specified by the biome definition's +param2_max = / random_facedir table, if present, otherwise omitted +noise_params = { + octaves = biome_lib.fertile_perlin_octaves, + persist = biome_lib.fertile_perlin_persistence * (250/biome_lib.fertile_perlin_scale), + scale = ((100-biome.rarity)/100) * (math.min(biome.max_count, 6400)/6400), + seed = biome.seed_diff, + offset = 0, + spread = {x = 100, y = 100, z = 100}, + lacunarity = 2, + flags = "absvalue" +} + +If the biome definition's check_air setting is false, "force_placement" is +added to the decoration's flags setting. + +If the biome def's spawn_replace_node is set to true, the decoration's +place_offset_y is set to -1 (otherwise it is omitted). diff --git a/mods/biome_lib/LICENSE b/mods/biome_lib/LICENSE new file mode 100644 index 0000000..c5885ae --- /dev/null +++ b/mods/biome_lib/LICENSE @@ -0,0 +1,600 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/biome_lib/README.md b/mods/biome_lib/README.md new file mode 100644 index 0000000..a8ac11e --- /dev/null +++ b/mods/biome_lib/README.md @@ -0,0 +1,30 @@ +# Biome Lib + +This library's purpose is to allow other mods to add growing things to the map in a straightforward, simple manner. It contains all the core functions needed by mods and modpacks such as More Trees, Tiny Trees, Plantlife, and others. + +Spawning of plants is optionally sensitive to the amount of available light, elevation, nearness to other nodes, plant-to-plant density, water depth, and a whole host of controls. + +All objects spawned or generated using this mod use Perlin noise to stay within simple biomes, rather than just letting everything just spread around the map randomly. + +This library also features a basic temperature map, which should blend in nicely with SPlizard's Snow Biomes mod (the same Perlin settings are used, with the assumption that the edge of a snow biome is 0° Centigrade). + +Both mapgen-based spawning and ABM-based spawning is supported. Growing code is strictly ABM-based. L-system trees can be spawned at mapgen time via the engine's spawn_tree() function and are quite fast. + +It is primarily intended for mapgen v6, but it should work fine when used with mapgen v7. + +**Dependencies:** nothing, but if you don't use `minetest_game`, you'll need to supply some settings (see API.txt). + +**Recommends**: [Plantlife Modpack](https://github.com/mt-mods/plantlife_modpack), +[More Trees](https://github.com/mt-mods/moretrees) + +**API**: This mod supplies a small number of very powerful functions. They are, briefly: + +* biome_lib:register_generate_plant() +* biome_lib:spawn_on_surfaces() +* biome_lib:grow_plants() +* biome_lib:find_valid_wall() +* biome_lib:is_node_loaded() + +For a complete description of these functions as well as several of the internal variables within the mod, see `API.txt`. + +**Configuration:** This mod has several variables you can set in your `minetest.conf` to change things a bit, from the default nodes it uses, to the debug log level and the block queue behavior. For a list with complete descriptions, see `settingtypes.txt`. diff --git a/mods/biome_lib/api.lua b/mods/biome_lib/api.lua new file mode 100644 index 0000000..352b56b --- /dev/null +++ b/mods/biome_lib/api.lua @@ -0,0 +1,695 @@ +biome_lib.block_log = {} +biome_lib.block_recheck_list = {} +biome_lib.run_block_recheck_list = false + +biome_lib.actionslist_aircheck = {} +biome_lib.actionslist_no_aircheck = {} + +biome_lib.surfaceslist_aircheck = {} +biome_lib.surfaceslist_no_aircheck = {} + +biome_lib.registered_decorations = {} + +biome_lib.fertile_perlin_octaves = 3 +biome_lib.fertile_perlin_persistence = 0.6 +biome_lib.fertile_perlin_scale = 100 + +local time_speed = tonumber(minetest.settings:get("time_speed")) +biome_lib.time_scale = 1 + +if time_speed and time_speed > 0 then + biome_lib.time_scale = 72 / time_speed +end + +biome_lib.air = {name = "air"} + +-- the mapgen rarely creates useful surfaces outside this range, but mods can +-- still specify a wider range if needed. +biome_lib.mapgen_elevation_limit = { ["min"] = -16, ["max"] = 48 } + + +-- Local functions + +function biome_lib.dbg(msg, level) + local l = tonumber(level) or 0 + if biome_lib.debug_log_level >= l then + print(os.date("%Y-%m-%d %H:%M:%S").." [Biome Lib]: "..msg) + minetest.log("verbose", "[Biome Lib]: "..msg) + end +end + +local function get_biome_data(pos, perlin_fertile) + local fertility = perlin_fertile:get_2d({x=pos.x, y=pos.z}) + + local data = minetest.get_biome_data(pos) + -- Original values this method returned were +1 (lowest) to -1 (highest) + -- so we need to convert the 0-100 range from get_biome_data() to that. + return fertility, 1 - (data.heat / 100 * 2), 1 - (data.humidity / 100 * 2) +end + +function biome_lib.is_node_loaded(node_pos) + local n = minetest.get_node_or_nil(node_pos) + if (not n) or (n.name == "ignore") then + return false + end + return true +end + +function biome_lib.set_defaults(biome) + + biome.seed_diff = biome.seed_diff or 0 + biome.min_elevation = biome.min_elevation or biome_lib.mapgen_elevation_limit.min + biome.max_elevation = biome.max_elevation or biome_lib.mapgen_elevation_limit.max + biome.temp_min = biome.temp_min or 1 + biome.temp_max = biome.temp_max or -1 + biome.humidity_min = biome.humidity_min or 1 + biome.humidity_max = biome.humidity_max or -1 + biome.plantlife_limit = biome.plantlife_limit or 0.1 + biome.near_nodes_vertical = biome.near_nodes_vertical or 1 + +-- specific to on-generate + + biome.neighbors = biome.neighbors or biome.surface + biome.near_nodes_size = biome.near_nodes_size or 0 + biome.near_nodes_count = biome.near_nodes_count or 1 + biome.rarity = biome.rarity or 50 + biome.rarity_fertility = biome.rarity_fertility or 0 + biome.max_count = biome.max_count or 125 + biome.tries = biome.tries or 2 + if biome.check_air ~= false then biome.check_air = true end + +-- specific to abm spawner + biome.seed_diff = biome.seed_diff or 0 + biome.light_min = biome.light_min or 0 + biome.light_max = biome.light_max or 15 + biome.depth_max = biome.depth_max or 1 + biome.facedir = biome.facedir or 0 + return biome +end + +local function search_table(t, s) + for i = 1, #t do + if t[i] == s then return true end + end + return false +end + +-- register the list of surfaces to spawn stuff on, filtering out all duplicates. +-- separate the items by air-checking or non-air-checking map eval methods + +function biome_lib.register_on_generate(biomedef, nodes_or_function_or_model) + + -- if calling code passes an undefined node for a surface or + -- as a node to be spawned, don't register an action for it. + + if type(nodes_or_function_or_model) == "string" + and string.find(nodes_or_function_or_model, ":") + and not minetest.registered_nodes[nodes_or_function_or_model] then + biome_lib.dbg("Warning: Ignored registration for undefined spawn node: ".. + dump(nodes_or_function_or_model), 2) + return + end + + if type(nodes_or_function_or_model) == "string" + and not string.find(nodes_or_function_or_model, ":") then + biome_lib.dbg("Warning: Registered function call using deprecated string method: ".. + dump(nodes_or_function_or_model), 2) + end + + biome_lib.mapgen_elevation_limit.min = math.min(biomedef.min_elevation or 0, biome_lib.mapgen_elevation_limit.min) + biome_lib.mapgen_elevation_limit.max = math.max(biomedef.max_elevation or 0, biome_lib.mapgen_elevation_limit.max) + + local decor_def = biome_lib.can_use_decorations(biomedef, nodes_or_function_or_model) + + if decor_def then + biome_lib.dbg("Using engine decorations instead of biome_lib functions for node(s): ".. + dump(nodes_or_function_or_model), 3) + biome_lib.registered_decorations[#biome_lib.registered_decorations + 1] = nodes_or_function_or_model + minetest.register_decoration(decor_def) + return + elseif biomedef.check_air == false then + biome_lib.dbg("Register no-air-check mapgen hook: "..dump(nodes_or_function_or_model), 3) + biome_lib.actionslist_no_aircheck[#biome_lib.actionslist_no_aircheck + 1] = {biomedef, nodes_or_function_or_model} + local s = biomedef.surface + if type(s) == "string" then + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_no_aircheck, s) then + biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s + end + else + biome_lib.dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s), 2) + end + else + for i = 1, #biomedef.surface do + s = biomedef.surface[i] + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_no_aircheck, s) then + biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s + end + else + biome_lib.dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s), 2) + end + end + end + else + biome_lib.dbg("Register with-air-checking mapgen hook: "..dump(nodes_or_function_or_model), 3) + biome_lib.actionslist_aircheck[#biome_lib.actionslist_aircheck + 1] = { biomedef, nodes_or_function_or_model } + local s = biomedef.surface + if type(s) == "string" then + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_aircheck, s) then + biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s + end + else + biome_lib.dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s), 2) + end + else + for i = 1, #biomedef.surface do + s = biomedef.surface[i] + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(biome_lib.surfaceslist_aircheck, s) then + biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s + end + else + biome_lib.dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s), 2) + end + end + end + end +end + +-- Function to check whether a position matches the given biome definition +-- Returns true when the surface can be populated + +local function populate_single_surface(biome, pos, perlin_fertile_area, checkair) + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + + if biome.rarity - biome.rarity_fertility == 100 then + return + end + + local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area) + + if math.random() * 100 <= (biome.rarity - ((fertility + 1) / 2 * biome.rarity_fertility)) then + return + end + + local pos_biome_ok = pos.y >= biome.min_elevation and pos.y <= biome.max_elevation + and fertility >= biome.plantlife_limit + and temperature <= biome.temp_min and temperature >= biome.temp_max + and humidity <= biome.humidity_min and humidity >= biome.humidity_max + + if not pos_biome_ok then + return -- Y position mismatch, outside of biome + end + + local biome_surfaces_string = dump(biome.surface) + local surface_ok = false + + if not biome.depth then + local dest_node = minetest.get_node(pos) + if string.find(biome_surfaces_string, dest_node.name) then + surface_ok = true + else + if string.find(biome_surfaces_string, "group:") then + for j = 1, #biome.surface do + if string.find(biome.surface[j], "^group:") + and minetest.get_item_group(dest_node.name, biome.surface[j]) then + surface_ok = true + break + end + end + end + end + elseif not string.find(biome_surfaces_string, + minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name) then + surface_ok = true + end + + if not surface_ok then + return -- Surface does not match the given node group/name + end + + if checkair and minetest.get_node(p_top).name ~= "air" then + return + end + + if biome.below_nodes and + not string.find(dump(biome.below_nodes), + minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + ) then + return -- Node below does not match + end + + if biome.ncount and + #minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + biome.neighbors + ) <= biome.ncount then + return -- Not enough similar biome nodes around + end + + if biome.near_nodes and + #minetest.find_nodes_in_area( + {x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, + {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, + biome.near_nodes + ) < biome.near_nodes_count then + return -- Long distance neighbours do not match + end + + -- Position fits into given biome + return true +end + +function biome_lib.populate_surfaces(b, nodes_or_function_or_model, snodes, checkair) + local items_added = 0 + + local biome = biome_lib.set_defaults(b) + + -- filter stage 1 - find nodes from the supplied surfaces that are within the current biome. + + local in_biome_nodes = {} + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, biome_lib.fertile_perlin_octaves, + biome_lib.fertile_perlin_persistence, biome_lib.fertile_perlin_scale) + + for i = 1, #snodes do + local pos = vector.new(snodes[i]) + if populate_single_surface(biome, pos, perlin_fertile_area, checkair) then + in_biome_nodes[#in_biome_nodes + 1] = pos + end + end + + -- filter stage 2 - find places within that biome area to place the plants. + + local num_in_biome_nodes = #in_biome_nodes + + if num_in_biome_nodes == 0 then + return 0 + end + + for i = 1, math.min(math.ceil(biome.max_count/25), num_in_biome_nodes) do + local tries = 0 + local spawned = false + while tries < biome.tries and not spawned do + local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)] + + local will_place = true + local fdir = nil + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) + end + + if biome.spawn_on_side then + local onside = biome_lib.find_open_side(pos) + if onside then + pos = onside.newpos + fdir = onside.facedir + else + will_place = false + end + elseif biome.spawn_on_bottom then + if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + pos.y = pos.y - 1 + else + will_place = false + end + elseif biome.spawn_replace_node then + pos.y = pos.y-1 + end + + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + + if will_place and not (biome.avoid_nodes and biome.avoid_radius + and minetest.find_node_near(p_top, biome.avoid_radius + + math.random(-1.5,2), biome.avoid_nodes)) then + if biome.delete_above then + minetest.swap_node(p_top, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y+1, z=p_top.z}, biome_lib.air) + end + + if biome.delete_above_surround then + minetest.swap_node({x=p_top.x-1, y=p_top.y, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x+1, y=p_top.y, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y, z=p_top.z-1}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y, z=p_top.z+1}, biome_lib.air) + + minetest.swap_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1}, biome_lib.air) + minetest.swap_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1}, biome_lib.air) + end + + if biome.spawn_replace_node then + minetest.swap_node(pos, biome_lib.air) + end + + local objtype = type(nodes_or_function_or_model) + + if objtype == "table" then + if nodes_or_function_or_model.axiom then + biome_lib.generate_ltree(p_top, nodes_or_function_or_model) + biome_lib.dbg("An L-tree was spawned at "..minetest.pos_to_string(p_top), 4) + spawned = true + else + local n=nodes_or_function_or_model[math.random(#nodes_or_function_or_model)] + minetest.swap_node(p_top, { name = n, param2 = fdir }) + biome_lib.dbg("Node \""..n.."\" was randomly picked from a list and placed at ".. + minetest.pos_to_string(p_top), 4) + spawned = true + end + elseif objtype == "string" and + minetest.registered_nodes[nodes_or_function_or_model] then + minetest.swap_node(p_top, { name = nodes_or_function_or_model, param2 = fdir }) + biome_lib.dbg("Node \""..nodes_or_function_or_model.."\" was placed at ".. + minetest.pos_to_string(p_top), 4) + spawned = true + elseif objtype == "function" then + nodes_or_function_or_model(pos, fdir) + biome_lib.dbg("A function was run on surface node at "..minetest.pos_to_string(pos), 4) + spawned = true + elseif objtype == "string" and pcall(loadstring(("return %s(...)"): + format(nodes_or_function_or_model)),pos) then + spawned = true + biome_lib.dbg("An obsolete string-specified function was run on surface node at ".. + minetest.pos_to_string(p_top), 4) + else + biome_lib.dbg("Warning: Ignored invalid definition for object ".. + dump(nodes_or_function_or_model).." that was pointed at {"..dump(pos).."}", 2) + end + else + tries = tries + 1 + end + end + if spawned then items_added = items_added + 1 end + end + return items_added +end + +-- Primary log read-out/mapgen spawner + +local function confirm_block_surroundings(p) + local n=minetest.get_node_or_nil(p) + if not n or n.name == "ignore" then return false end + + for x = -32,32,64 do -- step of 64 causes it to only check the 8 corner blocks + for y = -32,32,64 do + for z = -32,32,64 do + n = minetest.get_node_or_nil({x=p.x + x, y=p.y + y, z=p.z + z}) + if not n or n.name == "ignore" then return false end + end + end + end + return true +end + +function biome_lib.generate_block(shutting_down) + + if shutting_down then + if #biome_lib.block_recheck_list > 0 then + for i = 1, #biome_lib.block_recheck_list do + biome_lib.block_log[#biome_lib.block_log + 1] = biome_lib.block_recheck_list[i] + end + biome_lib.block_recheck_list = {} + end + biome_lib.run_block_recheck_list = false + else + if biome_lib.run_block_recheck_list + and not biome_lib.block_recheck_list[1] then + biome_lib.run_block_recheck_list = false + end + end + + local blocklog = biome_lib.run_block_recheck_list + and biome_lib.block_recheck_list + or biome_lib.block_log + + if not blocklog[1] then return end + + local minp = blocklog[1][1] + local maxp = blocklog[1][2] + local airflag = blocklog[1][3] + + if not biome_lib.pos_hash then -- we need to read the maplock and get the surfaces list + local now = minetest.get_us_time() + biome_lib.pos_hash = {} + minetest.load_area(minp) + if not confirm_block_surroundings(minp) + and not shutting_down + -- if any neighbors appear not to be loaded and the block hasn't expired yet, defer it + and (blocklog[1][4] + biome_lib.block_timeout) > now then + + if biome_lib.run_block_recheck_list then + biome_lib.block_log[#biome_lib.block_log + 1] = table.copy(biome_lib.block_recheck_list[1]) + table.remove(biome_lib.block_recheck_list, 1) + else + biome_lib.block_recheck_list[#biome_lib.block_recheck_list + 1] = table.copy(biome_lib.block_log[1]) + table.remove(biome_lib.block_log, 1) + end + biome_lib.pos_hash = nil + biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp).. + " had a neighbor not fully emerged, skipped it for now.", 4) + return + else + biome_lib.pos_hash.surface_node_list = airflag + and minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck) + or minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_no_aircheck) + if #biome_lib.pos_hash.surface_node_list == 0 then + biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp).." dequeued: no detected surfaces.", 4) + table.remove(blocklog, 1) + biome_lib.pos_hash = nil + return + else + biome_lib.pos_hash.action_index = 1 + biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp).. + " has "..#biome_lib.pos_hash.surface_node_list.. + " surface nodes to work on (airflag="..dump(airflag)..")", 4) + end + end + elseif not (airflag and biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index]) + and not (not airflag and biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index]) then + -- the block is finished, remove it + if #biome_lib.pos_hash.surface_node_list > 0 then + biome_lib.dbg("Deleted mapblock "..minetest.pos_to_string(minp).." from the block log", 4) + end + table.remove(blocklog, 1) + biome_lib.pos_hash = nil + else + -- below, [1] is biome, [2] is the thing to be added + local added = 0 + if airflag then + if biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index] then + added = biome_lib.populate_surfaces( + biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index][1], + biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index][2], + biome_lib.pos_hash.surface_node_list, true) + biome_lib.pos_hash.action_index = biome_lib.pos_hash.action_index + 1 + end + else + if biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index] then + added = biome_lib.populate_surfaces( + biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index][1], + biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index][2], + biome_lib.pos_hash.surface_node_list, false) + biome_lib.pos_hash.action_index = biome_lib.pos_hash.action_index + 1 + end + end + if added > 0 then + biome_lib.dbg("biome_lib.populate_surfaces ran on mapblock at ".. + minetest.pos_to_string(minp)..". Entry #".. + (biome_lib.pos_hash.action_index-1).." added "..added.." items.", 4) + end + end +end + +-- The spawning ABM + +function biome_lib.register_active_spawner(sd,sp,sr,sc,ss,sa) + + local b = {} + + if type(sd) ~= "table" then + b.spawn_delay = sd -- old api expects ABM interval param here. + b.spawn_plants = {sp} + b.avoid_radius = sr + b.spawn_chance = sc + b.spawn_surfaces = {ss} + b.avoid_nodes = sa + else + b = sd + end + + if b.spawn_delay*biome_lib.time_scale >= 1 then + b.interval = b.spawn_delay*biome_lib.time_scale + else + b.interval = 1 + end + + local biome = biome_lib.set_defaults(b) + + biome.spawn_plants_count = #(biome.spawn_plants) + + local n + if type(biome.spawn_plants) == "table" then + n = "random: "..biome.spawn_plants[1]..", ..." + else + n = biome.spawn_plants + end + biome.label = biome.label or "biome_lib spawn_on_surfaces(): "..n + + minetest.register_abm({ + nodenames = biome.spawn_surfaces, + interval = biome.interval, + chance = biome.spawn_chance, + neighbors = biome.neighbors, + label = biome.label, + action = function(pos, node, active_object_count, active_object_count_wider) + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + local n_top = minetest.get_node(p_top) + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, biome_lib.fertile_perlin_octaves, + biome_lib.fertile_perlin_persistence, biome_lib.fertile_perlin_scale) + + local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area) + + local pos_biome_ok = pos.y >= biome.min_elevation and pos.y <= biome.max_elevation + and fertility > biome.plantlife_limit + and temperature <= biome.temp_min and temperature >= biome.temp_max + and humidity <= biome.humidity_min and humidity >= biome.humidity_max + and biome_lib.is_node_loaded(p_top) + + if not pos_biome_ok then + return -- Outside of biome + end + + local n_light = minetest.get_node_light(p_top, nil) + if n_light < biome.light_min or n_light > biome.light_max then + return -- Too dark or too bright + end + + if biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near( + p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes) then + return -- Nodes to avoid are nearby + end + + if biome.neighbors and biome.ncount and + #minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + biome.neighbors + ) <= biome.ncount then + return -- Near neighbour nodes are not present + end + + local NEAR_DST = biome.near_nodes_size + if biome.near_nodes and biome.near_nodes_count and biome.near_nodes_size and + #minetest.find_nodes_in_area( + {x=pos.x-NEAR_DST, y=pos.y-biome.near_nodes_vertical, z=pos.z-NEAR_DST}, + {x=pos.x+NEAR_DST, y=pos.y+biome.near_nodes_vertical, z=pos.z+NEAR_DST}, + biome.near_nodes + ) < biome.near_nodes_count then + return -- Far neighbour nodes are not present + end + + if (biome.air_count and biome.air_size) and + #minetest.find_nodes_in_area( + {x=p_top.x-biome.air_size, y=p_top.y, z=p_top.z-biome.air_size}, + {x=p_top.x+biome.air_size, y=p_top.y, z=p_top.z+biome.air_size}, + "air" + ) < biome.air_count then + return -- Not enough air + end + + local walldir = biome_lib.find_adjacent_wall(p_top, biome.verticals_list, biome.choose_random_wall) + if biome.alt_wallnode and walldir then + if n_top.name == "air" then + minetest.swap_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) + end + return + end + + local currentsurface = minetest.get_node(pos).name + + if biome_lib.default_water_nodes[currentsurface] and + #minetest.find_nodes_in_area( + {x=pos.x, y=pos.y-biome.depth_max-1, z=pos.z}, + vector.new(pos), + biome_lib.default_wet_surfaces + ) == 0 then + return -- On water but no ground nearby + end + + local rnd = math.random(1, biome.spawn_plants_count) + local plant_to_spawn = biome.spawn_plants[rnd] + local fdir = biome.facedir + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1],biome.random_facedir[2]) + end + if type(biome.spawn_plants) == "string" then + assert(loadstring(biome.spawn_plants.."(...)"))(pos) + elseif not biome.spawn_on_side and not biome.spawn_on_bottom and not biome.spawn_replace_node then + if n_top.name == "air" then + minetest.swap_node(p_top, { name = plant_to_spawn, param2 = fdir }) + end + elseif biome.spawn_replace_node then + minetest.swap_node(pos, { name = plant_to_spawn, param2 = fdir }) + + elseif biome.spawn_on_side then + local onside = biome_lib.find_open_side(pos) + if onside then + minetest.swap_node(onside.newpos, { name = plant_to_spawn, param2 = onside.facedir }) + end + elseif biome.spawn_on_bottom then + if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + minetest.swap_node({x=pos.x, y=pos.y-1, z=pos.z}, { name = plant_to_spawn, param2 = fdir} ) + end + end + end + }) +end + +-- Function to decide how to replace a plant - either grow it, replace it with +-- a tree, run a function, or die with an error. + +function biome_lib.replace_plant(pos, replacement, grow_function, walldir, seeddiff) + local growtype = type(grow_function) + if growtype == "table" then + minetest.swap_node(pos, biome_lib.air) + biome_lib.grow_ltree(pos, grow_function) + return + elseif growtype == "function" then + local perlin_fertile_area = minetest.get_perlin(seeddiff, biome_lib.fertile_perlin_octaves, + biome_lib.fertile_perlin_persistence, biome_lib.fertile_perlin_scale) + local fertility, temperature, _ = get_biome_data(pos, perlin_fertile_area) + grow_function(pos, fertility, temperature, walldir) + return + elseif growtype == "string" then + local perlin_fertile_area = minetest.get_perlin(seeddiff, biome_lib.fertile_perlin_octaves, + biome_lib.fertile_perlin_persistence, biome_lib.fertile_perlin_scale) + local fertility, temperature, _ = get_biome_data(pos, perlin_fertile_area) + assert(loadstring(grow_function.."(...)"))(pos, fertility, temperature, walldir) + return + elseif growtype == "nil" then + minetest.swap_node(pos, { name = replacement, param2 = walldir}) + return + elseif growtype ~= "nil" and growtype ~= "string" and growtype ~= "table" then + error("Invalid grow function "..dump(grow_function).." used on object at ("..dump(pos)..")") + end +end + +-- Check for infinite stacks + +if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then + biome_lib.expect_infinite_stacks = false +else + biome_lib.expect_infinite_stacks = true +end + +-- read a field from a node's definition + +function biome_lib.get_nodedef_field(nodename, fieldname) + if not minetest.registered_nodes[nodename] then + return nil + end + return minetest.registered_nodes[nodename][fieldname] +end diff --git a/mods/biome_lib/block_queue_checks.lua b/mods/biome_lib/block_queue_checks.lua new file mode 100644 index 0000000..22481f4 --- /dev/null +++ b/mods/biome_lib/block_queue_checks.lua @@ -0,0 +1,141 @@ +-- Iterate through the mapblock log, +-- populating blocks with new stuff in the process. + +minetest.register_globalstep(function(dtime) + if not biome_lib.block_log[1] then return end -- the block log is empty + + if math.random(100) > biome_lib.queue_ratio then return end + for s = 1, biome_lib.entries_per_step do + biome_lib.generate_block() + end +end) + +-- Periodically wake-up the queue to give old blocks a chance to time-out +-- if the player isn't currently exploring (i.e. they're just playing in one area) + +function biome_lib.wake_up_queue() + if #biome_lib.block_recheck_list > 1 + and #biome_lib.block_log == 0 then + biome_lib.block_log[#biome_lib.block_log + 1] = + table.copy(biome_lib.block_recheck_list[#biome_lib.block_recheck_list]) + biome_lib.block_recheck_list[#biome_lib.block_recheck_list] = nil + biome_lib.run_block_recheck_list = true + biome_lib.dbg("Woke-up the map queue to give old blocks a chance to time-out.", 3) + end + minetest.after(biome_lib.block_queue_wakeup_time, biome_lib.wake_up_queue) +end + +biome_lib.wake_up_queue() + +-- Play out the entire log all at once on shutdown +-- to prevent unpopulated map areas + +local function format_time(t) + if t > 59999999 then + return os.date("!%M minutes and %S seconds", math.ceil(t/1000000)) + else + return os.date("!%S seconds", math.ceil(t/1000000)) + end +end + +function biome_lib.check_remaining_time() + if minetest.get_us_time() > (biome_lib.shutdown_last_timestamp + 10000000) then -- report progress every 10s + biome_lib.shutdown_last_timestamp = minetest.get_us_time() + + local entries_remaining = #biome_lib.block_log + #biome_lib.block_recheck_list + + local total_purged = biome_lib.starting_count - entries_remaining + local elapsed_time = biome_lib.shutdown_last_timestamp - biome_lib.shutdown_start_time + biome_lib.dbg(string.format("%i entries, approximately %s remaining.", + entries_remaining, format_time(elapsed_time/total_purged * entries_remaining))) + end +end + +--Purge the block log at shutdown + +minetest.register_on_shutdown(function() + + biome_lib.shutdown_start_time = minetest.get_us_time() + biome_lib.shutdown_last_timestamp = minetest.get_us_time()+1 + + biome_lib.starting_count = #biome_lib.block_log + #biome_lib.block_recheck_list + + if biome_lib.starting_count == 0 then + return + end + + biome_lib.dbg("Stand by, purging the mapblock log ".. + "(there are "..biome_lib.starting_count.." entries) ...", 0) + + while #biome_lib.block_log > 0 do + biome_lib.generate_block(true) + biome_lib.check_remaining_time() + end + + if #biome_lib.block_recheck_list > 0 then + biome_lib.block_log = table.copy(biome_lib.block_recheck_list) + biome_lib.block_recheck_list = {} + while #biome_lib.block_log > 0 do + biome_lib.generate_block(true) + biome_lib.check_remaining_time() + end + end + biome_lib.dbg("Log purge completed after ".. + format_time(minetest.get_us_time() - biome_lib.shutdown_start_time)..".", 0) +end) + +-- "Record" the map chunks being generated by the core mapgen, +-- split into individual mapblocks to reduce lag + +minetest.register_on_generated(function(minp, maxp, blockseed) + local timestamp = minetest.get_us_time() + for y = 0, 4 do + local miny = minp.y + y*16 + + if miny >= biome_lib.mapgen_elevation_limit.min + and (miny + 15) <= biome_lib.mapgen_elevation_limit.max then + + for x = 0, 4 do + local minx = minp.x + x*16 + + for z = 0, 4 do + local minz = minp.z + z*16 + + local bmin = {x=minx, y=miny, z=minz} + local bmax = {x=minx + 15, y=miny + 15, z=minz + 15} + biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, true, timestamp } + biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, false, timestamp } + end + end + else + biome_lib.dbg("Did not enqueue mapblocks at elevation "..miny.. + "m, they're out of range of any generate_plant() calls.", 4) + end + end + biome_lib.run_block_recheck_list = true +end) + +if biome_lib.debug_log_level >= 3 then + biome_lib.last_count = 0 + + function biome_lib.show_pending_block_count() + if biome_lib.last_count ~= #biome_lib.block_log then + biome_lib.dbg(string.format("Pending block counts - ready to process: %-8icurrently deferred: %i", + #biome_lib.block_log, #biome_lib.block_recheck_list), 3) + biome_lib.last_count = #biome_lib.block_log + biome_lib.queue_idle_flag = false + elseif not biome_lib.queue_idle_flag then + if #biome_lib.block_recheck_list > 0 then + biome_lib.dbg("Mapblock queue only contains blocks that can't yet be processed.", 3) + biome_lib.dbg("Idling the queue until new blocks arrive or the next wake-up call occurs.", 3) + else + biome_lib.dbg("Mapblock queue has run dry.", 3) + biome_lib.dbg("Idling the queue until new blocks arrive.", 3) + end + biome_lib.queue_idle_flag = true + end + minetest.after(1, biome_lib.show_pending_block_count) + end + + biome_lib.show_pending_block_count() +end diff --git a/mods/biome_lib/compat.lua b/mods/biome_lib/compat.lua new file mode 100644 index 0000000..d68e996 --- /dev/null +++ b/mods/biome_lib/compat.lua @@ -0,0 +1,115 @@ +-- compatibility shims for old mods + +function biome_lib:register_generate_plant(b, n) + biome_lib.dbg("Warning: biome_lib:register_generate_plant() is deprecated!", 2) + biome_lib.dbg("Use biome_lib.register_on_generate() instead", 2) + biome_lib.dbg("Item: "..dump(n), 2) + biome_lib.register_on_generate(b, n) +end + +function biome_lib:spawn_on_surfaces(sd, sp, sr, sc, ss, sa) + biome_lib.dbg("Warning: biome_lib:spawn_on_surfaces() is deprecated!", 2) + biome_lib.dbg("Use biome_lib.register_active_spawner() instead.", 2) + biome_lib.dbg("Item: "..dump(sd.spawn_plants or sp[1] or sp), 2) + biome_lib.register_active_spawner(sd, sp, sr, sc, ss, sa) +end + +function biome_lib:replace_object(p, r, f, w, d) + biome_lib.dbg("Warning: biome_lib:replace_object() is deprecated!", 2) + biome_lib.dbg("Use biome_lib.replace_plant() instead.", 2) + biome_lib.dbg("Item: "..dump(r), 2) + biome_lib.replace_plant(p, r, f, w, d) +end + +function biome_lib:grow_plants(o) + biome_lib.dbg("Warning: biome_lib:grow_plants() is deprecated!", 2) + biome_lib.dbg("Use biome_lib.update_plant() instead.", 2) + biome_lib.dbg("Item: "..dump(o.grow_nodes), 2) + biome_lib.update_plant(o) +end + +function biome_lib.generate_ltree(p, n) + minetest.spawn_tree(p, n) +end + +function biome_lib.grow_ltree(p, n) + minetest.spawn_tree(p, n) +end + +function biome_lib:generate_tree(p, n) + biome_lib.dbg("Warning: biome_lib:generate_tree() is deprecated!", 2) + biome_lib.dbg("Use biome_lib.generate_ltree() instead.", 2) + biome_lib.dbg("Item: "..dump(n), 2) + biome_lib.generate_ltree(p, n) +end + +function biome_lib:grow_tree(p, n) + biome_lib.dbg("Warning: biome_lib:grow_tree() is deprecated!", 2) + biome_lib.dbg("Use biome_lib.grow_ltree() instead.", 2) + biome_lib.dbg("Item: "..dump(n), 2) + biome_lib.grow_ltree(p, n) +end + +function biome_lib.can_use_decorations(b, nodes_or_function_or_treedef) + if not b or not nodes_or_function_or_treedef + or b.below_nodes + or b.avoid_nodes + or b.avoid_radius + or b.neighbors + or b.ncount + or b.depth + or b.near_nodes_size + or b.near_nodes_vertical + or b.temp_min + or b.temp_max + or b.verticals_list + or b.delete_above + or b.delete_above_surround + or ( type(nodes_or_function_or_treedef) == "string" and not minetest.registered_nodes[nodes_or_function_or_treedef] ) + or ( type(nodes_or_function_or_treedef) == "table" and nodes_or_function_or_treedef.axiom ) + or type(nodes_or_function_or_treedef) == "function" + then return false + end + + local biome = biome_lib.set_defaults(b) + + local decor_def = { + ["deco_type"] = "simple", + ["flags"] = "all_floors", + ["decoration"] = nodes_or_function_or_treedef, + ["place_on"] = biome.surface, + ["y_min"] = biome.min_elevation, + ["y_max"] = biome.max_elevation, + ["spawn_by"] = biome.near_nodes, + ["num_spawn_by"] = biome.near_nodes and biome.near_nodes_count, + } + + local r = (100-biome.rarity)/100 + local mc = math.min(biome.max_count, 6400)/6400 + + decor_def.noise_params = { + octaves = biome_lib.fertile_perlin_octaves, + persist = biome_lib.fertile_perlin_persistence * (100/biome_lib.fertile_perlin_scale), + scale = math.min(r, mc), + seed = biome.seed_diff, + offset = 0, + spread = {x = 100, y = 100, z = 100}, + lacunarity = 2, + flags = "absvalue" + } + + if not b.check_air then + decor_def.flags = decor_def.flags..",force_placement" + end + + if b.spawn_replace_node then + decor_def.place_offset_y = -1 + end + + if b.random_facedir then + decor_def.param2 = math.min(b.random_facedir[1], b.random_facedir[2]) + decor_def.param2_max = math.max(b.random_facedir[1], b.random_facedir[2]) + end + + return decor_def +end diff --git a/mods/biome_lib/growth.lua b/mods/biome_lib/growth.lua new file mode 100644 index 0000000..612d911 --- /dev/null +++ b/mods/biome_lib/growth.lua @@ -0,0 +1,73 @@ +-- The growing ABM + +function biome_lib.check_surface(name, nodes) + if not nodes then return true end + if type(nodes) == "string" then return nodes == name end + if nodes.set and nodes[name] then + return true + else + for _, n in ipairs(nodes) do + if name == n then return true end + end + end + return false +end + +function biome_lib.update_plant(opts) + + local options = opts + + options.height_limit = options.height_limit or 5 + options.ground_nodes = options.ground_nodes or biome_lib.default_ground_nodes + options.grow_nodes = options.grow_nodes or biome_lib.default_grow_nodes + options.seed_diff = options.seed_diff or 0 + + local n + + if type(options.grow_plant) == "table" then + n = "multi: "..options.grow_plant[1]..", ..." + else + n = options.grow_plant + end + + options.label = options.label or "biome_lib.update_plant(): "..n + + if options.grow_delay*biome_lib.time_scale >= 1 then + options.interval = options.grow_delay*biome_lib.time_scale + else + options.interval = 1 + end + + minetest.register_abm({ + nodenames = { options.grow_plant }, + interval = options.interval, + chance = options.grow_chance, + label = options.label, + action = function(pos, node, active_object_count, active_object_count_wider) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local p_bot = {x=pos.x, y=pos.y-1, z=pos.z} + local n_top = minetest.get_node(p_top) + local n_bot = minetest.get_node(p_bot) + local walldir = nil + if options.need_wall and options.verticals_list then + walldir = biome_lib.find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall) + end + if biome_lib.default_grow_through_nodes[n_top.name] + and (not options.need_wall or (options.need_wall and walldir)) then + if options.grow_vertically and walldir then + if biome_lib.search_downward(pos, options.height_limit, options.ground_nodes) then + minetest.swap_node(p_top, { name = options.grow_plant, param2 = walldir}) + end + + elseif biome_lib.check_surface(n_bot.name, options.grow_nodes) then + if not options.grow_result and not options.grow_function then + minetest.swap_node(pos, biome_lib.air) + + else + biome_lib.replace_plant(pos, options.grow_result, options.grow_function, options.facedir, options.seed_diff) + end + end + end + end + }) +end diff --git a/mods/biome_lib/init.lua b/mods/biome_lib/init.lua new file mode 100644 index 0000000..a92c632 --- /dev/null +++ b/mods/biome_lib/init.lua @@ -0,0 +1,95 @@ +-- Biome library mod by VanessaE +-- +-- I got the temperature map idea from "hmmmm", values used for it came from +-- Splizard's snow mod. +-- + +biome_lib = {} +biome_lib.modpath = minetest.get_modpath("biome_lib") + +local function tableize(s) + return string.split(string.trim(string.gsub(s, " ", ""))) +end + +local c1 = minetest.settings:get("biome_lib_default_grow_through_nodes") +biome_lib.default_grow_through_nodes = {["air"] = true} +if c1 then + for _, i in ipairs(tableize(c1)) do + biome_lib.default_grow_through_nodes[i] = true + end +else + biome_lib.default_grow_through_nodes["default:snow"] = true +end + +local c2 = minetest.settings:get("biome_lib_default_water_nodes") +biome_lib.default_water_nodes = {} +if c2 then + for _, i in ipairs(tableize(c2)) do + biome_lib.default_water_nodes[i] = true + end +else + biome_lib.default_water_nodes["default:water_source"] = true + biome_lib.default_water_nodes["default:water_flowing"] = true + biome_lib.default_water_nodes["default:river_water_source"] = true + biome_lib.default_water_nodes["default:river_water_flowing"] = true +end + +local c3 = minetest.settings:get("biome_lib_default_wet_surfaces") +local c4 = minetest.settings:get("biome_lib_default_ground_nodes") +local c5 = minetest.settings:get("biome_lib_default_grow_nodes") + +biome_lib.default_wet_surfaces = c3 and tableize(c3) or {"default:dirt", "default:dirt_with_grass", "default:sand"} +biome_lib.default_ground_nodes = c4 and tableize(c4) or {"default:dirt_with_grass"} +biome_lib.default_grow_nodes = c5 and tableize(c5) or {"default:dirt_with_grass"} + +biome_lib.debug_log_level = tonumber(minetest.settings:get("biome_lib_debug_log_level")) or 0 + +local rr = tonumber(minetest.settings:get("biome_lib_queue_ratio")) or -200 +biome_lib.queue_ratio = 100 - rr +biome_lib.entries_per_step = math.max(-rr, 1) + +-- the timer that manages the block timeout is in microseconds, but the timer +-- that manages the queue wakeup call has to be in seconds, and works best if +-- it takes a fraction of the block timeout interval. + +local t = tonumber(minetest.settings:get("biome_lib_block_timeout")) or 300 + +biome_lib.block_timeout = t * 1000000 + +-- we don't want the wakeup function to trigger TOO often, +-- in case the user's block timeout setting is really low + +biome_lib.block_queue_wakeup_time = math.min(t/2, math.max(20, t/10)) + +-- the actual important stuff starts here ;-) + +dofile(biome_lib.modpath .. "/api.lua") +dofile(biome_lib.modpath .. "/search_functions.lua") +dofile(biome_lib.modpath .. "/growth.lua") +dofile(biome_lib.modpath .. "/compat.lua") + +minetest.after(0.01, function() + -- report the final registration results and enable the active block queue stuff + + local n = #biome_lib.actionslist_aircheck + #biome_lib.actionslist_no_aircheck + + biome_lib.dbg("All mapgen registrations completed.", 0) + + if n > 0 then + biome_lib.dbg("Total items/actions to handle manually: "..n.. + " ("..#biome_lib.actionslist_no_aircheck.." without air checks)", 0) + biome_lib.dbg("Total surface types to handle manually: " + ..#biome_lib.surfaceslist_aircheck + #biome_lib.surfaceslist_no_aircheck, 0) + else + biome_lib.dbg("There are no \"handle manually\" items/actions registered,", 0) + biome_lib.dbg("so the mapblock queue will not be used this session.", 0) + end + + biome_lib.dbg("Items sent to the engine's decorations handler: "..#biome_lib.registered_decorations, 0) + biome_lib.dbg("Elevation range: "..biome_lib.mapgen_elevation_limit.min.." to ".. + string.format("%+d", biome_lib.mapgen_elevation_limit.max).." meters.", 0) + + if n > 0 then + dofile(biome_lib.modpath .. "/block_queue_checks.lua") + end +end) diff --git a/mods/biome_lib/mod.conf b/mods/biome_lib/mod.conf new file mode 100644 index 0000000..790c5cb --- /dev/null +++ b/mods/biome_lib/mod.conf @@ -0,0 +1,5 @@ +name = biome_lib +title = Biome Library +description = The biome spawning and management library for Plantlife, Moretrees, Tiny Trees, and other mods that originally depended on plants_lib from the plantlife modpack. +optional_depends = default +min_minetest_version = 5.2.0 diff --git a/mods/biome_lib/search_functions.lua b/mods/biome_lib/search_functions.lua new file mode 100644 index 0000000..2392da8 --- /dev/null +++ b/mods/biome_lib/search_functions.lua @@ -0,0 +1,53 @@ + +-- function to decide if a node has a wall that's in verticals_list{} +-- returns wall direction of valid node, or nil if invalid. + +function biome_lib.find_adjacent_wall(pos, verticals, randomflag) + local verts = dump(verticals) + if randomflag then + local walltab = {} + + if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 3 end + if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 2 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end + + if #walltab > 0 then return walltab[math.random(1, #walltab)] end + + else + if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end + if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end + end + return nil +end + +-- Function to search downward from the given position, looking for the first +-- node that matches the ground table. Returns the new position, or nil if +-- height limit is exceeded before finding it. + +function biome_lib.search_downward(pos, heightlimit, ground) + for i = 0, heightlimit do + if string.find(dump(ground), minetest.get_node({x=pos.x, y=pos.y-i, z = pos.z}).name) then + return {x=pos.x, y=pos.y-i, z = pos.z} + end + end + return false +end + +function biome_lib.find_open_side(pos) + if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2} + end + if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5} + end + return nil +end diff --git a/mods/biome_lib/settingtypes.txt b/mods/biome_lib/settingtypes.txt new file mode 100644 index 0000000..24558f8 --- /dev/null +++ b/mods/biome_lib/settingtypes.txt @@ -0,0 +1,48 @@ +# Comma-separated list of things that a spawned node is allowed to grow +# through. Air is always added to whatever else you specify here. +biome_lib_default_grow_through_nodes (List of things a plant can grow through) string default:snow + +# Comma-separated list of nodes that should be treated as water or water-like +# for the sake of looking for neighboring wet ground. +biome_lib_default_water_nodes (List of "water-like" sources) string default:water_source,default:water_flowing,default:river_water_source,default:river_water_flowing + +# Comma-separated list of nodes that should be considered "wet" if one of +# the configured "water-like" sources is nearby. +biome_lib_default_wet_surfaces (List of "wet" nodes) string default:dirt,default:dirt_with_grass,default:sand + +# Comma-separated list of nodes that something must be sitting on to be +# able to actively change from one thing to another (such as a sapling +# growing into a tree), to be used if the mod that added that growable +# thing didn't provide its own list of suitable surfaces. +biome_lib_default_grow_nodes (List of default surfaces a plant can thrive on) string default:dirt_with_grass + +# Comma-separated list of nodes to use as the "root" of something that can +# gradually climb up a wall (such as ivy), to be used if the mod that added +# the climing thing didn't provide its own list. +biome_lib_default_ground_nodes (List of default root nodes) string default:dirt_with_grass + +# biome_lib divides its workload into "actions", as dictated by the sum +# total of all mods that use it, and this sets how much of that work is done +# per globalstep tick. If positive, a single action is executed on that +# percentage of ticks, on average. If negative, it becomes positive, and +# that many actions are executed on every single tick, skipping none. +# More negative means more throughput, at the expense of lag. On fast PC's, +# a setting of between -500 and -2000 might be good. +biome_lib_queue_ratio (Queue run ratio) int -200 + +# Minetest's map generator allows neighboring areas to overflow into one +# another, to create smooth terrain, but it often hands the map blocks that +# comprise those areas to Lua (and hence, to biome_lib) before that overflow +# function happens, which causes the mapgen to overwrite whatever Lua does +# to them. This setting (in seconds) makes biome_lib wait before adding its +# normal output to those map blocks, to give the engine plenty of time to +# run that overflow feature first. +biome_lib_block_timeout (Deferred block timeout) int 300 + +# This does just what it sounds like - it shows all debug output that's sent +# with a level equal to or greater than this value. A setting of 0 shows only +# the bare necessities, such as the startup and shutdown messages, 1 adds +# internal non-fatal errors to what's shown, 2 adds warnings, 3 adds other +# basic info, 4 adds all the verbose debugging spew. 3 is perhaps the most +# useful setting. +biome_lib_debug_log_level (Debug log level) int 0 diff --git a/mods/denseores/.gitignore b/mods/denseores/.gitignore new file mode 100644 index 0000000..0667445 --- /dev/null +++ b/mods/denseores/.gitignore @@ -0,0 +1,43 @@ +# ---> Lua +# Compiled Lua sources +luac.out + +# luarocks build files +*.src.rock +*.zip +*.tar.gz + +# Object files +*.o +*.os +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo +*.def +*.exp + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + + diff --git a/mods/denseores/LICENSE b/mods/denseores/LICENSE new file mode 100644 index 0000000..7083002 --- /dev/null +++ b/mods/denseores/LICENSE @@ -0,0 +1,231 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS + +0. Definitions. + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on the Program. + +To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. +The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. + +A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + +b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. + +c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + +a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + +d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. +“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + +e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. +A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + +14. Revised Versions of this License. +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + + Copyright (C) +This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . + +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/mods/denseores/README.md b/mods/denseores/README.md new file mode 100644 index 0000000..d398c39 --- /dev/null +++ b/mods/denseores/README.md @@ -0,0 +1,3 @@ +# denseores + +The Dense Ores mod for Minetest. \ No newline at end of file diff --git a/mods/denseores/depends.txt b/mods/denseores/depends.txt new file mode 100644 index 0000000..436cd47 --- /dev/null +++ b/mods/denseores/depends.txt @@ -0,0 +1,2 @@ +default +moreores? diff --git a/mods/denseores/init.lua b/mods/denseores/init.lua new file mode 100644 index 0000000..4bf9db5 --- /dev/null +++ b/mods/denseores/init.lua @@ -0,0 +1,237 @@ +--[[ + Dense Ores mod for Minetest + Copyright (C) 2021 benedict424 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +--]] + + +--[[ +Order of everything here: +coal, iron, copper, gold, mese, diamond +Large, small +--]] + +denseores_modpath = minetest.get_modpath("denseores") + + +--[ Large Ore Nodes --] + +minetest.register_node("denseores:large_coal_ore", { --coal + description = "Large Coal Ore", + tiles ={"default_stone.png^large_coal_ore.png"}, + groups = {cracky=3}, + drop = 'default:coal_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_iron_ore", { --iron + description = "Large Iron Ore", + tiles ={"default_stone.png^large_iron_ore.png"}, + groups = {cracky=2}, + drop = 'default:iron_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_copper_ore", { --copper + description = "Large Copper Ore", + tiles ={"default_stone.png^large_copper_ore.png"}, + groups = {cracky=2}, + drop = 'default:copper_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_tin_ore", { --tin + description = "Large Tin Ore", + tiles ={"default_stone.png^large_tin_ore.png"}, + groups = {cracky=3}, + drop = 'default:tin_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_gold_ore", { --gold + description = "Large Gold Ore", + tiles ={"default_stone.png^large_gold_ore.png"}, + groups = {cracky=2}, + drop = 'default:gold_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_mese_ore", { --mese + description = "Large Mese Ore", + tiles ={"default_stone.png^large_mese_ore.png"}, + groups = {cracky=1}, + drop = 'default:mese_crystal 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_diamond_ore", { --diamond + description = "Large Diamond Ore", + tiles ={"default_stone.png^large_diamond_ore.png"}, + groups = {cracky=1}, + drop = 'default:diamond 2', + sounds = default.node_sound_stone_defaults(), +}) + + +--[ Large Ore Defenitions --] + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_coal_ore", + wherein = "default:stone_with_coal", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 64, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_iron_ore", + wherein = "default:stone_with_iron", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 2, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_copper_ore", + wherein = "default:stone_with_copper", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 2, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_tin_ore", + wherein = "default:stone_with_tin", + clust_scarcity = 12, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 64, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_gold_ore", + wherein = "default:stone_with_gold", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 2, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_mese_ore", + wherein = "default:stone_with_mese", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = -64, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_diamond_ore", + wherein = "default:stone_with_diamond", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = -128, +}) + + +--[ Crafting Recipies --] +--[ From Large to Normal --] + +minetest.register_craft( { + type = "shapeless", + output = "default:coal_lump 2", --coal + recipe = { + "denseores:large_coal_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:iron_lump 2", --iron + recipe = { + "denseores:large_iron_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:copper_lump 2", --copper + recipe = { + "denseores:large_copper_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "moreores:tin_lump 2", --tin + recipe = { + "denseores:large_tin_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:gold_lump 2", --gold + recipe = { + "denseores:large_gold_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:mese_crystal 2", --mese + recipe = { + "denseores:large_mese_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:diamond 2", --diamond + recipe = { + "denseores:large_diamond_ore", + } +}) + + +-- Special things happen from this line down. + + +-- Does moreores exist? Let's find out! +if minetest.get_modpath("moreores") then --Thank you Kazea of the Minetest Fourums. + dofile(denseores_modpath .. "/mo.lua") +end + + diff --git a/mods/denseores/mo.lua b/mods/denseores/mo.lua new file mode 100644 index 0000000..e60895c --- /dev/null +++ b/mods/denseores/mo.lua @@ -0,0 +1,87 @@ +--[[ + Dense Ores mod for Minetest + Copyright (C) 2021 benedict424 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +--]] + + +-- Mithril, Tin, Silver. That's my pattern. + +--[ Large Ore Nodes --] +--[ Finished! --] + +minetest.register_node("denseores:large_mithril_ore", { + description = "Heavy Mithril Ore", + tiles ={"default_stone.png^large_mithril_ore.png"}, + groups = {cracky=3}, + drop = 'moreores:mithril_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("denseores:large_silver_ore", { + description = "Heavy Silver Ore", + tiles ={"default_stone.png^large_silver_ore.png"}, + groups = {cracky=3}, + drop = 'moreores:silver_lump 2', + sounds = default.node_sound_stone_defaults(), +}) + + +--[ Large Ore Defenitions --] +--[ Finished! --] + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_mithril_ore", + wherein = "moreores:mineral_mithril", + clust_scarcity = 12, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 64, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "denseores:large_silver_ore", + wherein = "moreores:mineral_silver", + clust_scarcity = 12, + clust_num_ores = 2, + clust_size = 2, + height_min = -31000, + height_max = 64, +}) + + +--[ Crafting Recipies --] +--[ From Large to Normal --] + +minetest.register_craft( { + type = "shapeless", + output = "moreores:mithril_lump 2", --mithril + recipe = { + "denseores:large_mithril_ore", + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "moreores:silver_lump 2", --silver + recipe = { + "denseores:large_silver_ore", + } +}) + diff --git a/mods/denseores/textures/large_coal_ore.png b/mods/denseores/textures/large_coal_ore.png new file mode 100644 index 0000000..ede7541 Binary files /dev/null and b/mods/denseores/textures/large_coal_ore.png differ diff --git a/mods/denseores/textures/large_copper_ore.png b/mods/denseores/textures/large_copper_ore.png new file mode 100644 index 0000000..2e21de4 Binary files /dev/null and b/mods/denseores/textures/large_copper_ore.png differ diff --git a/mods/denseores/textures/large_diamond_ore.png b/mods/denseores/textures/large_diamond_ore.png new file mode 100644 index 0000000..15e102c Binary files /dev/null and b/mods/denseores/textures/large_diamond_ore.png differ diff --git a/mods/denseores/textures/large_gold_ore.png b/mods/denseores/textures/large_gold_ore.png new file mode 100644 index 0000000..0f3f4c7 Binary files /dev/null and b/mods/denseores/textures/large_gold_ore.png differ diff --git a/mods/denseores/textures/large_iron_ore.png b/mods/denseores/textures/large_iron_ore.png new file mode 100644 index 0000000..8050521 Binary files /dev/null and b/mods/denseores/textures/large_iron_ore.png differ diff --git a/mods/denseores/textures/large_mese_ore.png b/mods/denseores/textures/large_mese_ore.png new file mode 100644 index 0000000..3f262ae Binary files /dev/null and b/mods/denseores/textures/large_mese_ore.png differ diff --git a/mods/denseores/textures/large_mithril_ore.png b/mods/denseores/textures/large_mithril_ore.png new file mode 100644 index 0000000..4329cb1 Binary files /dev/null and b/mods/denseores/textures/large_mithril_ore.png differ diff --git a/mods/denseores/textures/large_silver_ore.png b/mods/denseores/textures/large_silver_ore.png new file mode 100644 index 0000000..05709af Binary files /dev/null and b/mods/denseores/textures/large_silver_ore.png differ diff --git a/mods/denseores/textures/large_tin_ore.png b/mods/denseores/textures/large_tin_ore.png new file mode 100644 index 0000000..0c49681 Binary files /dev/null and b/mods/denseores/textures/large_tin_ore.png differ diff --git a/mods/desertores/LICENSE b/mods/desertores/LICENSE new file mode 100644 index 0000000..32bca5a --- /dev/null +++ b/mods/desertores/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 DustyDave961 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/desertores/README.md b/mods/desertores/README.md new file mode 100644 index 0000000..cd036a3 --- /dev/null +++ b/mods/desertores/README.md @@ -0,0 +1,10 @@ +# desertores +Generates ores in deserts and other biomes. Also spawns raw ore blocks if enabled. Biome specific ore node variants coming soon. + +Biome specific ore variants may include: +* Sandstone +* Desert Stone +* Permafrost +* Desert Sandstone +* Silver Sandstone +* Cave Ice diff --git a/mods/desertores/init.lua b/mods/desertores/init.lua new file mode 100644 index 0000000..60ddb0d --- /dev/null +++ b/mods/desertores/init.lua @@ -0,0 +1,325 @@ +desertores = {} +desertores.registered_ores = { + -- Coal + { + ore = "default:stone_with_coal", + clust_scarcity = 8 ^ 3, + clust_num_ores = 9, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + { + ore = "default:stone_with_coal", + clust_scarcity = 8 ^ 3, + clust_num_ores = 8, + clust_size = 3, + y_max = 64, + y_min = -127, + }, + { + ore = "default:stone_with_coal", + clust_scarcity = 12 ^ 3, + clust_num_ores = 30, + clust_size = 5, + y_max = -128, + y_min = -31000, + }, + + -- Tin + { + ore = "default:stone_with_tin", + clust_scarcity = 10 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + { + ore = "default:stone_with_tin", + clust_scarcity = 13 ^ 3, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }, + { + ore = "default:stone_with_tin", + clust_scarcity = 10 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }, + + -- Copper + { + ore = "default:stone_with_copper", + clust_scarcity = 9 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + { + ore = "default:stone_with_copper", + clust_scarcity = 12 ^ 3, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }, + { + ore = "default:stone_with_copper", + clust_scarcity = 9 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }, + + -- Iron + { + ore = "default:stone_with_iron", + clust_scarcity = 9 ^ 3, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + { + ore = "default:stone_with_iron", + clust_scarcity = 7 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -255, + }, + + -- Gold + { + ore = "default:stone_with_gold", + clust_scarcity = 13 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + + -- Mese crystal + { + ore = "default:stone_with_mese", + clust_scarcity = 14 ^ 3, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + + -- Diamond + { + ore = "default:stone_with_diamond", + clust_scarcity = 15 ^ 3, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }, + + -- Mese block + { + ore = "default:mese", + clust_scarcity = 36 ^ 3, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }, + + -- Diamond block + { + ore = "default:diamondblock", + wherein = "default:stone", + clust_scarcity = 29 ^ 3, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }, + { + ore = "default:diamondblock", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 38 ^ 3, + clust_num_ores = 3, + clust_size = 2, + y_max = -1024, + y_min = -2047, + }, + { + ore = "default:diamondblock", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 29 ^ 3, + clust_num_ores = 4, + clust_size = 3, + y_max = -2048, + y_min = -31000, + }, +} + +--Dense ores and more ores +local moreores_path = core.get_modpath("moreores") +local denseores_path = core.get_modpath("denseores") +local lumpblocks_path = core.get_modpath("lumpblocks") + +if moreores_path then + table.insert(desertores.registered_ores, { + ore = "moreores:mineral_silver", + clust_scarcity = moreores.silver_chunk_size_high ^ 3, + clust_num_ores = moreores.silver_ore_per_chunk_high, + clust_size = moreores.silver_clust_size_high, + y_min = moreores.silver_min_depth_high, + y_max = moreores.silver_max_depth_high, + }) + table.insert(desertores.registered_ores, { + ore = "moreores:mineral_silver", + clust_scarcity = moreores.silver_chunk_size ^ 3, + clust_num_ores = moreores.silver_ore_per_chunk, + clust_size = moreores.silver_clust_size, + y_min = moreores.silver_min_depth, + y_max = moreores.silver_max_depth, + }) + table.insert(desertores.registered_ores, { + ore = "moreores:mineral_silver", + clust_scarcity = moreores.silver_chunk_size_deep ^ 3, + clust_num_ores = moreores.silver_ore_per_chunk_deep, + clust_size = moreores.silver_clust_size_deep, + y_min = moreores.silver_min_depth_deep, + y_max = moreores.silver_max_depth_deep + }) + table.insert(desertores.registered_ores, { + ore = "moreores:mineral_mithril", + clust_scarcity = moreores.mithril_chunk_size_high ^ 3, + clust_num_ores = moreores.mithril_ore_per_chunk_high, + clust_size = moreores.mithril_clust_size_high, + y_min = moreores.mithril_min_depth_high, + y_max = moreores.mithril_max_depth_high, + }) +end + +if denseores_path then + table.insert(desertores.registered_ores, { + ore = "denseores:large_mese_ore", + wherein = "default:stone_with_mese", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + y_min = -31000, + y_max = -64, + }) + table.insert(desertores.registered_ores, { + ore = "denseores:large_diamond_ore", + wherein = "default:stone_with_diamond", + clust_scarcity = 14, + clust_num_ores = 2, + clust_size = 2, + y_min = -31000, + y_max = -128, + }) + table.insert(desertores.registered_ores, { + ore = "default:mese", + wherein = "denseores:large_mese_ore", + clust_scarcity = 36, + clust_num_ores = 1, + clust_size = 1, + y_min = -31000, + y_max = -64, + }) + table.insert(desertores.registered_ores, { + ore = "default:diamondblock", + wherein = "denseores:large_diamond_ore", + clust_scarcity = 38, + clust_num_ores = 1, + clust_size = 1, + y_min = -31000, + y_max = -128, + }) +end + +if moreores_path and denseores_path then + table.insert(desertores.registered_ores, { + ore = "denseores:large_mithril_ore", + wherein = "moreores:mineral_mithril", + clust_scarcity = 12, + clust_num_ores = 2, + clust_size = 2, + y_min = -31000, + y_max = 64, + }) + table.insert(desertores.registered_ores, { + ore = "denseores:large_silver_ore", + wherein = "moreores:mineral_silver", + clust_scarcity = 12, + clust_num_ores = 2, + clust_size = 2, + y_min = -31000, + y_max = 64, + }) + + if lumpblocks_path then + table.insert(desertores.registered_ores, { + ore = "lumpblocks:mithril_block", + wherein = "denseores:large_mithril_ore", + clust_scarcity = 39, + clust_num_ores = 1, + clust_size = 1, + y_min = -31000, + y_max = 64, + }) + end +end + +if moreores_path and lumpblocks_path then + table.insert(desertores.registered_ores, { + ore = "lumpblocks:mithril_block", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 39 ^ 3, + clust_num_ores = 2, + clust_size = 1, + y_min = moreores.mithril_min_depth_high, + y_max = moreores.mithril_max_depth_high, + }) + table.insert(desertores.registered_ores, { + ore = "lumpblocks:mithril_block", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 39 ^ 3, + clust_num_ores = 2, + clust_size = 1, + y_min = moreores.mithril_min_depth, + y_max = moreores.mithril_max_depth, + }) + table.insert(desertores.registered_ores, { + ore = "lumpblocks:mithril_block", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 30 ^ 3, + clust_num_ores = 3, + clust_size = 2, + y_min = moreores.mithril_min_depth_deep, + y_max = moreores.mithril_max_depth_deep, + }) +end + +for _, def in ipairs(desertores.registered_ores) do + def.ore_type = def.ore_type or "scatter" + def.wherein = def.wherein or { + "default:desert_stone", + "default:sandstone", + "default:desert_sandstone", + "default:silver_sandstone", + "default:permafrost", + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:cave_ice", + "default:gravel" + } + core.register_ore(def) +end diff --git a/mods/desertores/mod.conf b/mods/desertores/mod.conf new file mode 100644 index 0000000..e9d441d --- /dev/null +++ b/mods/desertores/mod.conf @@ -0,0 +1,6 @@ +name = desertores +title = Desert Ores +depends = default +optional_depends = moreores, denseores, lumpblocks, technic, elepower_dynamics +author = DustyDave961 +supported_games = minetest_game diff --git a/mods/dfcaverns/.gitattributes b/mods/dfcaverns/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/mods/dfcaverns/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/mods/dfcaverns/.gitmodules b/mods/dfcaverns/.gitmodules new file mode 100644 index 0000000..b333b02 --- /dev/null +++ b/mods/dfcaverns/.gitmodules @@ -0,0 +1,8 @@ +[submodule "mapgen_helper"] + path = mapgen_helper + url = https://github.com/minetest-mods/mapgen_helper + branch = master +[submodule "subterrane"] + path = subterrane + url = https://github.com/minetest-mods/subterrane + branch = master diff --git a/mods/dfcaverns/API.md b/mods/dfcaverns/API.md new file mode 100644 index 0000000..651c852 --- /dev/null +++ b/mods/dfcaverns/API.md @@ -0,0 +1,60 @@ +# Chat commands + +There are not many chat commands provided by this modpack since it's primarily a mapgen mod. Only one is available to non-server-admins: + +`mute_df_ambience`: Mutes or unmutes ambient sounds in deep caverns. This muted state is saved per-player, so players that are bothered by ambient sounds can disable them for themselves. + +The following are only available for server admins: + +`find_pit`: Finds the nearest glowing pit in the Underworld layer. + +`mapgen_helper_loc` and `mapgen_helper_tour`: only available if the `mapgen_helper_log_locations` setting has been set to true. mapgen_helper will then record the locations of various types of mapgen feature as they are generated, and these commands will teleport the server admin to them. + +`find_pit_caves`: Lists the locations of nearby vertical shaft caverns, including the top and bottom elevations. + +# APIs + +Not all APIs are listed here, this list focuses on APIs that modders may wish to use in sub-mods that modify DF Caverns' functionality in the existing context of this modpack. + +## bones_loot + +This mod populates the bones in the underworld with loot. + +`bones_loot.register_loot` + +Uses same table format as dungeon_loot from the default minetest_game. eg, {{name = "bucket:bucket_water", chance = 0.45, types = {"sandstone", "desert"}}, + +if dungeon_loot is installed it uses dungeon_loot's registration function directly. + +## chasms + +`chasms.register_ignore(node_name)`: Use this to set node types to be left alone by chasm-carving + +`chasms.is_in_chasm(pos)`: returns true if pos is inside a chasm. + +## df_ambience + +`df_ambience.add_set(def)`: adds a sound set to the ambience mod. See soundsets.lua for a bunch of examples of what can go in the `def` table. + +This mod has a lot of similarities to the [https://notabug.org/TenPlus1/ambience](ambience) mod, but after struggling to get that mod to "play nice" with df_caverns' needs it turned out to be easier to just re-implement the specific parts of the mod that were needed here. + +## df_caverns + +`df_caverns.get_biome(pos)`: returns the string name of the df_cavern biome that pos is located in, or nil if it's outside of any of df_caverns' cavern layers. df_caverns uses a homebrew biome system rather than the built-in biome registration system. + +`df_caverns.is_ground_content(node_id)`: used by subterrane's mapgen to avoid removing nodes placed by df_caverns' mapgen. If you're adding new map features inside dfcavern's hollow spaces and they're being chopped in half at mapblock boundaries then you may be able to solve this by overriding this method with one that recognizes the nodes you're adding. + +This was never really expected to be something that someone would need to do, though, so this is a little clunky. If you're having trouble with this please file an issue. + +`df_caverns.populate_puzzle_chest(pos)`: When a "puzzle chest" is generated in the Underworld ruins this method gets called to populate its contents. If you wish to override the contents of the puzzle chest then you can override this method. Place items in the "main" inventory at the pos parameter's location. + +## looped_node_sound + +`looped_node_sound.register(def)`: A simple mod for making nodes emit a looped sound when the player is nearby. + + def = { + node_list = {"df_trees:torchspine_1_lit"}, + sound = "dfcaverns_torchspine_loop", + max_gain = 0.5, + gain_per_node = 0.05, + } diff --git a/mods/dfcaverns/LICENSE.txt b/mods/dfcaverns/LICENSE.txt new file mode 100644 index 0000000..f0b5f69 --- /dev/null +++ b/mods/dfcaverns/LICENSE.txt @@ -0,0 +1,26 @@ +Dwarf Fortress is copyright 2018 by Tarn Adams. This mod uses no assets or other copyrighted materials from Dwarf Fortress. + +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2021 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/README.md b/mods/dfcaverns/README.md new file mode 100644 index 0000000..9b397c6 --- /dev/null +++ b/mods/dfcaverns/README.md @@ -0,0 +1,45 @@ +Inspired by the world of Dwarf Fortress, this mod adds a series of vast cavern layers to the depths of Minetest with a variety of biomes that are populated with the flora of Dwarf Fortress. + +## Cavern Layers + +The underground is divided into a number of cavern "layers" with a variety of biomes and other features distributed throughout. As one goes deeper one will find increasingly bizzare flora and exotic environments that provide new challenges and opportunities for players. + +The uppermost layer is home to relatively conventional tree-like fungal growths of Fungiwood and Tower-Cap mushrooms. These provide a source of underground wood. Also found in this region are plump helmets (an edible farmable mushroom), and cave wheat (a pale grass-like growth whose seeds can be ground for flour). + +The next layer down has more exotic growths. Here you can find Goblin Cap mushrooms, the squatter cousins of the Tower Caps. Spore Trees sprout in the warmer and wetter corners of the caverns, raising a climbable three-dimensional mesh or hyphyae above the ground that emits a gentle rain of spore powder. Tunnel Tubes grow in the hottest regions - tall, curved stalks with fruiting bodies at the tips that burst violently when ripe. Smaller growths found here include plump helmets, cave wheat, pig tails (a fibrous fungus that can be grown and harvested for thread) and sweet pods (whose fruiting bodies can be milled for sugar or processed into syrup). + +In the third cavern layer yet stranger forms of life flourish in the hostile conditions. The coal-black caverns of the Black Cap forests, rich with carbonaceous deposits that have accumulated over millions of years and lit by smouldering Torchspines, are found here. The frigid Nethercaps, blue-tinted mushrooms leaching heat out of their environment in ways that shouldn't be thermodynamically possible, fill their caverns with ice and snow. In the hotter areas the vicious Bloodthorn grows, with wicked spines that suck moisture from anything they can pierce. In caves too dry to support biological life enormous glowing crystals grow instead. Smaller plants that can be found here include quarry bushes (farmable for their spicy leaves) and dimple cups (whose eponymous parts can be ground to produce a brilliant blue dye). + +After the third layer are the shores of the Sunless Sea, the ultimate destination of all water that flows downward through the twisty caves of Minetest. Familiar growths crowd its fertile shores, with Tower Cap, Goblin Cap, Fungiwood and Spore Trees able to take root in this relatively hospitable zone. The caverns of the Sunless Sea are vast in extent but are mostly flooded with water, and below the surface grows treacherous Snareweed and underwater citadels of softly-glowing Cave Coral. Twisting rivers connect the various caverns of the Sunless Sea. + +Below the Sunless Sea are seas of a more dangerous sort: lakes of oil and the magma ocean. These caverns are filled with dangerous substances, though there are riches to be had as well; mineral growths fed by the heat and pressure and bountiful fuel sources. + +At the very foundation of the world lies an ancient impenetrable realm. There are signs that life once existed here but it is now long gone. Its dead hollows rest on a layer of Slade, a dense material impervious to conventional mining efforts. + +Unconventional methods of penetrating the Slade do exist, however. And should it be breached, the exotic Primordial cavern layer can be found beneath. + +## Other Features + +The giant caverns generated by this mod differ slightly from the default giant caverns found in some mapgens, they use an additional source of noise to generate more ledges and horizontal floors. They also contain stalactites and stalagmites of various sizes - from single-node spikes decorating the default twisty tunnels to mountainous behemoths in the main caverns that can reach tens of meters in diameter and hundreds of meters in height. + +The trees and plants mentioned above are all farmable, but in contrast to the usual farmable plants and trees they only grow in the *absence* of bright light. Attempting to plant them in sunlight will kill them. A set of recipes is added for cooking the edible ones into a variety of biscuits, stews, and roasts, and sweet pods can be refined into syrup. + +Some of the other cave decorations provide dim bioluminescent lighting in some caverns. Cave moss and hanging glow-worms are most common. There is also non-glowing floor fungus found coating the stone in less hospitable biomes, capable of spreading to adjacent cobblestone structures like a slow-creeping infection. + +[A more comprehensive guide can be found here.](guide.md) + +[APIs and player commands can be found here.](API.md) + +## Synergies with other mods + +"[dynamic liquid](https://github.com/minetest-mods/dynamic_liquid)" is recommended to provide Dwarf Fortress-like fluid dynamics and to deal with water that might spill into caverns. + +"[magma conduits](https://github.com/FaceDeer/magma_conduits/)" is recommended for a Dwarf Fortress like magmatic landscape. If not magma conduits, it is at least recommended that mapgen magma be disabled on whatever mapgen you're adding this mod to; mapgen magma is difficult for lua mapgens like this to tidy up and it will often spill into caverns setting large swaths of fungal forests on fire. Depending on the mapgen you're using this mod with you could do this by setting ``mgv5_lava_depth, mgv7_lava_depth``, ``mgcarpathian_lava_depth``, ``mgflat_lava_depth``, ``mgfractal_lava_depth``, or ``mgvalleys_lava_depth`` to -2800 (near the default depth of the magma sea). + +The "[doc](https://forum.minetest.net/viewtopic.php?f=9&t=15912&p=240152)" mod is supported to provide in-game documentation for all of the new items and nodes this mod adds. + +"[ropes](https://github.com/minetest-mods/ropes)" are very useful for navigating some of the large open spaces this mod provides. Some are large enough that a [glider](https://github.com/CBugDCoder/glider) may be well suited. + +"[radiant damage](https://github.com/FaceDeer/radiant_damage)" greatly increases the danger of the Magma Sea if heat radiance is enabled, as well as several of the rare crystals in the deeper layers that emit Mese radiation if that damage type is enabled. + +Adding "[named_waypoints](https://github.com/FaceDeer/named_waypoints)" and "[namegen](https://github.com/FaceDeer/namegen)" will provide some landmarks in the Underworld that a player can use to navigate by. \ No newline at end of file diff --git a/mods/dfcaverns/big_webs/LICENSE.txt b/mods/dfcaverns/big_webs/LICENSE.txt new file mode 100644 index 0000000..6bf46b1 --- /dev/null +++ b/mods/dfcaverns/big_webs/LICENSE.txt @@ -0,0 +1,24 @@ +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2021 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/big_webs/init.lua b/mods/dfcaverns/big_webs/init.lua new file mode 100644 index 0000000..a540f6a --- /dev/null +++ b/mods/dfcaverns/big_webs/init.lua @@ -0,0 +1,201 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +local sound +if df_dependencies.sound_leaves then + sound = df_dependencies.sound_leaves() +end + +local get_node_box = function(connector_thickness) + return { + type = "connected", + --fixed = {-hub_thickness,-hub_thickness,-hub_thickness,hub_thickness,hub_thickness,hub_thickness}, + connect_top = {-connector_thickness, 0, -connector_thickness, connector_thickness, 0.5, connector_thickness}, + connect_bottom = {-connector_thickness, -0.5, -connector_thickness, connector_thickness, 0, connector_thickness}, + connect_back = {-connector_thickness, -connector_thickness, 0, connector_thickness, connector_thickness, 0.5}, + connect_right = {0, -connector_thickness, -connector_thickness, 0.5, connector_thickness, connector_thickness}, + connect_front = {-connector_thickness, -connector_thickness, -0.5, connector_thickness, connector_thickness, 0}, + connect_left = {-0.5, -connector_thickness, -connector_thickness, 0, connector_thickness, connector_thickness}, + disconnected = {-connector_thickness, -connector_thickness, -connector_thickness, connector_thickness, connector_thickness, connector_thickness}, + } +end + +local anchor_groups = {"group:soil", "group:stone", "group:tree", "group:wood", "group:webbing", "group:solid"} + +local in_anchor_group = function(name) + for _, group in pairs(anchor_groups) do + if minetest.get_item_group(name, string.sub(group, 7)) then + return true + end + end + if name == "ignore" then + return true + end +end + +local cardinal_directions = { + {x=1,y=0,z=0}, + {x=-1,y=0,z=0}, + {x=0,y=1,z=0}, + {x=0,y=-1,z=0}, + {x=0,y=0,z=1}, + {x=0,y=0,z=-1} +} + +local cardinal_planes = { + {3,5}, + {3,5}, + {1,5}, + {1,5}, + {1,3}, + {1,3}, +} + +local insert_if_not_in_hashtable = function(pos, insert_into, if_not_in) + local hash = minetest.hash_node_position(pos) + if if_not_in[hash] then + return + end + table.insert(insert_into, pos) +end + +-- flood fill through the web to get all web and anchor locations +local get_web_nodes = function(pos, webs, anchors) + local to_check = {} + table.insert(to_check, pos) + while next(to_check) ~= nil do + local check_pos = table.remove(to_check) + local check_node = minetest.get_node(check_pos) + if minetest.get_item_group(check_node.name, "webbing") > 0 then + webs[minetest.hash_node_position(check_pos)] = true + for _, dir in pairs(cardinal_directions) do + insert_if_not_in_hashtable(vector.add(check_pos, dir), to_check, webs) + end + elseif in_anchor_group(check_node.name) then + anchors[minetest.hash_node_position(check_pos)] = true + end + end +end + +local web_line = function(pos, dir, distance) + local anchored + local web_spine = {} + for i = 0, distance do + local web_pos = vector.add(pos, vector.multiply(dir,i)) + local node_name = minetest.get_node(web_pos).name + if node_name == "air" or node_name == "big_webs:webbing" then + table.insert(web_spine, web_pos) + elseif in_anchor_group(node_name) then + anchored=true + break + else + anchored=false + break + end + end + + if anchored then + for _, web_pos in pairs(web_spine) do + if math.random() < 0.9 then + minetest.set_node(web_pos, {name="big_webs:webbing"}) + end + end + return web_spine + end + return nil +end + +local generate_web = function(pos) + local dir_choice = math.random(1, 6) + local dir = cardinal_directions[dir_choice] + local web_spine = web_line(pos, dir, 30) + if web_spine then + local dir2 = cardinal_directions[cardinal_planes[dir_choice][math.random(1, 2)]] + local dir2_opposite = vector.multiply(dir2, -1) + for _, web_pos in pairs(web_spine) do + web_line(web_pos, dir2, 15) + web_line(web_pos, dir2_opposite, 15) + end + end +end + +minetest.register_node("big_webs:webbing", { + description = S("Giant Cave Spider Webbing"), + _doc_items_longdesc = S("Thick ropes of sticky, springy silk, strung between cavern walls in hopes of catching bats and even larger beasts."), + _doc_items_usagehelp = S("Webbing can be collected and re-strung elsewhere to aid in climbing. It absorbs all falling damage when you land on it."), + tiles = { + {name="big_webs.png"}, + }, + use_texture_alpha = "blend", + connects_to = anchor_groups, + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + drawtype = "nodebox", + node_box = get_node_box(0.0625), + collision_box = get_node_box(0.0625), + inventory_image = "big_webs_item.png", + wield_image = "big_webs_item.png", + paramtype = "light", + is_ground_content = false, + climbable = true, + groups = {snappy = 2, choppy = 2, webbing = 1, shearsy = 1, swordy=1, flammable=1, destroy_by_lava_flow=1, fall_damage_add_percent=-100, bouncy=20}, + sounds = sound, + on_construct = function(pos) + minetest.get_node_timer(pos):start(30) + end, + on_destruct = function(pos) + for _, dir in pairs(cardinal_directions) do + local neighbor_pos = vector.add(pos, dir) + if minetest.get_item_group(minetest.get_node(neighbor_pos).name, "webbing") > 0 then + minetest.get_node_timer(neighbor_pos):start(30) + end + end + minetest.get_node_timer(pos):stop() + end, + on_timer = function(pos, elapsed) + local webs = {} + local anchors = {} + get_web_nodes(pos, webs, anchors) + local first_anchor = next(anchors) + for hash, _ in pairs(webs) do + local web_pos = minetest.get_position_from_hash(hash) + if first_anchor == nil then + -- unsupported web + minetest.set_node(web_pos, {name="air"}) + minetest.item_drop(ItemStack("big_webs:webbing"), nil, web_pos) + end + minetest.get_node_timer(web_pos):stop() -- no need to recheck + end + end, + _mcl_blast_resistance = 1.0, + _mcl_hardness = 0.5, +}) + +minetest.register_node("big_webs:web_egg", { + description = S("Giant Cave Spider Web Generator"), + tiles = { + {name="big_webs.png"}, + }, + use_texture_alpha = "blend", + connects_to = anchor_groups, + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + drawtype = "nodebox", + node_box = get_node_box(0.0625), + collision_box = get_node_box(0.0625), + inventory_image = "big_webs_item.png", + wield_image = "big_webs_item.png", + paramtype = "light", + is_ground_content = false, + climbable = true, + floodable = true, + groups = {snappy = 2, choppy = 2, webbing = 1, flammable=1, fall_damage_add_percent=-100, bouncy=20}, + sounds = sound, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name="air"}) + generate_web(pos) + end, + _mcl_blast_resistance = 1.0, + _mcl_hardness = 0.5, +}) \ No newline at end of file diff --git a/mods/dfcaverns/big_webs/locale/template.txt b/mods/dfcaverns/big_webs/locale/template.txt new file mode 100644 index 0000000..22bfe9d --- /dev/null +++ b/mods/dfcaverns/big_webs/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: big_webs + + +### init.lua ### + +Giant Cave Spider Web Generator= +Giant Cave Spider Webbing= + +Thick ropes of sticky, springy silk, strung between cavern walls in hopes of catching bats and even larger beasts.= + +Webbing can be collected and re-strung elsewhere to aid in climbing. It absorbs all falling damage when you land on it.= + diff --git a/mods/dfcaverns/big_webs/mod.conf b/mods/dfcaverns/big_webs/mod.conf new file mode 100644 index 0000000..cf1a679 --- /dev/null +++ b/mods/dfcaverns/big_webs/mod.conf @@ -0,0 +1,2 @@ +name=big_webs +optional_depends=df_dependencies \ No newline at end of file diff --git a/mods/dfcaverns/big_webs/textures/big_webs.png b/mods/dfcaverns/big_webs/textures/big_webs.png new file mode 100644 index 0000000..5e82942 Binary files /dev/null and b/mods/dfcaverns/big_webs/textures/big_webs.png differ diff --git a/mods/dfcaverns/big_webs/textures/big_webs_item.png b/mods/dfcaverns/big_webs/textures/big_webs_item.png new file mode 100644 index 0000000..8dc021d Binary files /dev/null and b/mods/dfcaverns/big_webs/textures/big_webs_item.png differ diff --git a/mods/dfcaverns/bones_loot/LICENSE.txt b/mods/dfcaverns/bones_loot/LICENSE.txt new file mode 100644 index 0000000..26663a0 --- /dev/null +++ b/mods/dfcaverns/bones_loot/LICENSE.txt @@ -0,0 +1,22 @@ +License for Code +---------------- + +Copyright (C) 2019 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/bones_loot/init.lua b/mods/dfcaverns/bones_loot/init.lua new file mode 100644 index 0000000..2989626 --- /dev/null +++ b/mods/dfcaverns/bones_loot/init.lua @@ -0,0 +1,205 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local dungeon_loot_path = minetest.get_modpath("dungeon_loot") + +bones_loot = {} + +local bones_formspec = + "size[8,9]" + .."list[current_name;main;0,0.3;8,4;]" + .."list[current_player;main;0,4.85;8,1;]" + .."list[current_player;main;0,6.08;8,3;8]" + .."listring[current_name;main]" + .."listring[current_player;main]" + ..df_dependencies.get_itemslot_bg(0,0.3,8,4) + ..df_dependencies.get_itemslot_bg(0,4.85,8,1) + ..df_dependencies.get_itemslot_bg(0,6.08,8,3) +if minetest.get_modpath("default") then + bones_formspec = bones_formspec .. default.get_hotbar_bg(0,4.85) +end + +if minetest.get_modpath("bones") then + df_dependencies.node_name_bones = "bones:bones" +else + + local function drop_item_stack(pos, stack) + if not stack or stack:is_empty() then return end + local drop_offset = vector.new(math.random() - 0.5, 0, math.random() - 0.5) + minetest.add_item(vector.add(pos, drop_offset), stack) + end + + minetest.register_node("bones_loot:bones", { + description = S("Bones"), + tiles = { + "bones_top.png^[transform2", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {oddly_diggable_by_hand=1, handy=1, container=2}, + sounds = df_dependencies.sound_gravel(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bones_formspec) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + + on_blast = function(pos, intensity) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, inv:get_size("main") do + drop_item_stack(pos, inv:get_stack("main", i)) + end + meta:from_table() + minetest.remove_node(pos) + if math.random(1, math.floor((intensity or 1) * 2)) ~= 1 then return end + drop_item_stack(pos, "bones_loot:bones") + end + }) + + df_dependencies.node_name_bones = "bones_loot:bones" +end + +local bones_node = df_dependencies.node_name_bones + +local local_loot = {} +local local_loot_register = function(t) + if t.name ~= nil then + t = {t} -- single entry + end + for _, loot in ipairs(t) do + table.insert(local_loot, loot) + end +end + +-- we could do this for the dungeon_loot registered loot table as well, +-- but best not to meddle in other mods' internals if it can be helped. +local clean_up_local_loot = function() + if local_loot == nil then return end + for i = #local_loot, 1, -1 do + if not minetest.registered_items[local_loot[i].name] then + table.remove(local_loot, i) + end + end +end + +-- Uses same table format as dungeon_loot +-- eg, {name = "bucket:bucket_water", chance = 0.45, types = {"sandstone", "desert"}}, +-- if dungeon_loot is installed it uses dungeon_loot's registration function directly. +if dungeon_loot_path then + bones_loot.register_loot = dungeon_loot.register +else + bones_loot.register_loot = local_loot_register + minetest.after(0, clean_up_local_loot) +end + +local get_loot_list = function(pos, loot_type, exclusive_loot_type) + local loot_table + if dungeon_loot_path then + loot_table = dungeon_loot.registered_loot + else + loot_table = local_loot + end + + local item_list = {} + local pos_y = pos.y + for _, loot in ipairs(loot_table) do + if loot.y == nil or (pos_y >= loot.y[1] and pos_y <= loot.y[2]) then + if (not exclusive_loot_type and loot.types == nil) or + (loot.types and table.indexof(loot.types, loot_type) ~= -1) then + table.insert(item_list, loot) + end + end + end + + return item_list +end + +local shuffle = function(tbl) + for i = #tbl, 2, -1 do + local rand = math.random(i) + tbl[i], tbl[rand] = tbl[rand], tbl[i] + end + return tbl +end + +-- "exclusive" set to true means that loot table entries without a loot_type won't be considered. +bones_loot.get_loot = function(pos, loot_type, max_stacks, exclusive_loot_type) + local item_list = get_loot_list(pos, loot_type, exclusive_loot_type) + shuffle(item_list) + + -- apply chances / randomized amounts and collect resulting items + local items = {} + for _, loot in ipairs(item_list) do + if math.random() <= loot.chance then + local itemdef = minetest.registered_items[loot.name] + if itemdef then + local amount = 1 + if loot.count ~= nil then + amount = math.random(loot.count[1], loot.count[2]) + end + + if itemdef.tool_capabilities then + for n = 1, amount do + local wear = math.random(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear + table.insert(items, ItemStack({name = loot.name, wear = wear})) + max_stacks = max_stacks - 1 + if max_stacks <= 0 then break end + end + else + local stack_max = itemdef.stack_max + while amount > 0 do + table.insert(items, ItemStack({name = loot.name, count = math.min(stack_max, amount)})) + amount = amount - stack_max + max_stacks = max_stacks - 1 + if max_stacks <= 0 then break end + end + end + end + end + if max_stacks <= 0 then break end + end + return items +end + +bones_loot.place_bones = function(pos, loot_type, max_stacks, infotext, exclusive_loot_type) + minetest.set_node(pos, {name=bones_node, param2 = math.random(1,4)-1}) + local meta = minetest.get_meta(pos) + if infotext == nil then + infotext = S("Someone's old bones") + end + meta:set_string("infotext", infotext) + meta:set_string("formspec", bones_formspec) + + if max_stacks and max_stacks > 0 then + local loot = bones_loot.get_loot(pos, loot_type, max_stacks, exclusive_loot_type) + local inv = meta:get_inventory() + inv:set_size("main", 8 * 4) + for _, item in ipairs(loot) do + inv:add_item("main", item) + end + end +end + +minetest.register_lbm({ + label = "Repair underworld bones formspec", + name = "bones_loot:repair_underworld_bones_formspec", + nodenames = {bones_node}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + if not meta:get("formspec") then + meta:set_string("formspec", bones_formspec) + end + end, +}) diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.de.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.de.tr new file mode 100644 index 0000000..4ab0196 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.de.tr @@ -0,0 +1,19 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Knochen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Someone's old bones=Jemandes alte Knochen + + +##### not used anymore ##### + +@1's old bones=Alte Knochen von @1 +@1 died at @2.=@1 starb bei @2. +@1 died at @2, and dropped their inventory.=@1 starb bei @2 und ließ das Inventar fallen. +@1 died at @2, and bones were placed.=@1 starb bei @2 und Knochen wurden platziert. +@1's fresh bones=Frische Knochen von @1 +@1's bones=Knochen von @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.eo.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.eo.tr new file mode 100644 index 0000000..442ee78 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.eo.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ostoj +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=La malfreŝaj ostoj de @1 +@1 died at @2.=@1 mortis ĉe @2 +@1 died at @2, and dropped their inventory.=@1 mortis ĉe @2, kaj delasis sian stokon. +@1 died at @2, and bones were placed.=@1 mortis ĉe @2, kaj ostoj estas demetitaj. +@1's fresh bones=La freŝaj ostoj de @1 +@1's bones=La ostoj de @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.es.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.es.tr new file mode 100644 index 0000000..d652865 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.es.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Huesos +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Huesos antiguos de @1 +@1 died at @2.=@1 murió en @2. +@1 died at @2, and dropped their inventory.=@1 murió en @2, y su inventario se desprendió. +@1 died at @2, and bones were placed.=@1 murió en @2, y sus huesos fueron depositados. +@1's fresh bones=Huesos recientes de @1 +@1's bones=Huesos de @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.fr.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.fr.tr new file mode 100644 index 0000000..3d0903c --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.fr.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Os +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Vieux os de @1 +@1 died at @2.=@1 est mort à @2. +@1 died at @2, and dropped their inventory.=@1 est mort à @2 et a laissé tomber son inventaire. +@1 died at @2, and bones were placed.=@1 est mort à @2 et ses os ont été placés. +@1's fresh bones=Os frais de @1 +@1's bones=Os de @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.id.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.id.tr new file mode 100644 index 0000000..ab33b9a --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.id.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Tulang +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2 dan meninggalkan barangnya. +@1 died at @2, and bones were placed.=@1 mati di @2 dan tulangnya diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.it.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.it.tr new file mode 100644 index 0000000..161d887 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.it.tr @@ -0,0 +1,19 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ossa +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Someone's old bones=Le vecchie ossa di qualcuno + + +##### not used anymore ##### + +@1's old bones=Ossa vecchie di @1 +@1 died at @2.=@1 è morto alla posizione @2. +@1 died at @2, and dropped their inventory.=@1 è morto alla posizione @2, e ha lasciato a terra il contenuto del suo inventario. +@1 died at @2, and bones were placed.=@1 è morto alla posizione @2, e vi sono state posizionate delle ossa. +@1's fresh bones=Ossa fresche di @1 +@1's bones=Ossa di @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.ja.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.ja.tr new file mode 100644 index 0000000..2355934 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.ja.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=骨 +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1の古い骨 +@1 died at @2.=@1は@2で死亡しました。 +@1 died at @2, and dropped their inventory.=@1は@2で死亡して持ち物を落としました。 +@1 died at @2, and bones were placed.=@1は@2で死亡して骨が残されました。 +@1's fresh bones=@1の新鮮な骨 +@1's bones=@1の骨 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.jbo.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.jbo.tr new file mode 100644 index 0000000..75fabe8 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.jbo.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=lo bongu gunma +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=.i ti tolci'o ke bongu gunma po'a la'o zo'i.@1.zo'i +@1 died at @2.=.i la'o zo'i.@1.zo'i pu morsi di'o lo me zoi pos.@2.pos. +@1 died at @2, and dropped their inventory.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije ly. te farlu lo me le dacti liste po ly. +@1 died at @2, and bones were placed.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije lo bongu gunma pu se punji +@1's fresh bones=.i ti cnino ke bongu gunma po'a la'o zo'i.@1.zo'i +@1's bones=.i ti bongu gunma po'a la'o zo'i.@1.zo'i diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.ms.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.ms.tr new file mode 100644 index 0000000..931518e --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.ms.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Tulang +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2, dan menjatuhkan inventorinya. +@1 died at @2, and bones were placed.=@1 mati di @2, dan tulang diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.pl.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.pl.tr new file mode 100644 index 0000000..818f0f0 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.pl.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Kości +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Stare kości @1 +@1 died at @2.=@1 umarł w @2. +@1 died at @2, and dropped their inventory.=@1 umarł w @2, i upuścił swój ekwipunek. +@1 died at @2, and bones were placed.=@1 umarł w @2, kości zostały położone. +@1's fresh bones=Świeże kości @1 +@1's bones=Kości @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.pt_BR.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.pt_BR.tr new file mode 100644 index 0000000..42b81d8 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ossos +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Ossos antigos de @1 +@1 died at @2.=@1 morreu em @2. +@1 died at @2, and dropped their inventory.=@1 morreu em @2, e seu inventário foi derrubado. +@1 died at @2, and bones were placed.=@1 morreu em @2, e os ossos foram colocados. +@1's fresh bones=Ossos recentes de @1 +@1's bones=Ossos de @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.ru.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.ru.tr new file mode 100644 index 0000000..6aa0c61 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.ru.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Кости +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Старые кости @1 +@1 died at @2.=@1 умер в @2. +@1 died at @2, and dropped their inventory.=@1 умер в @2 и потерял содержимое своего инвентаря. +@1 died at @2, and bones were placed.=@1 умер в @2, помещены кости. +@1's fresh bones=новые кости @1 +@1's bones=кости @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.sk.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.sk.tr new file mode 100644 index 0000000..c4feb3a --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.sk.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Kosti +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Staré kosti hráča @1 +@1 died at @2.=@1 zomrel na pozícií @2. +@1 died at @2, and dropped their inventory.=@1 zomrel na pozícií @2 a vysypal svoj inventár. +@1 died at @2, and bones were placed.=@1 zomrel na pozícií @2 a ostali po ňom kosti. +@1's fresh bones=Čerstvé kosti hráča @1 +@1's bones=Kosti hráča @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.sv.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.sv.tr new file mode 100644 index 0000000..8be0930 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.sv.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ben +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1s Gamla ben +@1 died at @2.=@1 dog på @a. +@1 died at @2, and dropped their inventory.=@1 dog på @a, och tappade deras saker. +@1 died at @2, and bones were placed.=@1 dog på @2, och deras ben var placerade. +@1's fresh bones=@1s färska ben +@1's bones=@1s ben diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.uk.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.uk.tr new file mode 100644 index 0000000..23b44ac --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.uk.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Кістки +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=старі кістки @1 +@1 died at @2.=@1 помер в @2. +@1 died at @2, and dropped their inventory.=@1 помер в @2, та загубив вміст свого інвентарю. +@1 died at @2, and bones were placed.=@1 помер в @2, розміщені кістки. +@1's fresh bones=нові кістки @1 +@1's bones=кістки @1 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.zh_CN.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.zh_CN.tr new file mode 100644 index 0000000..73f667f --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.zh_CN.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=骨骸 +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1的旧骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丢掉了所有物品。 +@1 died at @2, and bones were placed.=@1在@2死亡,已放置骨骸。 +@1's fresh bones=@1的新鲜骨骸 +@1's bones=@1的骨骸 diff --git a/mods/dfcaverns/bones_loot/locale/bones_loot.zh_TW.tr b/mods/dfcaverns/bones_loot/locale/bones_loot.zh_TW.tr new file mode 100644 index 0000000..61384c4 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/bones_loot.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=骨骸 +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1的舊骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丟掉了物品欄。 +@1 died at @2, and bones were placed.=@1在@2死亡,骨骸被放置。 +@1's fresh bones=@1的新鮮骨骸 +@1's bones=@1的骨骸 diff --git a/mods/dfcaverns/bones_loot/locale/template.txt b/mods/dfcaverns/bones_loot/locale/template.txt new file mode 100644 index 0000000..7857136 --- /dev/null +++ b/mods/dfcaverns/bones_loot/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones= +Someone's old bones= diff --git a/mods/dfcaverns/bones_loot/mod.conf b/mods/dfcaverns/bones_loot/mod.conf new file mode 100644 index 0000000..7591e25 --- /dev/null +++ b/mods/dfcaverns/bones_loot/mod.conf @@ -0,0 +1,4 @@ +name = bones_loot +description = An API that allows bones to be placed procedurally with randomly generated loot +depends = df_dependencies +optional_depends = dungeon_loot, bones \ No newline at end of file diff --git a/mods/dfcaverns/bones_loot/textures/bones_bottom.png b/mods/dfcaverns/bones_loot/textures/bones_bottom.png new file mode 100644 index 0000000..d3d5d32 Binary files /dev/null and b/mods/dfcaverns/bones_loot/textures/bones_bottom.png differ diff --git a/mods/dfcaverns/bones_loot/textures/bones_front.png b/mods/dfcaverns/bones_loot/textures/bones_front.png new file mode 100644 index 0000000..1617d8f Binary files /dev/null and b/mods/dfcaverns/bones_loot/textures/bones_front.png differ diff --git a/mods/dfcaverns/bones_loot/textures/bones_license.txt b/mods/dfcaverns/bones_loot/textures/bones_license.txt new file mode 100644 index 0000000..fe52584 --- /dev/null +++ b/mods/dfcaverns/bones_loot/textures/bones_license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + diff --git a/mods/dfcaverns/bones_loot/textures/bones_rear.png b/mods/dfcaverns/bones_loot/textures/bones_rear.png new file mode 100644 index 0000000..05ee2a1 Binary files /dev/null and b/mods/dfcaverns/bones_loot/textures/bones_rear.png differ diff --git a/mods/dfcaverns/bones_loot/textures/bones_side.png b/mods/dfcaverns/bones_loot/textures/bones_side.png new file mode 100644 index 0000000..c8ac505 Binary files /dev/null and b/mods/dfcaverns/bones_loot/textures/bones_side.png differ diff --git a/mods/dfcaverns/bones_loot/textures/bones_top.png b/mods/dfcaverns/bones_loot/textures/bones_top.png new file mode 100644 index 0000000..63786da Binary files /dev/null and b/mods/dfcaverns/bones_loot/textures/bones_top.png differ diff --git a/mods/dfcaverns/chasms/LICENSE.txt b/mods/dfcaverns/chasms/LICENSE.txt new file mode 100644 index 0000000..646c3d5 --- /dev/null +++ b/mods/dfcaverns/chasms/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/dfcaverns/chasms/init.lua b/mods/dfcaverns/chasms/init.lua new file mode 100644 index 0000000..1429926 --- /dev/null +++ b/mods/dfcaverns/chasms/init.lua @@ -0,0 +1,190 @@ +local data = {} + +chasms = {} + +local ignore = {} + +-- Use this to set node types to be left alone by chasm-carving +chasms.register_ignore = function(node_name) + ignore[minetest.get_content_id(node_name)] = true +end + +chasms.ignore_content_id = function(content_id) + return ignore[content_id] +end + +local maxy = tonumber(minetest.settings:get("chasms_maxy")) or -50 +local miny = tonumber(minetest.settings:get("chasms_miny")) or -2500 +local falloff = tonumber(minetest.settings:get("chasms_falloff")) or 100 + +local web_probability = 0.15 -- the chance that a given mapblock will have webbing criss-crossing the chasm + +local chasms_threshold = tonumber(minetest.settings:get("chasms_threshold")) or 0.9 +local np_chasms_default = { + offset = 0, + scale = 1, + spread = {x = 50, y = 1000, z = 3000}, + seed = 94586, + octaves = 2, + persist = 0.63, + lacunarity = 2.0, +} +local np_chasms = minetest.settings:get_np_group("chasms_params") or np_chasms_default +-- For some reason, these numbers are returned as strings by get_np_group. +local tonumberize_params = function(params) + params.scale = tonumber(params.scale) + params.lacunarity = tonumber(params.lacunarity) + params.spread.x = tonumber(params.spread.x) + params.spread.y = tonumber(params.spread.y) + params.spread.z = tonumber(params.spread.z) + params.offset = tonumber(params.offset) + params.persistence = tonumber(params.persistence) +end +tonumberize_params(np_chasms) +local nobj_chasm +local chasm_data = {} + +local waver_strength = 8 +local waver_vector = {x=waver_strength, y=0, z=0} +local np_waver = { + offset = 0, + scale = waver_strength, + spread = {x = 50, y = 50, z = 50}, + seed = 49585, + octaves = 2, + persist = 0.63, + lacunarity = 2.0, +} +local nobj_waver +local waver_data = {} + +local minfalloff = miny + falloff +local maxfalloff = maxy - falloff +local get_intensity = function(y) + if y < miny or y > maxy then + return 0 + end + if y <= maxfalloff and y >= minfalloff then + return 1 + end + if y < minfalloff then + return (y-miny)/falloff + end +-- if y > maxfalloff then + return (maxy-y)/falloff +-- end +end + +local c_air = minetest.get_content_id("air") +local c_web + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local big_webs_path = minetest.get_modpath("big_webs") +if big_webs_path then + c_web = minetest.get_content_id("big_webs:webbing") +end + +local z_displace = 10000 + + +local calculate_web_array = function(minp, maxp) + local seed = math.random()*10000000 + math.randomseed(minp.y + z_displace*minp.z) -- use consistent seeds across the x axis + local webs = {} + for count = 1, math.random(5,20) do + local width = math.random(5, 25) + local direction_vertical = math.random() > 0.5 + local web_y = math.random(minp.y+8, maxp.y-8) + local web_z = math.random(minp.z+8, maxp.z-8) + for i = -math.floor(width/2), math.ceil(width/2) do + if direction_vertical then + webs[(web_y+i) + web_z*z_displace] = true + else + webs[web_y + (web_z+i)*z_displace] = true + end + end + end + math.randomseed(seed) + return webs +end + +minetest.register_on_generated(function(minp, maxp, seed) + if minp.y >= maxy or maxp.y <= miny then + return + end + + -- check if webs are present + local webs + local webs_present = false + if big_webs_path then + local seed = math.random()*10000000 + math.randomseed(minp.y + z_displace*minp.z) -- use consistent seeds across the x axis + if math.random() < web_probability then + webs_present = true + end + math.randomseed(seed) + end + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + vm:get_data(data) + + nobj_chasm = nobj_chasm or minetest.get_perlin_map(np_chasms, {x = emax.x - emin.x + 1 + waver_strength*2, y = emax.y - emin.y + 1, z = emax.z - emin.z + 1}) + nobj_chasm:get_3d_map_flat(vector.subtract(emin, waver_vector), chasm_data) + + nobj_waver = nobj_waver or minetest.get_perlin_map(np_waver, {x = emax.x - emin.x + 1, y = emax.y - emin.y + 1, z = emax.z - emin.z + 1}) + nobj_waver:get_3d_map_flat(emin, waver_data) + + local chasm_area = VoxelArea:new{MinEdge = vector.subtract(emin, waver_vector), MaxEdge = vector.add(emax, waver_vector)} + local data_area = VoxelArea:new{MinEdge = emin, MaxEdge = emax} + + for i, x, y, z in data_area:iterp_xyz(emin, emax) do + local waver = math.min(math.max(math.floor(waver_data[i]+0.5), -waver_strength), waver_strength) + local intensity = get_intensity(y) + if chasm_data[chasm_area:index(x+waver, y, z)]*intensity > chasms_threshold then + if not ignore[data[i]] then + if webs_present then + webs = webs or calculate_web_array(minp, maxp) -- only calculate webs when we know we're in a chasm + if webs[y + z*z_displace] and math.random() < 0.85 then -- random holes in the web + data[i] = c_web + local web_pos = vector.new(x,y,z) + minetest.get_node_timer(web_pos):start(1) -- this timer will check for unsupported webs + if log_location then log_location("chasm_web", web_pos) end + else + data[i] = c_air + end + else + data[i] = c_air + end + if log_location then log_location("chasm", vector.new(x,y,z)) end + end + end + end + + vm:set_data(data) + vm:calc_lighting() + vm:write_to_map() +end) + +local nobj_local_chasm = minetest.get_perlin(np_chasms) +local nobj_local_waver = minetest.get_perlin(np_waver) + +chasms.is_in_chasm = function(pos) + nobj_local_chasm = nobj_local_chasm or minetest.get_perlin(np_chasms) + nobj_local_waver = nobj_local_waver or minetest.get_perlin(np_waver) + local waver = math.min(math.max(math.floor(nobj_local_waver:get_3d(pos)+0.5), -waver_strength), waver_strength) + local chasm_value = nobj_local_chasm:get_3d({x=pos.x+waver, y=pos.y, z=pos.z}) + return chasm_value*get_intensity(pos.y) > chasms_threshold +end + +-- A little cheaper to run, for mapgens that know they don't have to worry about the tops and bottoms of chasms +chasms.is_in_chasm_without_taper = function(pos) + nobj_local_chasm = nobj_local_chasm or minetest.get_perlin(np_chasms) + nobj_local_waver = nobj_local_waver or minetest.get_perlin(np_waver) + local waver = math.min(math.max(math.floor(nobj_local_waver:get_3d(pos)+0.5), -waver_strength), waver_strength) + local chasm_value = nobj_local_chasm:get_3d({x=pos.x+waver, y=pos.y, z=pos.z}) + return chasm_value > chasms_threshold +end \ No newline at end of file diff --git a/mods/dfcaverns/chasms/mod.conf b/mods/dfcaverns/chasms/mod.conf new file mode 100644 index 0000000..f0464dc --- /dev/null +++ b/mods/dfcaverns/chasms/mod.conf @@ -0,0 +1,3 @@ +name=chasms +depends=mapgen_helper +optional_depends=big_webs \ No newline at end of file diff --git a/mods/dfcaverns/chasms/settingtypes.txt b/mods/dfcaverns/chasms/settingtypes.txt new file mode 100644 index 0000000..f3995a8 --- /dev/null +++ b/mods/dfcaverns/chasms/settingtypes.txt @@ -0,0 +1,5 @@ +chasms_params (Noise params for chasms) noise_params_3d 0, 1, (50, 1000, 3000), 94586, 2, 0.63, 2.0 +chasms_threshold (Noise threshold for chasms) float 0.9 +chasms_maxy (Maximum Y) int -50 +chasms_miny (Minimum Y) int -2500 +chasms_falloff (Taper range when approaching max or min) int 100 \ No newline at end of file diff --git a/mods/dfcaverns/description.txt b/mods/dfcaverns/description.txt new file mode 100644 index 0000000..1a7d8a8 --- /dev/null +++ b/mods/dfcaverns/description.txt @@ -0,0 +1 @@ +Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. \ No newline at end of file diff --git a/mods/dfcaverns/df_achievements/dig.lua b/mods/dfcaverns/df_achievements/dig.lua new file mode 100644 index 0000000..4e9a9d9 --- /dev/null +++ b/mods/dfcaverns/df_achievements/dig.lua @@ -0,0 +1,164 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local steel_pick = df_dependencies.texture_tool_steelpick +local steel_shovel = df_dependencies.texture_tool_steelshovel + +local crossed_pick_and_shovel = "((("..steel_shovel.."^[transformFX)^"..steel_pick..")^[resize:32x32)" + +local gas_seep = "(("..df_dependencies.texture_stone.."^"..df_dependencies.texture_mineral_coal.."^[combine:16x80:0,-16=crack_anylength.png)^[resize:32x32)" + +awards.register_achievement("dfcaverns_destroyed_gas_seep", { + title = S("Destroy a Gas Seep"), + description = S("Plug a crack that mine gas is seeping out of to make the caves just a little bit safer."), + icon = "dfcaverns_awards_backgroundx32.png^" .. gas_seep .."^dfcaverns_awards_foregroundx32.png", + difficulty = 2, + trigger = { + type = "dig", + node = "mine_gas:gas_seep", + target = 1 + }, +}) + +awards.register_achievement("dfcaverns_giant_web", { + title = S("Collect Giant Webbing"), + description = S("Collect a piece of giant webbing found in a cave."), + icon ="dfcaverns_awards_backgroundx32.png^big_webs_item.png^dfcaverns_awards_foregroundx32.png", + difficulty = 1, + trigger = { + type = "dig", + node = "big_webs:webbing", + target = 1 + }, +}) + +-- too common +--awards.register_achievement("dfcaverns_glow_worms", { +-- title = S("Collect Glow Worms"), +-- description = S(""), +-- icon =, +-- trigger = { +-- type = "dig", +-- node = "df_mapitems:glow_worm", +-- target = 1 +-- }, +--}) + +--------------------------------------------------------------- + +awards.register_achievement("dfcaverns_cave_pearls", { + title = S("Collect Cave Pearls"), + description = S("Collect some cave pearls from the wall of a cave."), + icon = "dfcaverns_awards_backgroundx32.png^dfcaverns_cave_pearls_achievement.png^dfcaverns_awards_foregroundx32.png", + difficulty = 1, + trigger = { + type = "dig", + node = "df_mapitems:cave_pearls", + target = 1 + }, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_castle_coral", { + title = S("Collect Castle Coral"), + description = S("Collect a piece of Castle Coral from the Sunless Sea."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_castle_coral_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_mapitems:castle_coral", + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_ruby_crystals", { + title = S("Collect Giant Red Crystal"), + description = S("Collect one of the giant red crystals found in large barren caverns."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_big_red_crystal_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "group:dfcaverns_big_crystal", + target = 1 + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_cave_coral", { + title = S("Collect Cave Coral"), + description = S("Collect a piece of Cave Coral from the Sunless Sea."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_cave_coral_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "group:dfcaverns_cave_coral", + target = 1 + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_flawless_mese", { + title = S("Collect Flawless Mese Crystal Block"), + description = S("Collect a flawless Mese crystal block from the Magma Sea."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_glowmese_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_mapitems:glow_mese", + target = 1 + }, + difficulty = 3, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_luminous_salt", { + title = S("Collect Luminous Salt Crystal"), + description = S("Collect a luminous salt crystal from the dry caverns where Bloodthorns live."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_salt_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_mapitems:salt_crystal", + target = 1 + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_glow_amethyst", { + title = S("Collect Glowing Amethyst"), + description = S("Collect a block of glowing amethyst crystal from the Underworld."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_amethyst_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_underworld_items:glow_amethyst", + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_glow_stone", { + title = S('"Collect" Lightseam Stone'), + description = S("Attempt to collect a piece of Lightseam, a strange glowing mineral found deep underground."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_glowstone_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_underworld_items:glowstone", + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +------------------------------------------------------------------ + +awards.register_achievement("dfcaverns_prospector", { + title = S("Deep Prospector"), + description = S("Collect various different exotic items from various caverns."), + icon = "dfcaverns_awards_backgroundx32.png^"..crossed_pick_and_shovel.."^dfcaverns_awards_foregroundx32.png", + difficulty = 3 / df_achievements.get_child_achievement_count("dfcaverns_prospector"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_prospector", + target=df_achievements.get_child_achievement_count("dfcaverns_prospector"), + }, +}) diff --git a/mods/dfcaverns/df_achievements/farming.lua b/mods/dfcaverns/df_achievements/farming.lua new file mode 100644 index 0000000..06469d7 --- /dev/null +++ b/mods/dfcaverns/df_achievements/farming.lua @@ -0,0 +1,154 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local nethercap_name = df_dependencies.nethercap_name + +local hoe_texture = df_dependencies.texture_tool_steelhoe +local soil_texture = df_dependencies.texture_farming_soil +local ice_texture = df_dependencies.texture_ice +local coal_ore = "(".. df_dependencies.texture_stone .."^".. df_dependencies.texture_mineral_coal ..")" + +local make_texture = function(plant_texture, bg_tex) + bg_tex = bg_tex or soil_texture + return "dfcaverns_awards_backgroundx32.png^[combine:32x32:3,4="..bg_tex.."^[combine:32x32:3,2="..plant_texture.."^[combine:32x32:14,13="..hoe_texture.."^dfcaverns_awards_foregroundx32.png" +end + +-- forestry + +local plant_node_achievements = +{ + ["df_trees:black_cap_sapling"] = {achievement="dfcaverns_plant_black_cap", + title=S("Plant Black Cap"), icon=make_texture("dfcaverns_black_cap_sapling.png", coal_ore), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:fungiwood_sapling"] = {achievement="dfcaverns_plant_fungiwood", + title=S("Plant Fungiwood"), icon=make_texture("dfcaverns_fungiwood_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:goblin_cap_sapling"] = {achievement="dfcaverns_plant_goblin_cap", + title=S("Plant Goblin Cap"), icon=make_texture("dfcaverns_goblin_cap_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:nether_cap_sapling"] = {achievement="dfcaverns_plant_nethercap", + title=S("Plant @1", nethercap_name), icon=make_texture("dfcaverns_nether_cap_sapling.png", ice_texture), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:spore_tree_sapling"] = {achievement="dfcaverns_plant_spore_tree", + title=S("Plant Spore Tree"), icon=make_texture("dfcaverns_spore_tree_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:tower_cap_sapling"] = {achievement="dfcaverns_plant_tower_cap", + title=S("Plant Tower Cap"), icon=make_texture("dfcaverns_tower_cap_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:tunnel_tube_sapling"] = {achievement="dfcaverns_plant_tunnel_tube", + title=S("Plant Tunnel Tube"), icon=make_texture("dfcaverns_tunnel_tube_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:torchspine_ember"] = {achievement="dfcaverns_plant_torchspine", + title=S("Plant Torchspine"), icon=make_texture("dfcaverns_torchspine_achievement.png", coal_ore), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:spindlestem_seedling"] = {achievement="dfcaverns_plant_spindlestem", + title=S("Plant Spindlestem"), icon=make_texture("dfcaverns_spindlestem_achievement.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:blood_thorn"] = {achievement="dfcaverns_plant_bloodthorn", + title=S("Plant Bloodthorn"), icon=make_texture("dfcaverns_bloodthorn_achievement.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_primordial_items:giant_hypha_apical_meristem"] = {achievement="dfcaverns_plant_giant_mycelium", + title=S("Plant Primordial Mycelium"), icon=make_texture("dfcaverns_mush_soil.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:fern_sapling"] = {achievement="dfcaverns_plant_primordial_fern", + title=S("Plant Primordial Fern"), icon=make_texture("dfcaverns_jungle_fern_03.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:jungle_mushroom_sapling"] = {achievement="dfcaverns_plant_primordial_jungle_mushroom", + title=S("Plant Primordial Jungle Mushroom"), icon=make_texture("dfcaverns_jungle_mushroom_02.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:jungletree_sapling"] = {achievement="dfcaverns_plant_primordial_jungletree", + title=S("Plant Primordial Jungle Tree"), icon=make_texture("dfcaverns_jungle_sapling.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:mush_sapling"] = {achievement="dfcaverns_plant_primordial_mushroom", + title=S("Plant Primordial Mushroom"), icon=make_texture("dfcaverns_mush_sapling.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_farming:cave_wheat_seed"] = {achievement="dfcaverns_plant_cave_wheat", + title=S("Plant Cave Wheat"), icon=make_texture("dfcaverns_cave_wheat_8.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:dimple_cup_seed"] = {achievement="dfcaverns_plant_dimple_cup", + title=S("Plant Dimple Cup"), icon=make_texture("dfcaverns_dimple_cup_4.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:pig_tail_seed"] = {achievement="dfcaverns_plant_pig_tail", + title=S("Plant Pig Tail"), icon=make_texture("dfcaverns_pig_tail_8.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:plump_helmet_spawn"] = {achievement="dfcaverns_plant_plump_helmet", + title=S("Plant Plump Helmet"), icon=make_texture("dfcaverns_plump_helmet_achievement.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:quarry_bush_seed"] = {achievement="dfcaverns_plant_quarry_bush", + title=S("Plant Quarry Bush"), icon=make_texture("dfcaverns_quarry_bush_5.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:sweet_pod_seed"] = {achievement="dfcaverns_plant_sweet_pod", + title=S("Plant Sweet Pod"), icon=make_texture("dfcaverns_sweet_pod_6.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, +} + +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + if placer == nil then return end + local player_name = placer:get_player_name() + if player_name == nil then return end + local player_awards = awards.player(player_name) + local achievement = plant_node_achievements[newnode.name] + if not achievement then return end + local achievement_name = achievement.achievement + if not player_awards.unlocked or player_awards.unlocked[achievement_name] ~= achievement_name then + -- all of the growable plants in DFCaverns are timer-based. If you place + -- a seedling or seed and the resulting node has a timer running, then + -- it's passed the checks to see if it was placed in a growable area. + if minetest.get_node_timer(pos):is_started() then + awards.unlock(player_name, achievement_name) + end + end +end) + +for seed_item, def in pairs(plant_node_achievements) do + awards.register_achievement(def.achievement, { + title = def.title, + description = S("Plant a @1 in a place where it can grow.", minetest.registered_items[seed_item].description), + icon = def.icon, + secret = def.secret, + _dfcaverns_achievements = def._dfcaverns_achievements, + }) +end + +awards.register_achievement("dfcaverns_plant_all_upper_trees", { + title = S("Fungal Arborist"), + description = S("Plant one of every kind of 'tree' found in the caverns above the Sunless Sea."), + icon = "dfcaverns_awards_backgroundx32.png^" + .."(dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_cavern_goblincapx32.png)^[transformFX" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + difficulty = 1 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_upper_trees"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_upper_trees", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_upper_trees"), + }, +}) + +awards.register_achievement("dfcaverns_plant_all_primordial", { + title = S("Primordial Arborist"), + description = S("Plant one of every kind of 'tree' from the Primordial caverns."), + icon = "dfcaverns_awards_backgroundx32.png^" + .."(dfcaverns_awards_cavern_primordial_mushx32.png^dfcaverns_awards_cavern_junglex32.png)^[transformFX" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + secret = true, + difficulty = 3 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_primordial"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_primordial", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_primordial"), + }, +}) + +awards.register_achievement("dfcaverns_plant_all_underground_trees", { + title = S("Underground Arborist"), + description = S("Plant one of every kind of 'tree' found in the caverns beneath the surface."), + icon = "dfcaverns_awards_backgroundx32.png^" + .."(dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_cavern_goblincapx32.png)^[transformFX" + .. "^dfcaverns_awards_cavern_primordial_mushx32.png^dfcaverns_awards_cavern_junglex32.png" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + difficulty = 4 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_underground_trees"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_underground_trees", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_underground_trees"), + }, +}) + +awards.register_achievement("dfcaverns_plant_all_farmables", { + title = S("Underground Farmer"), + description = S("Plant one of every kind of small farmable plant found in the caverns beneath the surface."), + icon = "dfcaverns_awards_backgroundx32.png" + .."^[combine:32x32:0,0="..soil_texture + .."^[combine:32x32:0,16="..soil_texture + .."^[combine:32x32:16,0="..soil_texture + .."^[combine:32x32:16,16="..soil_texture + .."^[combine:32x32:0,0=dfcaverns_cave_wheat_8.png" + .."^[combine:32x32:16,0=dfcaverns_dimple_cup_4.png" + .."^[combine:32x32:8,8=dfcaverns_plump_helmet_achievement.png" + .."^[combine:32x32:0,16=dfcaverns_sweet_pod_6.png" + .."^[combine:32x32:16,16=dfcaverns_quarry_bush_5.png" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + difficulty = 1 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_farmables"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_farmables", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_farmables"), + }, +}) diff --git a/mods/dfcaverns/df_achievements/food.lua b/mods/dfcaverns/df_achievements/food.lua new file mode 100644 index 0000000..c1092f3 --- /dev/null +++ b/mods/dfcaverns/df_achievements/food.lua @@ -0,0 +1,88 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +for itemname, def in pairs(minetest.registered_items) do + --"df_farming:"..item_name.."_"..recipe_type.name.."_meal" + if string.sub(itemname, 1, 11) == "df_farming:" and string.sub(itemname, -5, -1) == "_meal" then + local meal_name = string.sub(itemname, 12, -1) + local meal_desc = def.description + local image = string.sub(def.inventory_image, 1, -7) .. "32.png" + + awards.register_achievement("dfcaverns_meal_"..meal_name, { + title = S("Eat @1", meal_desc), + description = S("One of the many delights that can be crafted only from fungal growths found deep underground."), + icon = "dfcaverns_awards_backgroundx32.png^" .. image .. "^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "eat", + item = itemname, + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_gourmand"}, + }) + end +end + +local bread_def = minetest.registered_items["df_farming:cave_bread"] +awards.register_achievement("dfcaverns_meal_dwarven_bread", { + title = S("Eat @1", bread_def.description), + description = S("It's a basic staple of the underground, but at least it's not Plump Helmet."), + icon = "dfcaverns_awards_backgroundx32.png^dfcaverns_prepared_food13x32.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "eat", + item = "df_farming:cave_bread", + target = 1, + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_gourmand"}, +}) + +awards.register_achievement("dfcaverns_gourmand", { + title = S("Dwarven Gourmand"), + description = S("Eat one of each of the various meals that can be cooked or crafted from underground ingredients."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_prepared_food28x32.png^dfcaverns_gourmand_achievement.png^dfcaverns_awards_foregroundx32.png", + difficulty = 2 / df_achievements.get_child_achievement_count("dfcaverns_gourmand"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_gourmand", + target=df_achievements.get_child_achievement_count("dfcaverns_gourmand"), + }, +}) + +if minetest.get_modpath("df_primordial_items") then + awards.register_achievement("dfcaverns_primordial_fruit", { + title = S("Eat a Primordial Fruit"), + description = S("Eat one of the strange fruits found only deep underground in the Primordial caverns."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_primordial_fruit.png^dfcaverns_awards_foregroundx32.png", + difficulty = 3, + trigger = { + type = "eat", + item = "df_primordial_items:primordial_fruit", + target = 1 + }, + secret = true, + }) + + awards.register_achievement("dfcaverns_glowtato", { + title = S("Eat a Glowtato"), + description = S("Slightly less prestigious than the Primordial Fruit, but still rare and exotic compared to surface world fare."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_glowtato.png^dfcaverns_awards_foregroundx32.png", + difficulty = 3, + trigger = { + type = "eat", + item = "df_primordial_items:glowtato", + target = 1 + }, + }) + +-- too mundane compared to the other achievements +-- awards.register_achievement("dfcaverns_diced_mushroom", { +-- title = S("Eat Diced Mushroom"), +-- description = S(""), +-- icon =, +-- trigger = { +-- type = "eat", +-- item = "df_primordial_items:diced_mushroom", +-- target = 1 +-- }, +-- }) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_achievements/init.lua b/mods/dfcaverns/df_achievements/init.lua new file mode 100644 index 0000000..b38cc4e --- /dev/null +++ b/mods/dfcaverns/df_achievements/init.lua @@ -0,0 +1,102 @@ +if not minetest.get_modpath("awards") then + minetest.log("warning", "[df_achievements] the df_achievements mod was installed but the [awards] mod was not." + .. " df_achievements depends on awards, but it is listed as an optional dependency so that installing the" + .. " dfcaverns modpack won't automatically enable it. If you want df_achievements to function please" + .. " install awards as well, otherwise you should disable df_achievements.") + return +end + +df_achievements = {} + +local old_awards_version = false +if awards.run_trigger_callbacks then + -- older versions of awards crash when attempting to use newer versions of triggers + -- this "run_trigger_callbacks" API call is present in those older versions, so using that + -- as a fingerprint to discover them + old_awards_version = true + + minetest.register_on_dignode(function(pos, oldnode, digger) + -- the old version of awards doesn't handle groups when triggering dug nodes, use this to hack around that + local node_name = oldnode.name + if minetest.get_item_group(node_name, "dfcaverns_big_crystal") > 0 then + awards.unlock(digger:get_player_name(), "dfcaverns_ruby_crystals") + elseif minetest.get_item_group(node_name, "dfcaverns_cave_coral") > 0 then + awards.unlock(digger:get_player_name(), "dfcaverns_cave_coral") + end + end) +else + -- used to track the progress of achievements that are based off of other achievements + awards.register_trigger("dfcaverns_achievements", { + type="counted_key", + progress = "@1/@2", -- awards seems to use a conflicting syntax with internationalization, ick. Avoid words here. + get_key = function(self, def) + return def.trigger.achievement_name + end, + }) +end + + +local achievement_parents = {} +df_achievements.get_child_achievement_count = function(parent_achievement) + return #achievement_parents[parent_achievement] +end + +local register_achievement_old = awards.register_achievement +awards.register_achievement = function(achievement_name, achievement_def, ...) + if old_awards_version and achievement_def.trigger and achievement_def.trigger.type=="dfcaverns_achievements" then + -- there's a significant difference between how triggers work + -- in older versions of the awards mod. The new version of the trigger doesn't + -- work with the old. Rather than do a bunch of work to support old versions, strip them out. + achievement_def.trigger = nil + end + + -- The achievement being registered has "parent" achievements that progress when it is unlocked, + -- track that here + if achievement_def._dfcaverns_achievements then + for _, parent_achievement in pairs(achievement_def._dfcaverns_achievements) do + local parent_source_list = achievement_parents[parent_achievement] or {} + achievement_parents[parent_achievement] = parent_source_list + table.insert(parent_source_list, achievement_name) + end + end + + register_achievement_old(achievement_name, achievement_def, ...) +end + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +awards.register_on_unlock(function(player_name, def) + local def_dfcaverns_achievements = def._dfcaverns_achievements + if not def_dfcaverns_achievements then return end + local player_awards = awards.player(player_name) + if not player_awards then return end + local unlocked = player_awards.unlocked + if not unlocked then return end + + -- the achievement that just got unlocked had one or more "parent" achievements associated with it. + for _, achievement_parent in pairs(def_dfcaverns_achievements) do + player_awards.dfcaverns_achievements = player_awards.dfcaverns_achievements or {} + local source_list = achievement_parents[achievement_parent] + local total = #source_list + local count = 0 + for _, source_achievement in pairs(source_list) do + if unlocked[source_achievement] == source_achievement then count = count + 1 end + end + player_awards.dfcaverns_achievements[achievement_parent] = count + awards.save() + if count >= total then + minetest.after(4, awards.unlock, player_name, achievement_parent) + end + end +end) + + + +dofile(modpath.."/travel.lua") +dofile(modpath.."/farming.lua") +dofile(modpath.."/dig.lua") +dofile(modpath.."/food.lua") +dofile(modpath.."/misc.lua") + +-- not used outside this mod +df_achievements.test_list = nil \ No newline at end of file diff --git a/mods/dfcaverns/df_achievements/locale/template.txt b/mods/dfcaverns/df_achievements/locale/template.txt new file mode 100644 index 0000000..83ac323 --- /dev/null +++ b/mods/dfcaverns/df_achievements/locale/template.txt @@ -0,0 +1,180 @@ +# textdomain: df_achievements + + +### dig.lua ### + +"Collect" Lightseam Stone= + +Attempt to collect a piece of Lightseam, a strange glowing mineral found deep underground.= + +Collect Castle Coral= +Collect Cave Coral= +Collect Cave Pearls= +Collect Flawless Mese Crystal Block= +Collect Giant Red Crystal= +Collect Giant Webbing= +Collect Glow Worms= +Collect Glowing Amethyst= +Collect Luminous Salt Crystal= + +Collect a block of glowing amethyst crystal from the Underworld.= + +Collect a flawless Mese crystal block from the Magma Sea.= + +Collect a luminous salt crystal from the dry caverns where Bloodthorns live.= + +Collect a piece of Castle Coral from the Sunless Sea.= +Collect a piece of Cave Coral from the Sunless Sea.= +Collect a piece of giant webbing found in a cave.= + +Collect one of the giant red crystals found in large barren caverns.= + +Collect some cave pearls from the wall of a cave.= +Collect various different exotic items from various caverns.= +Deep Prospector= +Destroy a Gas Seep= + +Plug a crack that mine gas is seeping out of to make the caves just a little bit safer.= + + +### dig.lua ### +### food.lua ### +### misc.lua ### + += + +### farming.lua ### + +Fungal Arborist= +Plant @1= +Plant Black Cap= +Plant Bloodthorn= +Plant Cave Wheat= +Plant Dimple Cup= +Plant Fungiwood= +Plant Goblin Cap= +Plant Pig Tail= +Plant Plump Helmet= +Plant Primordial Fern= +Plant Primordial Jungle Mushroom= +Plant Primordial Jungle Tree= +Plant Primordial Mushroom= +Plant Primordial Mycelium= +Plant Quarry Bush= +Plant Spindlestem= +Plant Spore Tree= +Plant Sweet Pod= +Plant Torchspine= +Plant Tower Cap= +Plant Tunnel Tube= +Plant a @1 in a place where it can grow.= + +Plant one of every kind of 'tree' found in the caverns above the Sunless Sea.= + +Plant one of every kind of 'tree' found in the caverns beneath the surface.= + +Plant one of every kind of 'tree' from the Primordial caverns.= + +Plant one of every kind of small farmable plant found in the caverns beneath the surface.= + +Primordial Arborist= +Underground Arborist= +Underground Farmer= + +### food.lua ### + +Dwarven Gourmand= +Eat @1= +Eat Diced Mushroom= +Eat a Glowtato= +Eat a Primordial Fruit= + +Eat one of each of the various meals that can be cooked or crafted from underground ingredients.= + +Eat one of the strange fruits found only deep underground in the Primordial caverns.= + +It's a basic staple of the underground, but at least it's not Plump Helmet.= + +One of the many delights that can be crafted only from fungal growths found deep underground.= + +Slightly less prestigious than the Primordial Fruit, but still rare and exotic compared to surface world fare.= + + +### misc.lua ### + +Activating a puzzle seal has produced a breach in the slade foundations of the world.= + +Capture an Ice Sprite= +Decipher the code of the ancients. Do you dare turn the key?= +Detonate Mine Gas= +Get Attacked by an Underworld Guardian= +Loot 100 Ancient Warrior Bones= +Loot Ancient Warrior Bones= +Punch Veinstone= +Punch a vein to hear the heartbeat of the stone.= +Repair 100 Ancient Lanterns= +Repair an Ancient Lantern= +Solve a Puzzle Seal= +Trigger a Slade Breacher= + +You may not be able to build new ones, but at least you can get the old ones shining brightly again.= + +You've captured an ice sprite and placed it in a bottle. It dances and sparkles and sheds light through the frosted glass while making a faint tinkling sound. Pretty.= + +You've discovered something important about those mysterious slade statues in the Underworld.= + + +### travel.lua ### + +Discover @1s= +Discover All Fungal Cavern Types= +Discover All Overworld Cavern Types= +Discover All Underground Cavern Types= +Discover Black Caps= +Discover Bloodthorns= +Discover Fungiwood= +Discover Goblin Caps= +Discover Spore Trees= +Discover Tower Caps= +Discover Tunnel Tubes= +Discover a Deep Chasm= +Discover a Deep Sinkhole= +Discover a Glowing Pit= +Discover a cavern containing oil deep underground.= +Discover a cavern where @1s grow in the wild.= +Discover a cavern where Black Caps grow in the wild.= +Discover a cavern where Bloodthorns grow in the wild.= +Discover a cavern where Fungiwoods grow in the wild.= +Discover a cavern where Goblin Caps grow in the wild.= +Discover a cavern where Spore Trees grow in the wild.= +Discover a cavern where Tower Caps grow in the wild.= +Discover a cavern where Tunnel Tubes grow in the wild.= +Discover a deep natural sinkhole.= +Discover a gigantic underground natural chasm.= + +Discover a glowing pit in the slade foundations of the world.= + +Discover all Primordial Cavern Types= +Discover all major kinds of giant cavern environment.= + +Discover all of the major types of cavern below the foundations of the world.= + +Discover all of the major types of cavern environments between the Sunless Sea and the foundations of the world.= + +Discover examples of all of the fungal cavern biomes.= +Discover the Magma Sea= +Discover the Oil Sea= +Discover the Primordial Fungus= +Discover the Primordial Jungle= +Discover the Sunless Sea= +Discover the Underworld= + +Discover the ancient caverns at the foundations of the world.= + +Discover the fungus-ridden caverns below the foundations of the world.= + +Discover the giant caverns to which all water from the surface ultimately drain.= + +Discover the lost jungles below the foundations of the world.= + +Discover the sea of magma that volcanoes draw from.= diff --git a/mods/dfcaverns/df_achievements/misc.lua b/mods/dfcaverns/df_achievements/misc.lua new file mode 100644 index 0000000..e8cd84c --- /dev/null +++ b/mods/dfcaverns/df_achievements/misc.lua @@ -0,0 +1,103 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- misc +if df_dependencies.node_name_glass_bottle then + awards.register_achievement("dfcaverns_captured_ice_sprite", { + title = S("Capture an Ice Sprite"), + description = S("You've captured an ice sprite and placed it in a bottle. It dances and sparkles and sheds light through the frosted glass while making a faint tinkling sound. Pretty."), + icon = "dfcaverns_awards_backgroundx32.png^ice_sprites_bottle.png^dfcaverns_awards_foregroundx32.png", + difficulty = 2, + trigger = { + type = "craft", + item = "ice_sprites:ice_sprite_bottle", + target = 1, + }, + }) +end + +df_mapitems.on_veinstone_punched = function(pos, node, puncher, pointed_thing) + awards.unlock(puncher:get_player_name(), "dfcaverns_punched_veinstone") +end +awards.register_achievement("dfcaverns_punched_veinstone", { + title = S("Punch Veinstone"), + description = S("Punch a vein to hear the heartbeat of the stone."), + difficulty = 2, + icon = "dfcaverns_awards_backgroundx32.png^((".. df_dependencies.texture_stone .. "^dfcaverns_veins.png)^[resize:32x32)^dfcaverns_awards_foregroundx32.png", +}) + +if minetest.get_modpath("df_underworld_items") then + + if minetest.get_modpath("hunter_statue") then + hunter_statue.player_punched = function(node_name, pos, player) + if node_name ~= "df_underworld_items:hunter_statue" then return end + awards.unlock(player:get_player_name(), "dfcaverns_attacked_by_guardian_statue") + end + awards.register_achievement("dfcaverns_attacked_by_guardian_statue", { + title = S("Get Attacked by an Underworld Guardian"), + difficulty = 2, + description = S("You've discovered something important about those mysterious slade statues in the Underworld."), + icon = "dfcaverns_awards_backgroundx32.png^dfcaverns_guardian_achievement.png^dfcaverns_awards_foregroundx32.png", + secret=true, + }) + end + + df_underworld_items.puzzle_seal_solved = function(pos, player) + if player == nil then return end + awards.unlock(player:get_player_name(), "dfcaverns_solved_puzzle_seal") + end + awards.register_achievement("dfcaverns_solved_puzzle_seal", { + title = S("Solve a Puzzle Seal"), + difficulty = 4, + description = S("Decipher the code of the ancients. Do you dare turn the key?"), + icon = "dfcaverns_puzzle_seal_solvedx32.png^dfcaverns_awards_foregroundx32.png", + }) + + df_underworld_items.slade_breacher_triggered = function(pos, player) + awards.unlock(player:get_player_name(), "dfcaverns_triggered_slade_breacher") + end + awards.register_achievement("dfcaverns_triggered_slade_breacher", { + title = S("Trigger a Slade Breacher"), + difficulty = 1, + description = S("Activating a puzzle seal has produced a breach in the slade foundations of the world."), + icon = "dfcaverns_puzzle_seal_activex32.png^dfcaverns_awards_foregroundx32.png", + secret=true, + }) + + df_underworld_items.ancient_lantern_fixed = function(pos, player) + awards.unlock(player:get_player_name(), "dfcaverns_repaired_lantern") + end + awards.register_achievement("dfcaverns_repaired_lantern", { + title = S("Repair an Ancient Lantern"), + difficulty = 2, + description = S("You may not be able to build new ones, but at least you can get the old ones shining brightly again."), + icon = "dfcaverns_awards_backgroundx32.png^((dfcaverns_slade_brick.png^(" .. df_dependencies.texture_meselamp .. "^[mask:dfcaverns_lantern_mask.png))^[resize:32x32)^dfcaverns_awards_foregroundx32.png", + secret=true, + }) + +-- awards.register_achievement("dfcaverns_repaired_100_lanterns", { +-- title = S("Repair 100 Ancient Lanterns"), +-- description = S(""), +-- icon =, +-- }) + +end + + +-- can't think of an easy way to detect these +--awards.register_achievement("dfcaverns_torch_detonated_mine_gas", { +-- title = S("Detonate Mine Gas"), +-- description = S(""), +-- icon =, +--}) + +--awards.register_achievement("dfcaverns_looted_underworld_bones", { +-- title = S("Loot Ancient Warrior Bones"), +-- description = S(""), +-- icon =, +--}) +-- +--awards.register_achievement("dfcaverns_looted_100_underworld_bones", { +-- title = S("Loot 100 Ancient Warrior Bones"), +-- description = S(""), +-- icon =, +--}) diff --git a/mods/dfcaverns/df_achievements/mod.conf b/mods/dfcaverns/df_achievements/mod.conf new file mode 100644 index 0000000..11fb8e7 --- /dev/null +++ b/mods/dfcaverns/df_achievements/mod.conf @@ -0,0 +1,4 @@ +name=df_achievements +description=Achievements for DFCaverns +depends=df_caverns, df_trees, df_farming, df_mapitems, df_dependencies, pit_caves +optional_depends=df_underworld_items, hunter_statue, awards \ No newline at end of file diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_amethyst_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_amethyst_achievement.png new file mode 100644 index 0000000..eb865a4 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_amethyst_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_backgroundx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_backgroundx32.png new file mode 100644 index 0000000..2d230fa Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_backgroundx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_background_platformx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_background_platformx32.png new file mode 100644 index 0000000..345fa25 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_background_platformx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_background_stalactitex32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_background_stalactitex32.png new file mode 100644 index 0000000..ed7ad33 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_background_stalactitex32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_backgroundx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_backgroundx32.png new file mode 100644 index 0000000..1007bbc Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_backgroundx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_blackcapx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_blackcapx32.png new file mode 100644 index 0000000..a30ae7b Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_blackcapx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_bloodthornx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_bloodthornx32.png new file mode 100644 index 0000000..8ad53d5 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_bloodthornx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_chasmx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_chasmx32.png new file mode 100644 index 0000000..88be89f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_chasmx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_fungalx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_fungalx32.png new file mode 100644 index 0000000..d64f89f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_fungalx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_fungiwoodx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_fungiwoodx32.png new file mode 100644 index 0000000..e344913 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_fungiwoodx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_goblincapx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_goblincapx32.png new file mode 100644 index 0000000..49944c1 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_goblincapx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_junglex32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_junglex32.png new file mode 100644 index 0000000..efacb41 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_junglex32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_lavax32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_lavax32.png new file mode 100644 index 0000000..cf5b6e7 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_lavax32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_nethercapx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_nethercapx32.png new file mode 100644 index 0000000..6b70104 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_nethercapx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_oilx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_oilx32.png new file mode 100644 index 0000000..642871c Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_oilx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_pitx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_pitx32.png new file mode 100644 index 0000000..b8bf4b0 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_pitx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_primordial_mushx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_primordial_mushx32.png new file mode 100644 index 0000000..ae2130b Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_primordial_mushx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_seax32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_seax32.png new file mode 100644 index 0000000..8b77f8f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_seax32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_sporetreesx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_sporetreesx32.png new file mode 100644 index 0000000..f8012e7 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_sporetreesx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_towercapx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_towercapx32.png new file mode 100644 index 0000000..1a41ad2 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_towercapx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_tunneltubex32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_tunneltubex32.png new file mode 100644 index 0000000..c18c05b Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_tunneltubex32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_underworldx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_underworldx32.png new file mode 100644 index 0000000..a9d25f4 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_cavern_underworldx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_foregroundx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_foregroundx32.png new file mode 100644 index 0000000..fbebb9d Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_awards_foregroundx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_big_red_crystal_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_big_red_crystal_achievement.png new file mode 100644 index 0000000..4dd585b Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_big_red_crystal_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_bloodthorn_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_bloodthorn_achievement.png new file mode 100644 index 0000000..6abee2f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_bloodthorn_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_castle_coral_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_castle_coral_achievement.png new file mode 100644 index 0000000..3996dee Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_castle_coral_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_cave_coral_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_cave_coral_achievement.png new file mode 100644 index 0000000..d54fe3e Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_cave_coral_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_cave_pearls_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_cave_pearls_achievement.png new file mode 100644 index 0000000..f062fe8 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_cave_pearls_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_glowmese_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_glowmese_achievement.png new file mode 100644 index 0000000..74fbb33 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_glowmese_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_glowstone_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_glowstone_achievement.png new file mode 100644 index 0000000..4286351 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_glowstone_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_gourmand_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_gourmand_achievement.png new file mode 100644 index 0000000..c75037f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_gourmand_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_guardian_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_guardian_achievement.png new file mode 100644 index 0000000..850f93a Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_guardian_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_plump_helmet_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_plump_helmet_achievement.png new file mode 100644 index 0000000..50cadfc Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_plump_helmet_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food01x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food01x32.png new file mode 100644 index 0000000..24ccd32 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food01x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food02x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food02x32.png new file mode 100644 index 0000000..b8c0f0c Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food02x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food03x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food03x32.png new file mode 100644 index 0000000..c947899 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food03x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food04x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food04x32.png new file mode 100644 index 0000000..acaecd6 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food04x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food05x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food05x32.png new file mode 100644 index 0000000..48b190c Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food05x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food06x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food06x32.png new file mode 100644 index 0000000..466e682 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food06x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food07x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food07x32.png new file mode 100644 index 0000000..efb861f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food07x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food08x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food08x32.png new file mode 100644 index 0000000..6b2fddd Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food08x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food09x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food09x32.png new file mode 100644 index 0000000..a1708d1 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food09x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food10x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food10x32.png new file mode 100644 index 0000000..fd0aace Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food10x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food11x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food11x32.png new file mode 100644 index 0000000..6664915 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food11x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food12x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food12x32.png new file mode 100644 index 0000000..74c732e Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food12x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food13x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food13x32.png new file mode 100644 index 0000000..d7c24c3 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food13x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food14x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food14x32.png new file mode 100644 index 0000000..e1e4f94 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food14x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food15x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food15x32.png new file mode 100644 index 0000000..4b061a9 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food15x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food16x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food16x32.png new file mode 100644 index 0000000..1e82d64 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food16x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food17x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food17x32.png new file mode 100644 index 0000000..6306fb6 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food17x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food18x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food18x32.png new file mode 100644 index 0000000..5c665f5 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food18x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food19x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food19x32.png new file mode 100644 index 0000000..70afcb3 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food19x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food20x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food20x32.png new file mode 100644 index 0000000..5a83731 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food20x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food21x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food21x32.png new file mode 100644 index 0000000..c0172d0 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food21x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food22x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food22x32.png new file mode 100644 index 0000000..e483396 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food22x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food23x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food23x32.png new file mode 100644 index 0000000..62e9625 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food23x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food24x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food24x32.png new file mode 100644 index 0000000..754984b Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food24x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food25x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food25x32.png new file mode 100644 index 0000000..741a7f8 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food25x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food26x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food26x32.png new file mode 100644 index 0000000..89f7d18 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food26x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food27x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food27x32.png new file mode 100644 index 0000000..520109f Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food27x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food28x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food28x32.png new file mode 100644 index 0000000..600546c Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food28x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food29x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food29x32.png new file mode 100644 index 0000000..74316a5 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food29x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food30x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food30x32.png new file mode 100644 index 0000000..2e78a5b Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food30x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food31x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food31x32.png new file mode 100644 index 0000000..faa17db Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food31x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food32x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food32x32.png new file mode 100644 index 0000000..f39f20e Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food32x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food33x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food33x32.png new file mode 100644 index 0000000..d9f1c5e Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food33x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food34x32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food34x32.png new file mode 100644 index 0000000..08002ca Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_prepared_food34x32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_puzzle_seal_activex32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_puzzle_seal_activex32.png new file mode 100644 index 0000000..33f93e2 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_puzzle_seal_activex32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_puzzle_seal_solvedx32.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_puzzle_seal_solvedx32.png new file mode 100644 index 0000000..9405611 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_puzzle_seal_solvedx32.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_salt_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_salt_achievement.png new file mode 100644 index 0000000..da33b96 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_salt_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_spindlestem_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_spindlestem_achievement.png new file mode 100644 index 0000000..433a7f3 Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_spindlestem_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/textures/dfcaverns_torchspine_achievement.png b/mods/dfcaverns/df_achievements/textures/dfcaverns_torchspine_achievement.png new file mode 100644 index 0000000..1bc320c Binary files /dev/null and b/mods/dfcaverns/df_achievements/textures/dfcaverns_torchspine_achievement.png differ diff --git a/mods/dfcaverns/df_achievements/travel.lua b/mods/dfcaverns/df_achievements/travel.lua new file mode 100644 index 0000000..4bdfa4b --- /dev/null +++ b/mods/dfcaverns/df_achievements/travel.lua @@ -0,0 +1,349 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local nethercap_name = df_dependencies.nethercap_name +local lava_node = df_dependencies.node_name_lava_source + +local node_types = {} +node_types.fungiwood = {"df_trees:fungiwood", "df_trees:fungiwood_shelf"} +node_types.towercap = {"df_trees:tower_cap_stem", "df_trees:tower_cap_gills", "df_trees:tower_cap"} +node_types.goblincap = {"df_trees:goblin_cap_stem", "df_trees:goblin_cap", "df_trees:goblin_cap_gills"} +node_types.sporetree = {"df_trees:spore_tree", "df_trees:spore_tree_hyphae", "df_trees:spore_tree_fruiting_body"} +node_types.tunneltube = {"df_trees:tunnel_tube", "df_trees:tunnel_tube_slant_bottom", "df_trees:tunnel_tube_slant_top", "df_trees:tunnel_tube_slant_full", "df_trees:tunnel_tube_fruiting_body"} +node_types.nethercap = {"df_mapitems:icicle_1", "df_mapitems:icicle_2", "df_mapitems:icicle_3", "df_mapitems:icicle_4", "ice_sprites:ice_sprite", "ice_sprites:hidden_ice_sprite", "df_trees:nether_cap", "df_trees:nether_cap_gills", "df_trees:nether_cap_stem"} +node_types.bloodthorn = {"df_trees:blood_thorn", "df_trees:blood_thorn_spike"} +node_types.blackcap = {"df_trees:black_cap", "df_trees:black_cap_stem", "df_trees:black_cap_gills", "df_trees:torchspine_1", "df_trees:torchspine_1_lit", "df_trees:torchspine_2", "df_trees:torchspine_3", "df_trees:torchspine_4"} +node_types.primordial_jungle = {"df_primordial_items:giant_fern_leaves", "df_primordial_items:giant_fern_tree", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing", "df_primordial_items:jungle_mushroom_cap_1", "df_primordial_items:jungle_mushroom_cap_2", "df_primordial_items:jungle_mushroom_trunk", "df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_glowing", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:packed_roots", "df_primordial_items:plant_matter", } +node_types.primordial_fungus = {"df_primordial_items:giant_hypha_root", "df_primordial_items:giant_hypha", "df_primordial_items:mushroom_cap", "df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing", "df_primordial_items:mushroom_trunk", "df_primordial_items:glownode", "df_primordial_items:glownode_stalk",} +node_types.other = {"oil:oil_source", "df_underworld_items:slade", lava_node, "df_underworld_items:glow_amethyst"} +node_types.sunless_sea = {"df_mapitems:castle_coral", "df_mapitems:cave_coral_1", "df_mapitems:cave_coral_2", "df_mapitems:cave_coral_3", "df_mapitems:snareweed"} + +local all_nodes = {} +for _, nodes in pairs(node_types) do + for _, node in pairs(nodes) do + table.insert(all_nodes, node) + end +end + +local radius = 6 +local get_player_data = function(player) + -- get head level node at player position + local pos = player:get_pos() + if not pos then return end + + -- get all set nodes around player + local ps, cn = minetest.find_nodes_in_area( + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, all_nodes) + + return { + pos = pos, + biome = df_caverns.get_biome(pos) or "", + totals = cn + } +end + +local check_nodes = function(nodes, totals) + for _, node in pairs(nodes) do + if (totals[node] or 0) > 1 then + return true + end + end + return false +end + +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 10 then return end + timer = 0 + + local player_name + local player_awards + local unlocked + local player_data + local biome + local totals + + -- loop through players + for _, player in pairs(minetest.get_connected_players()) do + player_name = player:get_player_name() + player_awards = awards.player(player_name) + unlocked = player_awards.unlocked or {} + + if unlocked["dfcaverns_visit_all_caverns"] ~= "dfcaverns_visit_all_caverns" or + unlocked["dfcaverns_visit_glowing_pit"] ~= "dfcaverns_visit_glowing_pit" then + player_data = get_player_data(player) + biome = player_data.biome + totals = player_data.totals + if biome == "towercap" and check_nodes(node_types.towercap, totals) then + awards.unlock(player_name, "dfcaverns_visit_tower_cap") + elseif biome == "fungiwood" and check_nodes(node_types.fungiwood, totals) then + awards.unlock(player_name, "dfcaverns_visit_fungiwood") + elseif biome == "goblincap" and check_nodes(node_types.goblincap, totals) then + awards.unlock(player_name, "dfcaverns_visit_goblin_cap") + elseif biome == "sporetree" and check_nodes(node_types.sporetree, totals) then + awards.unlock(player_name, "dfcaverns_visit_spore_tree") + elseif biome == "tunneltube" and check_nodes(node_types.tunneltube, totals) then + awards.unlock(player_name, "dfcaverns_visit_tunnel_tube") + elseif biome == "nethercap" and check_nodes(node_types.nethercap, totals) then + awards.unlock(player_name, "dfcaverns_visit_nethercap") + elseif biome == "bloodthorn" and check_nodes(node_types.bloodthorn, totals) then + awards.unlock(player_name, "dfcaverns_visit_blood_thorn") + elseif biome == "blackcap" and check_nodes(node_types.blackcap, totals) then + awards.unlock(player_name, "dfcaverns_visit_black_cap") + elseif + (biome == "fungispore" and ( + check_nodes(node_types.fungiwood, totals) or + check_nodes(node_types.sporetree, totals))) + or + (biome == "towergoblin" and ( + check_nodes(node_types.towercap, totals) or + check_nodes(node_types.goblincap, totals))) + or + check_nodes(node_types.sunless_sea, totals) + then + awards.unlock(player_name, "dfcaverns_visit_sunless_sea") + elseif biome == "oil_sea" and (totals["oil:oil_source"] or 0) > 1 then + awards.unlock(player_name, "dfcaverns_visit_oil_sea") + elseif biome == "underworld" then + if (totals["df_underworld_items:slade"] or 0) > 1 then + awards.unlock(player_name, "dfcaverns_visit_underworld") + end + if (totals["df_underworld_items:glow_amethyst"] or 0) > 1 and + unlocked["dfcaverns_visit_glowing_pit"] ~= "dfcaverns_visit_glowing_pit" then + local player_pos = player:get_pos() + local pit = df_caverns.get_nearest_glowing_pit(player_pos) + pit.location.y = player_pos.y + if vector.distance(player_pos, pit.location) <= pit.radius+10 then + awards.unlock(player_name, "dfcaverns_visit_glowing_pit") + end + end + elseif biome == "lava_sea" and (totals[lava_node] or 0) > 1 then + awards.unlock(player_name, "dfcaverns_visit_lava_sea") + elseif biome == "primordial fungus" and check_nodes(node_types.primordial_fungus, totals) then + awards.unlock(player_name, "dfcaverns_visit_primordial_fungal") + elseif biome == "primordial jungle" and check_nodes(node_types.primordial_jungle, totals) then + awards.unlock(player_name, "dfcaverns_visit_primordial_jungle") + end + end + if unlocked["dfcaverns_visit_chasm"] ~= "dfcaverns_visit_chasm" and chasms.is_in_chasm(player:get_pos()) then + awards.unlock(player_name, "dfcaverns_visit_chasm") + end + if unlocked["dfcaverns_visit_pit"] ~= "dfcaverns_visit_pit" then + local pos = player:get_pos() + local pos_y = pos.y + if pos_y < -30 then -- ignore pits when near the surface + local nearest_pit = pit_caves.get_nearest_pit(pos) + nearest_pit.location.y = pos_y -- for the distance check + if pos_y >= nearest_pit.depth and pos_y <= nearest_pit.top and vector.distance(pos, nearest_pit.location) <= 20 then + awards.unlock(player_name, "dfcaverns_visit_pit") + end + end + end + end +end) + +-- travelogue + +--biomes + +local cavern_background = "dfcaverns_awards_cavern_backgroundx32.png^dfcaverns_awards_cavern_background_stalactitex32.png^dfcaverns_awards_cavern_background_platformx32.png" + +awards.register_achievement("dfcaverns_visit_tower_cap", { + title = S("Discover Tower Caps"), + description = S("Discover a cavern where Tower Caps grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_fungiwood", { + title = S("Discover Fungiwood"), + description = S("Discover a cavern where Fungiwoods grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_goblin_cap", { + title = S("Discover Goblin Caps"), + description = S("Discover a cavern where Goblin Caps grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_goblincapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_spore_tree", { + title = S("Discover Spore Trees"), + description = S("Discover a cavern where Spore Trees grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_sporetreesx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_tunnel_tube", { + title = S("Discover Tunnel Tubes"), + description = S("Discover a cavern where Tunnel Tubes grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_tunneltubex32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_nethercap", { + title = S("Discover @1s", nethercap_name), + description = S("Discover a cavern where @1s grow in the wild.", nethercap_name), + icon =cavern_background.."^dfcaverns_awards_cavern_nethercapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_blood_thorn", { + title = S("Discover Bloodthorns"), + description = S("Discover a cavern where Bloodthorns grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_bloodthornx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_black_cap", { + title = S("Discover Black Caps"), + description = S("Discover a cavern where Black Caps grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_blackcapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_sunless_sea", { + title = S("Discover the Sunless Sea"), + description = S("Discover the giant caverns to which all water from the surface ultimately drain."), + icon =cavern_background.."^dfcaverns_awards_cavern_seax32.png^dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_cavern_goblincapx32.png^dfcaverns_awards_cavern_sporetreesx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + + + +awards.register_achievement("dfcaverns_visit_oil_sea", { + title = S("Discover the Oil Sea"), + description = S("Discover a cavern containing oil deep underground."), + icon =cavern_background.."^dfcaverns_awards_cavern_oilx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_middle_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 2, +}) + +awards.register_achievement("dfcaverns_visit_lava_sea", { + title = S("Discover the Magma Sea"), + description = S("Discover the sea of magma that volcanoes draw from."), + icon = cavern_background.."^dfcaverns_awards_cavern_lavax32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_middle_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 2, +}) + +awards.register_achievement("dfcaverns_visit_underworld", { + title = S("Discover the Underworld"), + description = S("Discover the ancient caverns at the foundations of the world."), + icon ="dfcaverns_awards_cavern_underworldx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_middle_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 2, +}) + + + +awards.register_achievement("dfcaverns_visit_primordial_jungle", { + title = S("Discover the Primordial Jungle"), + description = S("Discover the lost jungles below the foundations of the world."), + icon = "dfcaverns_awards_cavern_backgroundx32.png^(dfcaverns_awards_cavern_background_stalactitex32.png^[multiply:#127a0b)^dfcaverns_awards_cavern_background_platformx32.png^dfcaverns_awards_cavern_junglex32.png^dfcaverns_awards_foregroundx32.png", + secret = true, + _dfcaverns_achievements = {"dfcaverns_visit_all_primordial_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 3, +}) + +awards.register_achievement("dfcaverns_visit_primordial_fungal", { + title = S("Discover the Primordial Fungus"), + description = S("Discover the fungus-ridden caverns below the foundations of the world."), + icon = cavern_background .. "^dfcaverns_awards_cavern_fungalx32.png^dfcaverns_awards_cavern_primordial_mushx32.png^dfcaverns_awards_foregroundx32.png", + secret = true, + _dfcaverns_achievements = {"dfcaverns_visit_all_primordial_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 3, +}) + +local stone_background = "([combine:32x32:0,0=" .. df_dependencies.texture_cobble .. ":0,16=" .. df_dependencies.texture_cobble + .. ":16,0=" .. df_dependencies.texture_cobble .. ":16,16=" .. df_dependencies.texture_cobble .. ")" + + +awards.register_achievement("dfcaverns_visit_chasm", { + title = S("Discover a Deep Chasm"), + description = S("Discover a gigantic underground natural chasm."), + icon = stone_background .. "^dfcaverns_awards_cavern_chasmx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_pit", { + title = S("Discover a Deep Sinkhole"), + description = S("Discover a deep natural sinkhole."), + icon = stone_background .. "^dfcaverns_awards_cavern_pitx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + + + +awards.register_achievement("dfcaverns_visit_all_upper_biomes", { + title = S("Discover All Fungal Cavern Types"), + description = S("Discover examples of all of the fungal cavern biomes."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 1 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_upper_biomes"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_upper_biomes", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_upper_biomes"), + }, +}) + +awards.register_achievement("dfcaverns_visit_all_middle_biomes", { + title = S("Discover All Overworld Cavern Types"), + description = S("Discover all of the major types of cavern environments between the Sunless Sea and the foundations of the world."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 2 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_middle_biomes"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_middle_biomes", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_middle_biomes"), + }, +}) + +awards.register_achievement("dfcaverns_visit_all_primordial_biomes", { + title = S("Discover all Primordial Cavern Types"), + description = S("Discover all of the major types of cavern below the foundations of the world."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 3 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_primordial_biomes"), + secret = true, + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_primordial_biomes", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_primordial_biomes"), + }, +}) + +awards.register_achievement("dfcaverns_visit_all_caverns", { + title = S("Discover All Underground Cavern Types"), + description = S("Discover all major kinds of giant cavern environment."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 4 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_caverns"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_caverns", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_caverns"), + }, +}) + +-- other places + +awards.register_achievement("dfcaverns_visit_glowing_pit", { + title = S("Discover a Glowing Pit"), + description = S("Discover a glowing pit in the slade foundations of the world."), + icon ="dfcaverns_pit_plasma_static.png^dfcaverns_awards_foregroundx32.png", + difficulty = 2, + secret = true, +}) diff --git a/mods/dfcaverns/df_ambience/LICENSE.txt b/mods/dfcaverns/df_ambience/LICENSE.txt new file mode 100644 index 0000000..a1aef26 --- /dev/null +++ b/mods/dfcaverns/df_ambience/LICENSE.txt @@ -0,0 +1,24 @@ +Sounds are under various licenses, see the license.txt file in the /sounds directory for details and also the metadata in each sound file. + +License for Code +---------------- + +Copyright (C) 2022 FaceDeer, TenPlus1 (Ambience Redo mod), Neuromancer (Immersive Sounds mod) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_ambience/init.lua b/mods/dfcaverns/df_ambience/init.lua new file mode 100644 index 0000000..c323dfb --- /dev/null +++ b/mods/dfcaverns/df_ambience/init.lua @@ -0,0 +1,138 @@ +df_ambience = {} + +local pplus = minetest.get_modpath("playerplus") +local S = minetest.get_translator(minetest.get_current_modname()) + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +local radius = 6 +local registered_sets = {} +local set_nodes = {} +local muted_players = {} + +local ensure_set_node = function(node_name) + for _, existing_node in pairs(set_nodes) do + if node_name == existing_node then + return + end + end + table.insert(set_nodes, node_name) +end + +df_ambience.add_set = function(def) + assert(def) + assert(def.sounds) + if def.nodes then + for _, node_name in pairs(def.nodes) do + ensure_set_node(node_name) + end + end + def.frequency = def.frequency or 0.05 + table.insert(registered_sets, def) +end + +local timer = 0 +local random = math.random + +local get_player_data = function(player, name) + -- get head level node at player position + local pos = player:get_pos() + if not pos then return end + local prop = player:get_properties() + local eyeh = prop.eye_height or 1.47 -- eye level with fallback + + pos.y = pos.y + eyeh + local nod_head = pplus and name and playerplus[name] + and playerplus[name].nod_head or minetest.get_node(pos).name + pos.y = pos.y - eyeh + + -- get all set nodes around player + local ps, cn = minetest.find_nodes_in_area( + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) + + return { + pos = pos, + head_node = nod_head, + biome = df_caverns.get_biome(pos), + totals = cn + } +end + +local check_nodes = function(totals, nodes) + for _, node in pairs(nodes) do + if (totals[node] or 0) > 1 then + return true + end + end + return false +end + +-- selects sound set +local get_ambience = function(player, name) + local player_data + -- loop through sets in order and choose first that meets its conditions + for _, set in ipairs(registered_sets) do + if random() < set.frequency then + local check_passed + local sound_check = set.sound_check + local set_nodes = set.nodes + if sound_check or set_nodes then + player_data = player_data or get_player_data(player, name) + end + if ((not set_nodes) or check_nodes(player_data.totals, set_nodes)) and + ((not sound_check) or sound_check(player_data)) then + return set + end + end + end +end + +minetest.register_globalstep(function(dtime) + -- one second timer + timer = timer + dtime + if timer < 1 then return end + timer = 0 + + local player_name + local number + local ambience + + -- loop through players + for _, player in pairs(minetest.get_connected_players()) do + player_name = player:get_player_name() + if not muted_players[player_name] then + local set = get_ambience(player, player_name) + if set then + -- choose random sound from set + number = random(#set.sounds) + ambience = set.sounds[number] + + -- play sound + minetest.sound_play(ambience.name, { + to_player = player_name, + gain = ambience.gain or 0.3, + pitch = ambience.pitch or 1.0, + }, true) + end + end + end +end) + +minetest.register_chatcommand("mute_df_ambience", { + params = "", + description = S("Mutes or unmutes ambient sounds in deep caverns"), + func = function(name, param) + local message + if muted_players[name] then + message = S("Unmuted") + muted_players[name] = nil + else + message = S("Muted, no new sounds will start playing once current sounds finish") + muted_players[name] = true + end + return true, message + end +}) + +dofile(modpath.."/soundsets.lua") \ No newline at end of file diff --git a/mods/dfcaverns/df_ambience/locale/template.txt b/mods/dfcaverns/df_ambience/locale/template.txt new file mode 100644 index 0000000..4ca71a0 --- /dev/null +++ b/mods/dfcaverns/df_ambience/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: df_ambience + + +### init.lua ### + +Muted, no new sounds will start playing once current sounds finish= + +Mutes or unmutes ambient sounds in deep caverns= +Unmuted= diff --git a/mods/dfcaverns/df_ambience/mod.conf b/mods/dfcaverns/df_ambience/mod.conf new file mode 100644 index 0000000..0bd4e08 --- /dev/null +++ b/mods/dfcaverns/df_ambience/mod.conf @@ -0,0 +1,4 @@ +name = df_ambience +description = Ambient wildlife sounds for DFCaverns +depends = df_caverns, df_dependencies +optional_depends = chasms, playerplus, df_underworld_items \ No newline at end of file diff --git a/mods/dfcaverns/df_ambience/sounds/LICENSE.txt b/mods/dfcaverns/df_ambience/sounds/LICENSE.txt new file mode 100644 index 0000000..f5c9c56 --- /dev/null +++ b/mods/dfcaverns/df_ambience/sounds/LICENSE.txt @@ -0,0 +1,52 @@ +CC-0: +howling 2 - https://freesound.org/people/PhonosUPF/sounds/499700/ +howling 3 - https://freesound.org/people/PhonosUPF/sounds/499701/ +howling 4 - https://freesound.org/people/PhonosUPF/sounds/499703/ +howling 5 - https://freesound.org/people/PhonosUPF/sounds/499706/ +howling 6 - https://freesound.org/people/PhonosUPF/sounds/499704/ +howling 7 - https://freesound.org/people/PhonosUPF/sounds/499705/ +howling 8 - https://freesound.org/people/PhonosUPF/sounds/499702/ +cave monsters - https://freesound.org/people/Trebblofang/sounds/176930/ +dark cave factory atmo - https://freesound.org/people/szegvari/sounds/583474/ +bird noise - https://freesound.org/people/SpaceJoe/sounds/507257/ +solitary bird song - https://freesound.org/people/nuncaconoci/sounds/623862/ +pig grunting and grumbling - https://freesound.org/people/felix.blume/sounds/158746/ +whalesong - https://freesound.org/people/taure/sounds/361423/ +200614 fies, close buzzing, periodic, wide stereo 7am - https://freesound.org/people/TRP/sounds/567732/ +howler_monkey_jungle_4 - https://freesound.org/people/itsmrjack/sounds/123044/ +TRIBAL TOY BONGOS-89 - https://freesound.org/people/TA-AT/sounds/449811/ +shamanic drum 1 - https://freesound.org/people/adharca/sounds/275376/ +shamanic drum 2 - https://freesound.org/people/adharca/sounds/275377/ +cave tribal song - https://freesound.org/people/szegvari/sounds/517317/ +ghostly whispers - https://freesound.org/people/dimbark1/sounds/316797/ +whisper trail 1 - https://freesound.org/people/Black%20Boe/sounds/22328/ +whisper trail 2 - https://freesound.org/people/Black%20Boe/sounds/22329/ +whisper trail 3 - https://freesound.org/people/Black%20Boe/sounds/22330/ +frogs - https://freesound.org/people/derjuli/sounds/535066/ +frog croaking (uk common frog) - https://freesound.org/people/shaunhillyard/sounds/532235/ +glitched birds - https://freesound.org/people/soramoosic/sounds/256153/ +bird song 03 - https://freesound.org/people/olliehahn12/sounds/474493/ +pajaro_palenque - https://freesound.org/people/nicotep/sounds/619305/ + + +CC-BY-A +exotic creature song - https://freesound.org/people/InspectorJ/sounds/469312/ +crow slow - https://freesound.org/people/InspectorJ/sounds/418262/ +long bird song slow - https://freesound.org/people/IESP/sounds/339907/ +bird budgie song - https://freesound.org/people/danielfergusonmusic/sounds/404957/ +horse neigh - https://freesound.org/people/dobroide/sounds/18229/ +horse whinny - https://freesound.org/people/GoodListener/sounds/322445/ +horse nicker - https://freesound.org/people/GoodListener/sounds/322449/ +moan - https://freesound.org/people/GoodListener/sounds/322444/ +horse snort 2 - https://freesound.org/people/GoodListener/sounds/322454/ +braying donkey - ane brayant - https://freesound.org/people/beskhu/sounds/186704/ +whale - https://freesound.org/people/Tritus/sounds/186899/ +treBccc1 - https://freesound.org/people/tomerbe/sounds/546110/ +Tribal memories - https://freesound.org/people/InSintesi/sounds/370353/ +Celtic_Drum - https://freesound.org/people/13NHarri/sounds/263974/ +whisper5 - thanvannispen +creepywhisper_ambient - https://freesound.org/people/ohnobones/sounds/412769/ +bangkok frog - https://freesound.org/people/WIM/sounds/9099/ +black casqued hornbill 5-https://freesound.org/people/ERH/sounds/56549/ +exotic birds sound - https://freesound.org/people/bolkmar/sounds/423804/ +avalanche - https://freesound.org/people/mystiscool/sounds/7141/ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_avalanche.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_avalanche.ogg new file mode 100644 index 0000000..34b3768 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_avalanche.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.1.ogg new file mode 100644 index 0000000..cefce29 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.10.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.10.ogg new file mode 100644 index 0000000..48d4223 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.10.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.11.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.11.ogg new file mode 100644 index 0000000..a986c45 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.11.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.12.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.12.ogg new file mode 100644 index 0000000..5964973 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.12.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.13.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.13.ogg new file mode 100644 index 0000000..05f4eeb Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.13.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.14.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.14.ogg new file mode 100644 index 0000000..3da0c60 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.14.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.15.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.15.ogg new file mode 100644 index 0000000..638a845 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.15.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.16.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.16.ogg new file mode 100644 index 0000000..f04f2e5 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.16.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.17.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.17.ogg new file mode 100644 index 0000000..5b34b03 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.17.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.18.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.18.ogg new file mode 100644 index 0000000..d2e2059 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.18.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.2.ogg new file mode 100644 index 0000000..54914f2 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.3.ogg new file mode 100644 index 0000000..267c9db Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.4.ogg new file mode 100644 index 0000000..a6c2e0f Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.5.ogg new file mode 100644 index 0000000..327ab8e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.6.ogg new file mode 100644 index 0000000..c9937ec Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.7.ogg new file mode 100644 index 0000000..8ece143 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.8.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.8.ogg new file mode 100644 index 0000000..29ef269 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.8.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.9.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.9.ogg new file mode 100644 index 0000000..77af346 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_budgie_song.9.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_noise.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_noise.ogg new file mode 100644 index 0000000..5991c66 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_bird_noise.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_crow_slow.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_crow_slow.ogg new file mode 100644 index 0000000..c96a2ff Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_crow_slow.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.1.ogg new file mode 100644 index 0000000..55c777b Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.2.ogg new file mode 100644 index 0000000..5b36785 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.3.ogg new file mode 100644 index 0000000..bc5c560 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.4.ogg new file mode 100644 index 0000000..7894874 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.5.ogg new file mode 100644 index 0000000..c1c97e7 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.6.ogg new file mode 100644 index 0000000..c58d83d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.7.ogg new file mode 100644 index 0000000..70f0dca Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_drums.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.1.ogg new file mode 100644 index 0000000..2aac07b Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.2.ogg new file mode 100644 index 0000000..5ba7b3e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.3.ogg new file mode 100644 index 0000000..80b5d07 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.4.ogg new file mode 100644 index 0000000..690cc85 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_exotic_creature_song.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.1.ogg new file mode 100644 index 0000000..603c69a Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.10.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.10.ogg new file mode 100644 index 0000000..bf44827 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.10.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.11.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.11.ogg new file mode 100644 index 0000000..ca68c4e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.11.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.12.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.12.ogg new file mode 100644 index 0000000..6d0db2d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.12.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.2.ogg new file mode 100644 index 0000000..0fde66a Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.3.ogg new file mode 100644 index 0000000..b457bc9 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.4.ogg new file mode 100644 index 0000000..e192138 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.5.ogg new file mode 100644 index 0000000..61cba0d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.6.ogg new file mode 100644 index 0000000..23a8120 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.7.ogg new file mode 100644 index 0000000..3851405 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.8.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.8.ogg new file mode 100644 index 0000000..4896988 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.8.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.9.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.9.ogg new file mode 100644 index 0000000..21b33f0 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_flies.9.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.1.ogg new file mode 100644 index 0000000..94dde63 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.2.ogg new file mode 100644 index 0000000..34c9b6b Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.3.ogg new file mode 100644 index 0000000..ff8a412 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.4.ogg new file mode 100644 index 0000000..18b9d3f Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.5.ogg new file mode 100644 index 0000000..c310eca Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.6.ogg new file mode 100644 index 0000000..5314971 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_frog.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.1.ogg new file mode 100644 index 0000000..b3d4615 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.2.ogg new file mode 100644 index 0000000..64df26e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.3.ogg new file mode 100644 index 0000000..731620d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.4.ogg new file mode 100644 index 0000000..eb10a21 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.5.ogg new file mode 100644 index 0000000..72a2244 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.6.ogg new file mode 100644 index 0000000..9e6864d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.7.ogg new file mode 100644 index 0000000..6f528e0 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_horse_neigh.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.1.ogg new file mode 100644 index 0000000..5a34819 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.2.ogg new file mode 100644 index 0000000..c5ca4cf Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.3.ogg new file mode 100644 index 0000000..b490a72 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.4.ogg new file mode 100644 index 0000000..d0979ea Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.5.ogg new file mode 100644 index 0000000..4624b35 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.6.ogg new file mode 100644 index 0000000..7c7ac11 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howler_monkey.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.1.ogg new file mode 100644 index 0000000..e8675f8 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.2.ogg new file mode 100644 index 0000000..31e294c Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.3.ogg new file mode 100644 index 0000000..d8f06b0 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.4.ogg new file mode 100644 index 0000000..8b37e0f Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.5.ogg new file mode 100644 index 0000000..d8d3a51 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.6.ogg new file mode 100644 index 0000000..1458271 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.7.ogg new file mode 100644 index 0000000..3d2366c Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_howling.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.1.ogg new file mode 100644 index 0000000..64959cc Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.10.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.10.ogg new file mode 100644 index 0000000..b2f17db Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.10.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.11.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.11.ogg new file mode 100644 index 0000000..9012590 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.11.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.12.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.12.ogg new file mode 100644 index 0000000..e4ce7d0 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.12.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.2.ogg new file mode 100644 index 0000000..22d33f5 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.3.ogg new file mode 100644 index 0000000..c213e94 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.4.ogg new file mode 100644 index 0000000..a84564f Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.5.ogg new file mode 100644 index 0000000..7455a5d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.6.ogg new file mode 100644 index 0000000..889b315 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.7.ogg new file mode 100644 index 0000000..bf0e40f Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.8.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.8.ogg new file mode 100644 index 0000000..262ca9d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.8.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.9.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.9.ogg new file mode 100644 index 0000000..44c8212 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_jungle_bird.9.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_long_bird_song_slow.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_long_bird_song_slow.ogg new file mode 100644 index 0000000..65721a7 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_long_bird_song_slow.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.1.ogg new file mode 100644 index 0000000..2eb3ad2 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.2.ogg new file mode 100644 index 0000000..4d3e50e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.3.ogg new file mode 100644 index 0000000..3772cd0 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.4.ogg new file mode 100644 index 0000000..5fb382e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.5.ogg new file mode 100644 index 0000000..e989221 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.6.ogg new file mode 100644 index 0000000..2ed89ec Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.7.ogg new file mode 100644 index 0000000..8a156a8 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.1.ogg new file mode 100644 index 0000000..c0c7082 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.2.ogg new file mode 100644 index 0000000..7b36fb1 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.3.ogg new file mode 100644 index 0000000..ba5b5a9 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.4.ogg new file mode 100644 index 0000000..06c0c05 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.5.ogg new file mode 100644 index 0000000..0c8d686 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.6.ogg new file mode 100644 index 0000000..7b1c4b1 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_solitary_bird_song.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.1.ogg new file mode 100644 index 0000000..0ffef09 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.2.ogg new file mode 100644 index 0000000..976806c Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.3.ogg new file mode 100644 index 0000000..dc6e593 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.4.ogg new file mode 100644 index 0000000..064ae08 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.5.ogg new file mode 100644 index 0000000..5b06904 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.6.ogg new file mode 100644 index 0000000..48b2f51 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.7.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.7.ogg new file mode 100644 index 0000000..aa16352 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whale.7.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.1.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.1.ogg new file mode 100644 index 0000000..554697f Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.1.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.2.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.2.ogg new file mode 100644 index 0000000..0a817c4 Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.2.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.3.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.3.ogg new file mode 100644 index 0000000..0d0a00c Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.3.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.4.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.4.ogg new file mode 100644 index 0000000..ada575d Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.4.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.5.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.5.ogg new file mode 100644 index 0000000..af6d54c Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.5.ogg differ diff --git a/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.6.ogg b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.6.ogg new file mode 100644 index 0000000..d5b368e Binary files /dev/null and b/mods/dfcaverns/df_ambience/sounds/dfcaverns_whispers.6.ogg differ diff --git a/mods/dfcaverns/df_ambience/soundsets.lua b/mods/dfcaverns/df_ambience/soundsets.lua new file mode 100644 index 0000000..ca29454 --- /dev/null +++ b/mods/dfcaverns/df_ambience/soundsets.lua @@ -0,0 +1,174 @@ +if minetest.get_modpath("chasms") then +df_ambience.add_set({ + frequency = 0.03, + sounds = { + {name = "dfcaverns_long_bird_song_slow", gain = 0.5}, + {name = "dfcaverns_crow_slow", gain = 0.5}, + {name = "dfcaverns_bird_noise", gain = 0.5}, + }, + sound_check = function(def) + if chasms.is_in_chasm(def.pos) then return true end + end, +}) +end + +-- Level 1 + +df_ambience.add_set({ + frequency = 0.075, + nodes = {"df_mapitems:dirt_with_cave_moss", "df_trees:fungiwood", "df_trees:fungiwood_shelf"}, + sounds = { + {name = "dfcaverns_bird_budgie_song", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "fungiwood" or def.biome == "fungispore" + end, +}) + +df_ambience.add_set({ + frequency = 0.050, + nodes = {"df_mapitems:dirt_with_cave_moss", "df_trees:tower_cap_stem", "df_trees:tower_cap_gills", "df_trees:tower_cap"}, + sounds = { + {name = "dfcaverns_exotic_creature_song", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "towercap" or def.biome == "towergoblin" + end, +}) + +-- Level 2 + +df_ambience.add_set({ + frequency = 0.050, + nodes = {"df_mapitems:dirt_with_cave_moss", "df_trees:goblin_cap_stem", "df_trees:goblin_cap", "df_trees:goblin_cap_gills"}, + sounds = { + {name = "dfcaverns_pig_grunting_grumbling", gain = 0.25}, + }, + sound_check = function(def) + return def.biome == "goblincap" or def.biome == "towergoblin" + end, +}) + +df_ambience.add_set({ + frequency = 0.025, + nodes = {"df_mapitems:dirt_with_stillworm", "df_trees:tunnel_tube", "df_trees:tunnel_tube_slant_bottom", "df_trees:tunnel_tube_slant_top", "df_trees:tunnel_tube_slant_full", "df_trees:tunnel_tube_fruiting_body"}, + sounds = { + {name = "dfcaverns_solitary_bird_song", gain = 0.25}, + }, + sound_check = function(def) + return def.biome == "tunneltube" + end, +}) + +df_ambience.add_set({ + frequency = 0.035, + nodes = {"df_mapitems:dirt_with_pebble_fungus", "df_trees:spore_tree", "df_trees:spore_tree_hyphae", "df_trees:spore_tree_fruiting_body"}, + sounds = { + {name = "dfcaverns_horse_neigh", gain = 0.25}, + }, + sound_check = function(def) + return def.biome == "sporetree" or def.biome == "fungispore" + end, +}) + +-- Level 3 + +local ice = df_dependencies.node_name_ice +local snow = df_dependencies.node_name_snow +df_ambience.add_set({ + frequency = 0.050, + nodes = {"df_mapitems:icicle_1", "df_mapitems:icicle_2", "df_mapitems:icicle_3", "df_mapitems:icicle_4", "ice_sprites:ice_sprite", "ice_sprites:hidden_ice_sprite", "df_trees:nether_cap", "df_trees:nether_cap_gills", "df_trees:nether_cap_stem", ice, snow}, + sounds = { + {name = "dfcaverns_howling", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "nethercap" + end, +}) + +df_ambience.add_set({ + frequency = 0.075, + nodes = {"df_trees:blood_thorn", "df_trees:blood_thorn_spike"}, + sounds = { + {name = "dfcaverns_flies", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "bloodthorn" + end, +}) + +-- blackcap left silent, torchspines make their own noise + +-- Sunless sea + +local water_source = df_dependencies.node_name_water_source +df_ambience.add_set({ + frequency = 0.050, + sounds = { + {name = "dfcaverns_whale", gain = 0.5}, + }, + sound_check = function(def) + return def.head_node == water_source and df_caverns.get_biome(def.pos) == "sunless undersea" + end, +}) + + +-- Oil sea +-- No soundset here + +-- Lava sea + +if minetest.get_modpath("df_underworld_items") then +local lava_source = df_dependencies.node_name_lava_source +df_ambience.add_set({ + frequency = 0.0750, + nodes = {lava_source}, + sounds = { + {name = "dfcaverns_massive_digging", gain = 1.0}, + {name = "dfcaverns_avalanche", gain = 1.0}, + }, + sound_check = function(def) + return df_caverns.get_biome(def.pos) == "lava_sea" + end, +}) +end + +-- Underworld + +df_ambience.add_set({ + frequency = 0.025, + nodes = {"df_underworld_items:slade"}, + sounds = { + {name = "dfcaverns_whispers", gain = 0.15}, + }, + sound_check = function(def) + return def.biome == "underworld" + end, +}) + +-- Primordial + +local jungle_bird = {name = "dfcaverns_jungle_bird", gain = 0.4} +df_ambience.add_set({ + frequency = 0.075, + nodes = {"df_primordial_items:dirt_with_jungle_grass", "df_primordial_items:fern_1", "df_primordial_items:fern_2", "df_primordial_items:giant_fern_leaves", "df_primordial_items:giant_fern_tree", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:glow_plant_1", "df_primordial_items:glow_plant_2", "df_primordial_items:glow_plant_3", "df_primordial_items:jungle_grass_1", "df_primordial_items:jungle_grass_2", "df_primordial_items:jungle_grass_3", "df_primordial_items:jungle_ivy", "df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing", "df_primordial_items:jungle_mushroom_1", "df_primordial_items:jungle_mushroom_2", "df_primordial_items:jungle_mushroom_cap_1", "df_primordial_items:jungle_mushroom_cap_2", "df_primordial_items:jungle_mushroom_trunk", "df_primordial_items:jungle_roots_1", "df_primordial_items:jungle_roots_2", "df_primordial_items:jungle_thorns", "df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_glowing", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:packed_roots", "df_primordial_items:plant_matter", }, + sounds = { + {name = "dfcaverns_drums", gain = 0.3}, + {name = "dfcaverns_frog", gain = 0.5}, + jungle_bird, jungle_bird, -- double up the birds to make them more common + }, + sound_check = function(def) + return def.biome == "primordial jungle" + end, +}) + +df_ambience.add_set({ + frequency = 0.05, + nodes = {"df_primordial_items:dirt_with_mycelium", "df_primordial_items:fungal_grass_1", "df_primordial_items:fungal_grass_2", "df_primordial_items:glow_orb", "df_primordial_items:glow_orb_stalks", "df_primordial_items:glow_pods", "df_primordial_items:giant_hypha_root", "df_primordial_items:giant_hypha", "df_primordial_items:mushroom_cap", "df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing", "df_primordial_items:mushroom_trunk", "df_primordial_items:glow_orb_hanging", "df_primordial_items:glownode", "df_primordial_items:glownode_stalk",}, + sounds = { + {name = "dfcaverns_howler_monkey", gain = 0.3}, + }, + sound_check = function(def) + return def.biome == "primordial fungus" + end, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/LICENSE.txt b/mods/dfcaverns/df_caverns/LICENSE.txt new file mode 100644 index 0000000..b0f19df --- /dev/null +++ b/mods/dfcaverns/df_caverns/LICENSE.txt @@ -0,0 +1,22 @@ +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/dungeon_loot.lua b/mods/dfcaverns/df_caverns/dungeon_loot.lua new file mode 100644 index 0000000..cae636e --- /dev/null +++ b/mods/dfcaverns/df_caverns/dungeon_loot.lua @@ -0,0 +1,159 @@ +if minetest.get_modpath("dungeon_loot") then + +if df_caverns.config.enable_underworld then + dungeon_loot.register({ + {name = "df_underworld_items:glow_amethyst", chance = 0.3, count = {1, 12}, y = {-32768, df_caverns.config.lava_sea_level}}, + }) +end + +if df_caverns.config.enable_oil_sea and minetest.get_modpath("bucket") then + dungeon_loot.register({ + {name = "oil:oil_bucket", chance = 0.5, count = {1, 3}, y = {-32768, df_caverns.config.ymax}}, + }) +end + +if df_caverns.config.enable_lava_sea then + dungeon_loot.register({ + {name = "df_mapitems:mese_crystal", chance = 0.25, count = {1, 5}, y = {-32768, df_caverns.config.sunless_sea_min}}, + {name = "df_mapitems:glow_mese", chance = 0.1, count = {1, 3}, y = {-32768, df_caverns.config.sunless_sea_min}}, + }) +end + +dungeon_loot.register({ + {name = "df_farming:cave_wheat_seed", chance = 0.5, count = {1, 10}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_farming:cave_bread", chance = 0.8, count = {1, 10}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_farming:pig_tail_thread", chance = 0.7, count = {1, 10}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_farming:plump_helmet_spawn", chance = 0.4, count = {1, 8}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_farming:plump_helmet_4_picked", chance = 0.8, count = {1, 15}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_trees:glowing_bottle_red", chance = 0.6, count = {1, 20}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_trees:glowing_bottle_green", chance = 0.5, count = {1, 20}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_trees:glowing_bottle_cyan", chance = 0.4, count = {1, 15}, y = {-32768, df_caverns.config.ymax}}, + {name = "df_trees:glowing_bottle_golden", chance = 0.3, count = {1, 5}, y = {-32768, df_caverns.config.ymax}}, + + {name = "df_farming:pig_tail_seed", chance = 0.5, count = {1, 10}, y = {-32768, df_caverns.config.level1_min}}, + {name = "df_mapitems:med_crystal", chance = 0.2, count = {1, 2}, y = {-32768, df_caverns.config.level1_min}}, + + {name = "df_farming:dimple_cup_seed", chance = 0.3, count = {1, 10}, y = {-32768, df_caverns.config.level2_min}}, + {name = "df_farming:quarry_bush_seed", chance = 0.3, count = {1, 5}, y = {-32768, df_caverns.config.level2_min}}, + {name = "df_farming:sweet_pod_seed", chance = 0.3, count = {1, 5}, y = {-32768, df_caverns.config.level2_min}}, + {name = "df_mapitems:big_crystal", chance = 0.1, count = {1, 1}, y = {-32768, df_caverns.config.level2_min}}, + {name = "df_trees:torchspine_ember", chance = 0.3, count = {1, 3}, y = {-32768, df_caverns.config.level2_min}}, + {name = "ice_sprites:ice_sprite_bottle", chance = 0.1, count = {1, 1}, y = {-32768, df_caverns.config.level2_min}}, +}) + +end + +if minetest.get_modpath("bones_loot") and df_caverns.config.enable_underworld then + +if minetest.get_modpath("default") then +bones_loot.register_loot({ + {name = "binoculars:binoculars", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "boats:boat", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "bucket:bucket_empty", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}}, + {name = "fire:flint_and_steel", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:tulip_black", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:dandelion_white", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:dandelion_yellow", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:rose", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:tulip", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:chrysanthemum_green", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:geranium", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "map:mapping_kit", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "screwdriver:screwdriver", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + -- don't give the player tnt:tnt, they can craft that from this if tnt is enabled for them + {name = "tnt:gunpowder", chance = 0.4, count = {1,10}, types = {"underworld_warrior"}}, + {name = "tnt:tnt_stick", chance = 0.3, count = {1,6}, types = {"underworld_warrior"}}, + + {name = "vessels:steel_bottle", chance = 0.4, count = {1,3}, types = {"underworld_warrior"}}, + {name = "vessels:glass_bottle", chance = 0.2, count = {1,2}, types = {"underworld_warrior"}}, + {name = "vessels:glass_fragments", chance = 0.1, count = {1,4}, types = {"underworld_warrior"}}, + + {name = "default:book", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:paper", chance = 0.1, count = {1,6}, types = {"underworld_warrior"}}, + {name = "default:skeleton_key", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:torch", chance = 0.75, count = {1,10}, types = {"underworld_warrior"}}, + + {name = "default:pick_bronze", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:pick_steel", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:pick_mese", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:pick_diamond", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:shovel_bronze", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:shovel_steel", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:shovel_mese", chance = 0.025, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:shovel_diamond", chance = 0.025, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:axe_bronze", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:axe_steel", chance = 0.5, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:axe_mese", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:axe_diamond", chance = 0.15, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:sword_bronze", chance = 0.5, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:sword_steel", chance = 0.75, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:sword_mese", chance = 0.35, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:sword_diamond", chance = 0.35, count = {1,1}, types = {"underworld_warrior"}}, + + {name = "default:coal_lump", chance = 0.5, count = {1,5}, types = {"underworld_warrior"}}, + {name = "default:mese_crystal", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:diamond", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:steel_ingot", chance = 0.2, count = {1,3}, types = {"underworld_warrior"}}, + {name = "default:copper_ingot", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}}, + {name = "default:bronze_ingot", chance = 0.2, count = {1,5}, types = {"underworld_warrior"}}, + {name = "default:gold_ingot", chance = 0.3, count = {1,3}, types = {"underworld_warrior"}}, + {name = "default:mese_crystal_fragment", chance = 0.4, count = {1,5}, types = {"underworld_warrior"}}, + {name = "default:obsidian_shard", chance = 0.4, count = {1,3}, types = {"underworld_warrior"}}, + {name = "default:flint", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}}, + {name = "default:sign_wall_wood", chance = 0.1, count = {1,4}, types = {"underworld_warrior"}}, + {name = "default:sign_wall_steel", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}}, + {name = "default:ladder_wood", chance = 0.5, count = {1,10}, types = {"underworld_warrior"}}, + {name = "default:ladder_steel", chance = 0.2, count = {1,5}, types = {"underworld_warrior"}}, + {name = "default:meselamp", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}}, + {name = "default:mese_post_light", chance = 0.25, count = {1,5}, types = {"underworld_warrior"}}, +}) +end + +if minetest.get_modpath("mcl_core") then +bones_loot.register_loot({ + -- Taken from the ruined portal loot table in mcl + {name = "mcl_core:iron_nugget", types = {"underworld_warrior"}, chance = 40/50, count ={9, 18}}, + {name = "mcl_core:flint", types = {"underworld_warrior"}, chance = 40/50, count ={9, 18}}, + {name = "mcl_core:obsidian", types = {"underworld_warrior"}, chance = 40/50, count ={1, 2}}, + {name = "mcl_fire:fire_charge", types = {"underworld_warrior"}, chance = 40/50, count ={1, 1}}, + {name = "mcl_fire:flint_and_steel", types = {"underworld_warrior"}, chance = 40/50, count ={1, 1}}, + {name = "mcl_core:gold_nugget", types = {"underworld_warrior"}, chance = 15/50, count ={4, 24}}, + {name = "mcl_core:apple_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:axe_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_farming:hoe_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:pick_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:shovel_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:sword_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:helmet_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:chestplate_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:leggings_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:boots_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_potions:speckled_melon", types = {"underworld_warrior"}, chance = 5/50, count ={4, 12}}, + {name = "mcl_farming:carrot_item_gold", types = {"underworld_warrior"}, chance = 5/50, count ={4, 12}}, + {name = "mcl_core:gold_ingot", types = {"underworld_warrior"}, chance = 5/50, count ={2, 8}}, + {name = "mcl_clock:clock", types = {"underworld_warrior"}, chance = 5/50, count ={1,1}}, + {name = "mesecons_pressureplates:pressure_plate_gold_off", types = {"underworld_warrior"}, chance = 5/50, count ={1,1}}, + {name = "mobs_mc:gold_horse_armor", types = {"underworld_warrior"}, chance = 5/50, count ={1,1}}, + {name = "mcl_bells:bell", types = {"underworld_warrior"}, chance = 1/50, count ={1,1}}, + {name = "mcl_core:apple_gold_enchanted", types = {"underworld_warrior"}, chance = 1/50, count ={1,1}}, +}) + +for flower_name, _ in pairs(mcl_flowers.registered_simple_flowers) do + bones_loot.register_loot({ + {name = flower_name, chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + }) + +end + +end + +bones_loot.register_loot({ + {name = "ice_sprites:ice_sprite_bottle", chance = 0.025, count = {1, 1}, types = {"underworld_warrior"}}, + {name = "df_underworld_items:glow_amethyst", chance = 0.25, count = {1, 2}, types = {"underworld_warrior"}}, +}) + +if df_caverns.config.enable_lava_sea then + bones_loot.register_loot({name = "df_mapitems:mese_crystal", chance = 0.25, count = {1, 2}, types = {"underworld_warrior"}}) +end + +end \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/growth_restrictions.lua b/mods/dfcaverns/df_caverns/growth_restrictions.lua new file mode 100644 index 0000000..db9d814 --- /dev/null +++ b/mods/dfcaverns/df_caverns/growth_restrictions.lua @@ -0,0 +1,48 @@ +local add_biome_restrictions = function(root_table, function_name, biome_set) + local old_function = root_table[function_name] + root_table[function_name] = function(pos) + local biome = df_caverns.get_biome(pos) + return old_function(pos) and biome_set[biome] + end +end + +if df_caverns.config.restrict_trees_to_biomes then + + if minetest.get_modpath("df_trees") then + add_biome_restrictions(df_trees, "black_cap_growth_permitted", {blackcap = true}) + add_biome_restrictions(df_trees, "blood_thorn_growth_permitted", {bloodthorn = true}) + add_biome_restrictions(df_trees, "fungiwood_growth_permitted", {fungiwood = true, fungispore = true}) + add_biome_restrictions(df_trees, "goblin_cap_growth_permitted", {goblincap = true, towergoblin = true}) + add_biome_restrictions(df_trees, "nether_cap_growth_permitted", {nethercap = true}) + add_biome_restrictions(df_trees, "spore_tree_growth_permitted", {sporetree = true, fungispore = true}) + add_biome_restrictions(df_trees, "tower_cap_growth_permitted", {towercap = true, towergoblin = true}) + add_biome_restrictions(df_trees, "tunnel_tube_growth_permitted", {tunneltube = true}) + -- Deliberately not biome-restricted + --add_biome_restrictions(df_trees, "torchspine_growth_permitted", {}) + --add_biome_restrictions(df_trees, "spindlestem_growth_permitted", {}) + end + + if minetest.get_modpath("df_primordial_items") then + add_biome_restrictions(df_primordial_items, "primordial_mushroom_growth_permitted", {["primordial fungus"] = true}) + add_biome_restrictions(df_primordial_items, "giant_mycelium_growth_permitted", {["primordial fungus"] = true}) + add_biome_restrictions(df_primordial_items, "giant_fern_growth_permitted", {["primordial jungle"] = true}) + add_biome_restrictions(df_primordial_items, "jungle_mushroom_growth_permitted", {["primordial jungle"] = true}) + add_biome_restrictions(df_primordial_items, "jungletree_growth_permitted", {["primordial jungle"] = true}) + end + +end + +if df_caverns.config.restrict_farmables_to_biomes and minetest.get_modpath("df_farming") then + add_biome_restrictions(df_farming.growth_permitted, "df_farming:cave_wheat_seed", + {fungiwood = true, tunneltube = true, sporetree = true, fungispore = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:dimple_cup_seed", + {towergoblin = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:pig_tail_seed", + {sporetree = true, fungispore = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:quarry_bush_seed", + {bloodthorn = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:sweet_pod_seed", + {tunneltube = true, fungispore = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:plump_helmet_spawn", + {fungiwood = true, towercap = true, goblincap = true, towergoblin = true}) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/init.lua b/mods/dfcaverns/df_caverns/init.lua new file mode 100644 index 0000000..ceeee01 --- /dev/null +++ b/mods/dfcaverns/df_caverns/init.lua @@ -0,0 +1,21 @@ +df_caverns = {} +df_caverns.config = df_dependencies.config + +--grab a shorthand for the filepath of the mod +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +--load companion lua files +dofile(modpath.."/node_ids.lua") + +dofile(modpath.."/shared.lua") +dofile(modpath.."/surface_tunnels.lua") +dofile(modpath.."/level1.lua") +dofile(modpath.."/level2.lua") +dofile(modpath.."/level3.lua") +dofile(modpath.."/sunless_sea.lua") +dofile(modpath.."/oil_sea.lua") +dofile(modpath.."/lava_sea.lua") +dofile(modpath.."/underworld.lua") +dofile(modpath.."/primordial.lua") +dofile(modpath.."/dungeon_loot.lua") +dofile(modpath.."/growth_restrictions.lua") \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/lava_sea.lua b/mods/dfcaverns/df_caverns/lava_sea.lua new file mode 100644 index 0000000..25e0a35 --- /dev/null +++ b/mods/dfcaverns/df_caverns/lava_sea.lua @@ -0,0 +1,157 @@ +if not df_caverns.config.enable_lava_sea then + return +end + +local c_air = df_caverns.node_id.air +local c_lava = df_caverns.node_id.lava +local c_meseore = df_caverns.node_id.meseore +local c_mese_crystal = df_caverns.node_id.mese_crystal +local c_mese_crystal_block = df_caverns.node_id.mese_crystal_block +local c_obsidian = df_caverns.node_id.obsidian + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end +------------------------------------------------------------------------------------------- + +local perlin_cave = { + offset = 0, + scale = 1, + spread = {x=100, y=100, z=100}, + seed = -787324, + octaves = 3, + persist = 0.67 +} + +-- large-scale rise and fall +local perlin_wave = { + offset = 0, + scale = 1, + spread = {x=1000, y=1000, z=1000}, + seed = 256664, + octaves = 3, + persist = 0.67 +} + +local perlin_mese = { + offset = 0, + scale = 1, + spread = {x=500, y=500, z=500}, + seed = -50001, + octaves = 3, + persist = 0.67 +} + +local median = df_caverns.config.lava_sea_level +local floor_mult = 60 +local floor_displace = -25 +local ceiling_mult = -40 +local ceiling_displace = 15 +local wave_mult = 10 + +local y_max = median + 2*wave_mult + -2*ceiling_mult + ceiling_displace +local y_min = median - 2*wave_mult - 2*floor_mult + floor_displace + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y > y_max or pos.y < y_min then + return + end + return "lava_sea" +end) + +minetest.register_on_generated(function(minp, maxp, seed) + --if out of range of cave definition limits, abort + if minp.y > y_max or maxp.y < y_min then + return + end + + local t_start = os.clock() + + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2() + + local nvals_cave = mapgen_helper.perlin2d("df_caverns:lava_cave", minp, maxp, perlin_cave) + local nvals_wave = mapgen_helper.perlin2d("df_caverns:lava_wave", minp, maxp, perlin_wave) + local nvals_mese = mapgen_helper.perlin2d("df_caverns:lava_mese", minp, maxp, perlin_mese) + local nvals_lavasurface = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + + for vi, x, y, z in area:iterp_yxz(minp, maxp) do + local index2d = mapgen_helper.index2d(minp, maxp, x, z) + + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + local lava = nvals_lavasurface[index2d] + + local floor_height = math.floor(abs_cave * floor_mult + floor_displace + median + wave) + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + local lava_height = math.floor(median + lava * 2) + + if y >= floor_height - 2 and y >= ceiling_height and y < ceiling_height + 2 and y <= lava_height + 2 and not mapgen_helper.buildable_to(data[vi]) then + data[vi] = c_obsidian -- obsidian ceiling + elseif y > floor_height and y < ceiling_height then + if y > lava_height then + data[vi] = c_air + else + data[vi] = c_lava + if log_location then log_location("magma_sea", area:position(vi)) end + end + elseif y > floor_height - 5 and y < ceiling_height and y <= lava_height + 2 and not mapgen_helper.buildable_to(data[vi]) then + data[vi] = c_obsidian -- thick obsidian floor + elseif y < lava_height and data[vi] == c_air then + data[vi] = c_lava + end + end + + -- decoration loop. + for x = minp.x + 1, maxp.x-1 do + for z = minp.z + 1, maxp.z -1 do + local index2d = mapgen_helper.index2d(minp, maxp, x, z) + local mese_intensity = math.abs(nvals_mese[index2d]) + + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + local floor_height = math.floor(abs_cave * floor_mult + floor_displace + median + wave) + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + + local lava = nvals_lavasurface[index2d] + local lava_height = math.floor(median + lava * 2) + + if mese_intensity > 0.65 and ceiling_height > lava_height + 1 and ceiling_height > floor_height + 1 and ceiling_height <= maxp.y and ceiling_height >= minp.y then + local vi = area:index(x, ceiling_height, z) + if not mapgen_helper.buildable_to(data[vi]) then + -- decorate ceiling + if math.random() < 0.25 then + data[vi] = c_meseore + if log_location then log_location("magma_sea_meseore", area:position(vi)) end + elseif mese_intensity > 0.75 and math.random() < 0.1 then + data[vi] = c_meseore + local bi = vi-area.ystride + data[bi] = c_mese_crystal + data_param2[bi] = math.random(1,4) + 19 + if log_location then log_location("magma_sea_mesecrystal", area:position(vi)) end + elseif mese_intensity > 0.85 and math.random() < 0.025 then + subterrane.big_stalactite(vi-area.ystride, area, data, 6, 13, c_meseore, c_meseore, c_mese_crystal_block) + if log_location then log_location("magma_sea_mesebig", area:position(vi)) end + end + end + end + end + end + + + --send data back to voxelmanip + vm:set_data(data) + vm:set_param2_data(data_param2) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + + vm:update_liquids() + --write it to world + vm:write_to_map() + + local time_taken = os.clock() - t_start -- how long this chunk took, in seconds + mapgen_helper.record_time("df_caverns lava sea", time_taken) +end) \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/level1.lua b/mods/dfcaverns/df_caverns/level1.lua new file mode 100644 index 0000000..617ce75 --- /dev/null +++ b/mods/dfcaverns/df_caverns/level1.lua @@ -0,0 +1,341 @@ +local c_water = df_caverns.node_id.water +local c_air = df_caverns.node_id.air +local c_dirt = df_caverns.node_id.dirt +local c_dirt_moss = df_caverns.node_id.dirt_moss +local c_gravel = df_caverns.node_id.gravel +local c_wet_flowstone = df_caverns.node_id.wet_flowstone +local c_dry_flowstone = df_caverns.node_id.dry_flowstone +local c_spindlestem_white = df_caverns.node_id.spindlestem_white + +local tower_cap_shrublist +local fungiwood_shrublist + +local chasms_path = minetest.get_modpath("chasms") + +if minetest.get_modpath("df_farming") then + tower_cap_shrublist = { + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } + fungiwood_shrublist = { + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } +end + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local subsea_level = df_caverns.config.level1_min - (df_caverns.config.level1_min - df_caverns.config.ymax) * 0.33 +local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) + +local get_biome = function(heat, humidity) + if humidity < 23 then -- about 20% of locations fall below this threshold + return "barren" + elseif heat < 50 then + return "towercap" + else + return "fungiwood" + end +end + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.level1_min or pos.y > df_caverns.config.ymax then + return nil + end + return get_biome(heat, humidity) +end) + +local tower_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air and data[vi-ystride] ~= c_water then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_dirt_moss + end + + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, tower_cap_shrublist) + elseif abs_cracks > 0.25 then + if math.random() < 0.01 then + df_trees.spawn_tower_cap_vm(vi+ystride, area, data) + elseif math.random() < 0.04 then + df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_spindlestem_white) + end + end + end +end + +local fungiwood_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air and data[vi-ystride] ~= c_water then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_dirt_moss + end + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, fungiwood_shrublist) + elseif math.random() < 0.03 and abs_cracks > 0.35 then + df_trees.spawn_fungiwood_vm(vi+ystride, area, data) + elseif math.random() < 0.04 then + df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2) + end + end +end + +local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data) + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local heatmap = minetest.get_mapgen_object("heatmap") + local humiditymap = minetest.get_mapgen_object("humiditymap") + local data_param2 = df_caverns.data_param2 + vm:get_param2_data(data_param2) + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + local nvals_cave = node_arrays.nvals_cave + local cave_area = node_arrays.cave_area + + -- Partly fill flooded caverns and warrens + if minp.y <= subsea_level then + for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do + -- convert all air below sea level into water + if y <= subsea_level and data[vi] == c_air and nvals_cave[vi] < -flooding_threshold then + data[vi] = c_water + end + end + end + + --------------------------------------------------------- + -- Cavern floors + + for _, vi in ipairs(node_arrays.cavern_floor_nodes) do + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local abs_cracks = math.abs(nvals_cracks[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then + -- underwater floor + df_caverns.flooded_cavern_floor(abs_cracks, vert_rand, vi, area, data) + if log_location then log_location("level1_flooded_"..biome_name, area:position(vi)) end + elseif biome_name == "towercap" then + tower_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_towercap", area:position(vi)) end + elseif biome_name == "fungiwood" then + fungiwood_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_fungiwood", area:position(vi)) end + elseif biome_name == "barren" then + if flooded_caverns then + df_caverns.wet_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_barren_wet", area:position(vi)) end + else + df_caverns.dry_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_barren_dry", area:position(vi)) end + end + end + end + + -------------------------------------- + -- Cavern ceilings + + for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local abs_cracks = math.abs(nvals_cracks[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then + -- underwater ceiling, do nothing + elseif biome_name == "barren" then + if flooded_caverns then + -- wet barren + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + end + else + -- dry barren + if abs_cracks < 0.075 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end + end + else -- all the other biomes + df_caverns.glow_worm_cavern_ceiling(abs_cracks, vert_rand, vi, area, data, data_param2) + end + end + + ---------------------------------------------- + -- Tunnel floors + + for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false, c_gravel) + end + end + end + + ------------------------------------------------------ + -- Tunnel ceiling + + for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) + end + else + -- air pockets + local ystride = area.ystride + local cracks = nvals_cracks[index2d] + if cracks > 0.5 and data[vi-ystride] == c_water then + data[vi-ystride] = c_air + if cracks > 0.7 and data[vi-ystride*2] == c_water then + data[vi-ystride*2] = c_air + end + end + end + end + + ---------------------------------------------- + -- Warren floors + + for _, vi in ipairs(node_arrays.warren_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + local ystride = area.ystride + + if log_location then + local flood_name = "" + if flooded_caverns then flood_name = "_flooded" end + log_location("level1_warren_"..biome_name..flood_name, area:position(vi)) + end + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false, c_gravel) + end + + if biome_name ~= "barren" then + local cracks = nvals_cracks[index2d] + if cracks > 0.25 then + local rand = math.random() + if rand > cracks then + if math.random() < 0.25 then + data[vi] = c_dirt_moss + else + data[vi] = c_dirt + end + if data[vi+ystride] == c_air and math.random() < 0.25 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, tower_cap_shrublist) + end + end + if rand > cracks*2 then + df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2) + end + end + end + end + end + + ------------------------------------------------------ + -- Warren ceiling + + for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) + end + end + -- else air pockets? + end + + ---------------------------------------------- + -- Column material override for dry biome + + for _, vi in ipairs(node_arrays.column_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local dry = (biome_name == "barren") and (nvals_cave[vi] > 0) + + if dry and data[vi] == c_wet_flowstone then + data[vi] = c_dry_flowstone + end + + if chasms_path then + local pos = area:position(vi) + if chasms.is_in_chasm_without_taper(pos) then + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + if flooded_caverns and pos.y < subsea_level then + data[vi] = c_water + else + data[vi] = c_air + end + end + end + end + + vm:set_param2_data(data_param2) +end + +------------------------------------------------------------------------------------------- + +subterrane.register_layer({ + name = "cavern layer 1", + y_max = df_caverns.config.ymax, + y_min = df_caverns.config.level1_min, + cave_threshold = df_caverns.config.cavern_threshold, + boundary_blend_range = 64, -- range near ymin and ymax over which caves diminish to nothing + perlin_cave = df_caverns.perlin_cave, + perlin_wave = df_caverns.perlin_wave, + solidify_lava = true, + columns = { + maximum_radius = 10, + minimum_radius = 4, + node = "df_mapitems:wet_flowstone", + weight = 0.25, + maximum_count = 50, + minimum_count = 0, + }, + decorate = decorate_level_1, + warren_region_variability_threshold = 0.33, + double_frequency = true, + is_ground_content = df_caverns.is_ground_content, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/level2.lua b/mods/dfcaverns/df_caverns/level2.lua new file mode 100644 index 0000000..72e3e9f --- /dev/null +++ b/mods/dfcaverns/df_caverns/level2.lua @@ -0,0 +1,424 @@ +local c_water = df_caverns.node_id.water +local c_air = df_caverns.node_id.air +local c_dirt = df_caverns.node_id.dirt +local c_dirt_moss = df_caverns.node_id.dirt_moss +local c_gravel = df_caverns.node_id.gravel + +local c_stillworm = df_caverns.node_id.stillworm +local c_pebble_fungus = df_caverns.node_id.pebble_fungus +local c_red = df_caverns.node_id.spindlestem_red + +local c_wet_flowstone = df_caverns.node_id.wet_flowstone +local c_dry_flowstone = df_caverns.node_id.dry_flowstone + +local c_veinstone = df_caverns.node_id.veinstone +local c_pearls = df_caverns.node_id.pearls + +local chasms_path = minetest.get_modpath("chasms") + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local wall_vein_perlin_params = { + offset = 0, + scale = 1, + spread = {x = 50, y = 50, z = 50}, + seed = 2199, + octaves = 3, + persist = 0.63, + lacunarity = 2.0, + flags = "eased", +} + +local subsea_level = df_caverns.config.level2_min - (df_caverns.config.level2_min - df_caverns.config.level1_min) * 0.33 -- "sea level" for the flooded caverns. +local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) -- cavern value out to which we're flooding tunnels and warrens + +local get_biome = function(heat, humidity) + if humidity < 23 then -- about 20% of locations fall below this threshold + return "barren" + elseif heat < 40 then + return "goblincap" -- about 33% are below this threshold + elseif heat < 60 then + return "sporetree" -- another 33% + else + return "tunneltube" + end +end + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.level2_min or pos.y >= df_caverns.config.level1_min then + return nil + end + return get_biome(heat, humidity) +end) + +local goblin_cap_shrublist +local tunnel_tube_shrublist +local spore_tree_shrublist + +if minetest.get_modpath("df_farming") then + goblin_cap_shrublist = { + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } + tunnel_tube_shrublist = { + df_farming.spawn_sweet_pod_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } + spore_tree_shrublist = { + df_farming.spawn_pig_tail_vm, + df_farming.spawn_pig_tail_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } +end + +local goblin_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_dirt_moss + end + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, goblin_cap_shrublist) + elseif math.random() < 0.02 then + df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2, c_red) + elseif math.random() < 0.015 then + df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2) + end + end + +end + +local spore_tree_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_pebble_fungus + end + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, spore_tree_shrublist) + elseif math.random() < 0.05 then + df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2) + end + end +end + + +local tunnel_tube_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_stillworm + end + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, tunnel_tube_shrublist) + elseif math.random() < 0.05 then + df_trees.spawn_tunnel_tube_vm(vi+ystride, area, data, data_param2) + end + end +end + +local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data) + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local heatmap = minetest.get_mapgen_object("heatmap") + local humiditymap = minetest.get_mapgen_object("humiditymap") + local data_param2 = df_caverns.data_param2 + vm:get_param2_data(data_param2) + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + local nvals_cave = node_arrays.nvals_cave + local cave_area = node_arrays.cave_area + local cavern_def = node_arrays.cavern_def + + local vein_noise + local vein_area + + -- Partly fill flooded caverns and warrens + for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do + local cave_val = nvals_cave[vi] + if cave_val < -flooding_threshold then + if mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp) then + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local cave_threshold = cavern_def.cave_threshold + + --check if we're just inside the boundary of the (negazone) cavern threshold + if biome_name == "barren" and cave_val < -cave_threshold and cave_val > -cave_threshold - 0.01 then + -- add giant rooty structures to the flooded barren caverns + if vein_noise == nil then + vein_noise, vein_area = mapgen_helper.perlin3d("df_caverns:wall_veins", minp, maxp, wall_vein_perlin_params) + end + if data[vi] == c_air and math.abs(vein_noise[vein_area:transform(area, vi)]) < 0.02 then + data[vi] = c_veinstone + end + if log_location then log_location("level2_veinstone", area:position(vi)) end + end + end + if data[vi] == c_air and y <= subsea_level then + data[vi] = c_water -- otherwise, fill air with water when below sea level + end + end + end + + --------------------------------------------------------- + -- Cavern floors + + for _, vi in ipairs(node_arrays.cavern_floor_nodes) do + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local abs_cracks = math.abs(nvals_cracks[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then + -- underwater floor + df_caverns.flooded_cavern_floor(abs_cracks, vert_rand, vi, area, data) + if log_location then log_location("level2_flooded_"..biome_name, area:position(vi)) end + elseif biome_name == "barren" then + if flooded_caverns then + df_caverns.wet_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_barren_wet", area:position(vi)) end + else + df_caverns.dry_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_barren_dry", area:position(vi)) end + end + elseif biome_name == "goblincap" then + goblin_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_goblincap", area:position(vi)) end + elseif biome_name == "sporetree" then + spore_tree_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_sporetree", area:position(vi)) end + elseif biome_name == "tunneltube" then + tunnel_tube_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_tunneltube", area:position(vi)) end + end + end + + -------------------------------------- + -- Cavern ceilings + + for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local abs_cracks = math.abs(nvals_cracks[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then + -- underwater ceiling, do nothing + elseif biome_name == "barren" then + if flooded_caverns then + -- wet barren + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + end + else + -- dry barren + if abs_cracks < 0.075 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end + local y = area:get_y(vi) + local y_proportional = (y - df_caverns.config.level1_min) / (df_caverns.config.level2_min - df_caverns.config.level1_min) + if abs_cracks * y_proportional > 0.3 and math.random() < 0.005 * y_proportional then + df_mapitems.place_big_crystal_cluster(area, data, data_param2, vi, math.random(0,1), true) + end + end + else -- all the other biomes + df_caverns.glow_worm_cavern_ceiling(abs_cracks, vert_rand, vi, area, data, data_param2) + end + end + + ---------------------------------------------- + -- Tunnel floors + + for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false, c_gravel) + end + end + end + + ------------------------------------------------------ + -- Tunnel ceiling + + for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + local ystride = area.ystride + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) + end + if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then + for i= 1, 4 do + if math.random() > 0.5 then + local index = vi-i*ystride + if data[index] == c_air then + df_mapitems.place_against_surface_vm(c_pearls, index, area, data, data_param2) + end + end + end + end + else + -- air pockets + local ystride = area.ystride + local cracks = nvals_cracks[index2d] + if cracks > 0.4 and data[vi-ystride] == c_water then + data[vi-ystride] = c_air + if cracks > 0.6 and data[vi-ystride*2] == c_water then + data[vi-ystride*2] = c_air + end + end + end + end + + ---------------------------------------------- + -- Warren floors + + for _, vi in ipairs(node_arrays.warren_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if log_location then + local flood_name = "" + if flooded_caverns then flood_name = "_flooded" end + log_location("level2_warren_"..biome_name..flood_name, area:position(vi)) + end + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false, c_gravel) + end + end + end + + ------------------------------------------------------ + -- Warren ceiling + + for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + local ystride = area.ystride + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name ~= "barren" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) + end + + if not flooded_caverns and (biome_name == "barren" or biome_name == "sporetree") and nvals_cracks[index2d] > 0.5 then + for i= 1, 4 do + if math.random() > 0.5 then + local index = vi-i*ystride + if data[index] == c_air then + df_mapitems.place_against_surface_vm(c_pearls, index, area, data, data_param2) + end + end + end + end + else + -- air pockets + local cracks = nvals_cracks[index2d] + if cracks > 0.4 and data[vi-ystride] == c_water then + data[vi-ystride] = c_air + if cracks > 0.6 and data[vi-ystride*2] == c_water then + data[vi-ystride*2] = c_air + end + end + end + + end + + ---------------------------------------------- + -- Column material override for dry biome + + for _, vi in ipairs(node_arrays.column_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local dry = (biome_name == "barren") and (nvals_cave[vi] > 0) + + if dry and data[vi] == c_wet_flowstone then + data[vi] = c_dry_flowstone + end + + if chasms_path then + local pos = area:position(vi) + if chasms.is_in_chasm_without_taper(pos) then + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + if flooded_caverns and pos.y < subsea_level then + data[vi] = c_water + else + data[vi] = c_air + end + end + end + + end + + vm:set_param2_data(data_param2) +end + +subterrane.register_layer({ + name = "cavern layer 2", + y_max = df_caverns.config.level1_min-1, + y_min = df_caverns.config.level2_min, + cave_threshold = df_caverns.config.cavern_threshold, + boundary_blend_range = 64, -- range near ymin and ymax over which caves diminish to nothing + perlin_cave = df_caverns.perlin_cave, + perlin_wave = df_caverns.perlin_wave, + solidify_lava = true, + columns = { + maximum_radius = 15, + minimum_radius = 4, + node = "df_mapitems:wet_flowstone", + weight = 0.25, + maximum_count = 50, + minimum_count = 5, + }, + decorate = decorate_level_2, + warren_region_variability_threshold = 0.33, + double_frequency = true, + is_ground_content = df_caverns.is_ground_content, +}) + diff --git a/mods/dfcaverns/df_caverns/level3.lua b/mods/dfcaverns/df_caverns/level3.lua new file mode 100644 index 0000000..5972c9d --- /dev/null +++ b/mods/dfcaverns/df_caverns/level3.lua @@ -0,0 +1,583 @@ +local c_water = df_caverns.node_id.water +local c_air = df_caverns.node_id.air +local c_desert_sand = df_caverns.node_id.desert_sand +local c_stone_with_coal = df_caverns.node_id.stone_with_coal +local c_silver_sand = df_caverns.node_id.silver_sand +local c_snow = df_caverns.node_id.snow +local c_ice = df_caverns.node_id.ice +local c_hoar_moss = df_caverns.node_id.hoar_moss +local c_gravel = df_caverns.node_id.gravel +local c_oil = df_caverns.node_id.oil +local c_cobble_fungus_fine = df_caverns.node_id.cobble_fungus_fine +local c_cobble_fungus = df_caverns.node_id.cobble_fungus +local c_cobble = df_caverns.node_id.cobble +local c_wet_flowstone = df_caverns.node_id.wet_flowstone +local c_dry_flowstone = df_caverns.node_id.dry_flowstone +local c_glow_ore = df_caverns.node_id.glow_ore +local c_salty_cobble = df_caverns.node_id.salty_cobble +local c_salt_crystal = df_caverns.node_id.salt_crystal +local c_sprite = df_caverns.node_id.sprite +local c_webs_egg = df_caverns.node_id.big_webs_egg + +local chasms_path = minetest.get_modpath("chasms") + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local subsea_level = math.floor(df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33) +local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) + +local ice_thickness = 3 + +local get_biome = function(heat, humidity) + if humidity < 23 then -- about 20% of locations fall below this threshold + return "barren" + elseif heat < 50 then + return "blackcap" + else + return "bloodnether" + end +end + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.level3_min or pos.y >= df_caverns.config.level2_min then + return nil + end + local biome = get_biome(heat, humidity) + if biome == "bloodnether" then + local cavern_value = subterrane.get_cavern_value("cavern layer 3", pos) + if cavern_value == nil then + -- this shouldn't happen, the pos.y check above should prevent it. + return nil + end + if cavern_value < 0 then + return "nethercap" + end + return "bloodthorn" + end + return biome +end) + +local black_cap_shrublist +local nether_cap_shrublist +local blood_thorn_shrublist + +if minetest.get_modpath("df_farming") then + black_cap_shrublist = { + df_farming.spawn_dead_fungus_vm, + } + nether_cap_shrublist = { + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } + blood_thorn_shrublist = { + df_farming.spawn_quarry_bush_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_dead_fungus_vm, + } +end + +local hoar_moss_perlin_params = { + offset = 0, + scale = 1, + spread = {x = 3, y = 30, z = 3}, + seed = 345421, + octaves = 3, + persist = 0.63, + lacunarity = 2.0, + flags = "eased", +} + +local black_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + if math.random() < 0.25 then + data[vi] = c_stone_with_coal + else + data[vi] = c_cobble_fungus + end + + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + elseif abs_cracks < 0.15 and math.random() < 0.3 then + df_trees.spawn_torchspine_vm(vi+area.ystride, area, data, data_param2) + else + if math.random() < 0.05 then + df_caverns.place_shrub(vi+area.ystride, area, data, data_param2, black_cap_shrublist) + elseif math.random() < 0.01 and abs_cracks > 0.25 then + df_trees.spawn_black_cap_vm(vi+area.ystride, area, data) + end + end +end + +local nether_cap_cavern_floor = function(cracks, abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + if vert_rand < 0.004 then + subterrane.big_stalagmite(vi+ystride, area, data, 6, 15, c_ice, c_ice, c_ice) + else + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = abs_cracks * 50 + if vert_rand > 0.5 then + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, math.floor(height), df_mapitems.icicle_ids) + else + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, math.floor(height*0.5), df_mapitems.dry_stalagmite_ids) + end + end + end + + if cracks < -0.3 then + data[vi] = c_silver_sand + if math.random() < 0.025 then + df_trees.spawn_nether_cap_vm(vi+ystride, area, data) + elseif math.random() < 0.05 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, nether_cap_shrublist) + elseif cracks < -0.4 and cracks > -0.6 then + data[vi + ystride] = c_snow + end + elseif cracks > 0.1 then + if math.random() < 0.002 then + df_trees.spawn_nether_cap_vm(vi+ystride, area, data) + else + data[vi] = c_ice + end + if cracks > 0.4 then + data[vi + ystride] = c_ice + if cracks > 0.6 then + data[vi + 2*ystride] = c_ice + end + end + end +end + +local nether_cap_cavern_ceiling = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + if vert_rand < 0.01 then + subterrane.big_stalactite(vi-ystride, area, data, 6, 15, c_ice, c_ice, c_ice) + else + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = abs_cracks * 50 + if vert_rand > 0.5 then + subterrane.stalactite(vi-ystride, area, data, data_param2, param2, math.floor(height), df_mapitems.icicle_ids) + else + subterrane.stalactite(vi-ystride, area, data, data_param2, param2, math.floor(height*0.5), df_mapitems.dry_stalagmite_ids) + end + end + end + if c_sprite and abs_cracks < 0.5 and math.random() < 0.02 then + local sprite_vi = vi-ystride*math.random(1,5) + if data[sprite_vi] == c_air and area:containsi(sprite_vi) then + data[sprite_vi] = c_sprite + minetest.get_node_timer(area:position(sprite_vi)):start(1) + end + end +end + +local blood_thorn_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ai = vi+area.ystride + + if abs_cracks < 0.075 then + if vert_rand < 0.004 then + subterrane.big_stalagmite(ai, area, data, 6, 15, c_dry_flowstone, c_dry_flowstone, c_dry_flowstone) + elseif data[vi] ~= c_air and math.random() < 0.5 then + data[vi] = c_salty_cobble + if data[ai] == c_air and math.random() < 0.25 then + data[ai] = c_salt_crystal + data_param2[ai] = math.random(1,4)-1 + end + else + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = math.floor(abs_cracks * 66) + subterrane.stalagmite(ai, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids) + end + elseif math.random() > abs_cracks + 0.66 then + df_trees.spawn_blood_thorn_vm(ai, area, data, data_param2) + data[vi] = c_desert_sand + else + if math.random() < 0.1 then + df_caverns.place_shrub(ai, area, data, data_param2, blood_thorn_shrublist) + data[vi] = c_desert_sand + elseif math.random() > 0.25 then + data[vi] = c_desert_sand + else + data[vi] = c_cobble + end + end +end + +local hoar_moss_generator + +local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data) + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local heatmap = minetest.get_mapgen_object("heatmap") + local humiditymap = minetest.get_mapgen_object("humiditymap") + local data_param2 = df_caverns.data_param2 + vm:get_param2_data(data_param2) + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + local nvals_cave = node_arrays.nvals_cave + local cave_area = node_arrays.cave_area + local cavern_def = node_arrays.cavern_def + + -- Partly fill flooded caverns and warrens + if minp.y <= subsea_level then + for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do + local cave = nvals_cave[vi] + if y <= subsea_level and cave < -flooding_threshold then + if data[vi] == c_air and y <= subsea_level then + data[vi] = c_water + end + + if (mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp)) then + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + if biome_name == "blackcap" then + -- oil slick + if y == subsea_level and data[vi] == c_water and math.abs(cave) + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then + data[vi] = c_oil + if log_location then log_location("level3_blackcap_oil", vector.new(x,y,z)) end + end + elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then + -- floating ice + data[vi] = c_ice + if log_location then log_location("level3_nethercap_floating_ice", vector.new(x,y,z)) end + end + end + end + end + end + + --------------------------------------------------------- + -- Cavern floors + + for _, vi in ipairs(node_arrays.cavern_floor_nodes) do + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then + -- underwater floor. Not using df_caverns.flooded_cavern_floor to make level 3 water darker + local ystride = area.ystride + if abs_cracks > 0.25 and data[vi-ystride] ~= c_water then + data[vi] = c_gravel + end + -- put in only the large stalagmites that won't get in the way of the water + if abs_cracks < 0.1 then + if vert_rand < 0.004 then + subterrane.big_stalagmite(vi+ystride, area, data, 6, 15, c_wet_flowstone, c_wet_flowstone, c_wet_flowstone) + end + end + if log_location then log_location("level3_flooded_"..biome_name, area:position(vi)) end + elseif biome_name == "barren" then + if flooded_caverns then + -- wet zone floor + df_caverns.dry_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_barren_dry", area:position(vi)) end + else + -- dry zone floor, add crystals + if abs_cracks < 0.075 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + elseif abs_cracks > 0.3 and math.random() < 0.005 then + df_mapitems.place_big_crystal_cluster(area, data, data_param2, vi+area.ystride, math.random(0,2), false) + end + if log_location then log_location("level3_barren_wet", area:position(vi)) end + end + elseif biome_name == "blackcap" then + black_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_blackcap", area:position(vi)) end + elseif biome_name == "bloodnether" then + if flooded_caverns then + nether_cap_cavern_floor(cracks, abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_nethercap", area:position(vi)) end + else + blood_thorn_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_bloodthorn", area:position(vi)) end + end + end + end + + -------------------------------------- + -- Cavern ceilings + + for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local abs_cracks = math.abs(nvals_cracks[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then + -- underwater ceiling, do nothing + + elseif biome_name == "blackcap" then + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end + if math.random() < 0.25 then + data[vi] = c_stone_with_coal + end + + elseif biome_name == "barren" then + if flooded_caverns then + -- wet zone ceiling + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + end + else + -- dry zone ceiling, add crystals + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end + if abs_cracks > 0.3 and math.random() < 0.005 then + df_mapitems.place_big_crystal_cluster(area, data, data_param2, vi, math.random(0,3), true) + end + end + + elseif biome_name == "bloodnether" then + if flooded_caverns then + --Nethercap ceiling + nether_cap_cavern_ceiling(abs_cracks, vert_rand, vi, area, data, data_param2) + else + -- bloodthorn ceiling + if abs_cracks < 0.075 then + if data[vi] ~= c_air and math.random() < 0.5 then + data[vi] = c_salty_cobble + local bi = vi - area.ystride + if data[bi] == c_air and math.random() < 0.25 then + data[bi] = c_salt_crystal + data_param2[bi] = 19 + math.random(1,4) + end + else + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end + elseif abs_cracks > 0.75 and math.random() < 0.05 then + data[vi] = c_glow_ore + df_mapitems.place_big_crystal(data, data_param2, vi-area.ystride, true) + end + end + end + end + + + ---------------------------------------------- + -- Tunnel floors + + for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name == "blackcap" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false, c_gravel) + end + end + end + + ------------------------------------------------------ + -- Tunnel ceiling + + for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local humidity = humiditymap[index2d] + local biome_name = get_biome(heatmap[index2d], humidity) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + local ystride = area.ystride + + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then + if flooded_caverns or biome_name == "blackcap" then + -- we're in flooded areas or are not barren + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) + end + if c_webs_egg and humidity < 40 and nvals_cracks[index2d] > 0.5 and math.random() < 0.1 then + local index = vi-ystride + if data[index] == c_air then + data[index] = c_webs_egg + minetest.get_node_timer(area:position(index)):start(1) + end + end + else + -- air pockets + local cracks = nvals_cracks[index2d] + if cracks > 0.5 and data[vi-ystride] == c_water then + data[vi-ystride] = c_air + if cracks > 0.7 and data[vi-ystride*2] == c_water then + data[vi-ystride*2] = c_air + end + end + end + end + + + ------------------------------------------------------ + -- Warren ceiling + + for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if log_location then + local flood_name = "" + if flooded_caverns then flood_name = "_flooded" end + log_location("level3_warren_"..biome_name..flood_name, area:position(vi)) + end + + if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then + -- underwater ceiling, do nothing + elseif biome_name == "bloodnether" and flooded_caverns then + -- Nethercap warrens + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local ystride = area.ystride + if abs_cracks < 0.15 then + if vert_rand < 0.004 then + subterrane.big_stalactite(vi-ystride, area, data, 6, 15, c_ice, c_ice, c_ice) + else + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = abs_cracks * 50 + if vert_rand > 0.5 then + subterrane.stalactite(vi-ystride, area, data, data_param2, param2, math.floor(height), df_mapitems.icicle_ids) + else + subterrane.stalactite(vi-ystride, area, data, data_param2, param2, math.floor(height*0.5), df_mapitems.dry_stalagmite_ids) + end + end + end + else + if flooded_caverns or biome_name == "blackcap" then + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, false) + end + end + end + + ---------------------------------------------- + -- Warren floors + + for _, vi in ipairs(node_arrays.warren_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + + if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then + -- underwater floor, do nothing + elseif biome_name == "bloodnether" and flooded_caverns then + -- nethercap warren + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local ystride = area.ystride + if abs_cracks < 0.15 then + if vert_rand < 0.004 then + subterrane.big_stalagmite(vi+ystride, area, data, 6, 15, c_ice, c_ice, c_ice) + else + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height =abs_cracks * 50 + if vert_rand > 0.5 then + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, math.floor(height), df_mapitems.icicle_ids) + else + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, math.floor(height*0.5), df_mapitems.dry_stalagmite_ids) + end + end + elseif cracks > 0.4 then + data[vi + ystride] = c_ice + if cracks > 0.6 then + data[vi + 2*ystride] = c_ice + end + end + else + if flooded_caverns or biome_name == "blackcap" then + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, false, c_gravel) + end + end + end + + ---------------------------------------------- + -- Column material override for dry and icy biomes + for _, vi in ipairs(node_arrays.column_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) + local flooded_caverns = nvals_cave[vi] < 0 + + if biome_name == "bloodnether" and data[vi] == c_wet_flowstone then + if not flooded_caverns then + data[vi] = c_dry_flowstone -- bloodthorn + else + if area:get_y(vi) > subsea_level - ice_thickness then + if data[vi + 1] == c_air or data[vi - 1] == c_air or data[vi + area.zstride] == c_air or data[vi - area.zstride] == c_air then + --surface node, potential hoar moss streak + -- This particular Perlin noise is only called in small amounts on rare occasions, so don't bother + -- with the full blown generated array rigamarole. + hoar_moss_generator = hoar_moss_generator or minetest.get_perlin(hoar_moss_perlin_params) + local pos = area:position(vi) + if hoar_moss_generator:get_3d({x=pos.z, y=pos.y, z=pos.x}) > 0.5 then + data[vi] = c_hoar_moss + else + data[vi] = c_ice + end + else + data[vi] = c_ice + end + else + data[vi] = c_water -- ice columns shouldn't extend below the surface of the water. There should probably be a bulge below, though. Not sure best way to implement that. + end + end + elseif biome_name == "barren" and not flooded_caverns and data[vi] == c_wet_flowstone then + data[vi] = c_dry_flowstone + end + + if chasms_path then + local pos = area:position(vi) + if chasms.is_in_chasm_without_taper(pos) then + if flooded_caverns and pos.y < subsea_level then + data[vi] = c_water -- this puts a crack in the ice of icy biomes, but why not? A crack in the ice is interesting. + else + data[vi] = c_air + end + end + end + + + end + + vm:set_param2_data(data_param2) +end + +-- Layer 3 +subterrane.register_layer({ + name = "cavern layer 3", + y_max = df_caverns.config.level2_min-1, + y_min = df_caverns.config.level3_min, + cave_threshold = df_caverns.config.cavern_threshold, + boundary_blend_range = 64, -- range near ymin and ymax over which caves diminish to nothing + perlin_cave = df_caverns.perlin_cave, + perlin_wave = df_caverns.perlin_wave, + solidify_lava = true, + columns = { + maximum_radius = 20, + minimum_radius = 5, + node = "df_mapitems:wet_flowstone", + weight = 0.25, + maximum_count = 50, + minimum_count = 10, + }, + decorate = decorate_level_3, + warren_region_variability_threshold = 0.33, + double_frequency = true, + is_ground_content = df_caverns.is_ground_content, +}) diff --git a/mods/dfcaverns/df_caverns/locale/df_caverns.de.tr b/mods/dfcaverns/df_caverns/locale/df_caverns.de.tr new file mode 100644 index 0000000..98df000 --- /dev/null +++ b/mods/dfcaverns/df_caverns/locale/df_caverns.de.tr @@ -0,0 +1,11 @@ +# textdomain: df_caverns + + +### underworld.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A glowing pit=Eine leuchtende Grube +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ancient ruin=Alte Ruine +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mysterious seal=Geheimnisvolles Siegel diff --git a/mods/dfcaverns/df_caverns/locale/df_caverns.it.tr b/mods/dfcaverns/df_caverns/locale/df_caverns.it.tr new file mode 100644 index 0000000..f71ce26 --- /dev/null +++ b/mods/dfcaverns/df_caverns/locale/df_caverns.it.tr @@ -0,0 +1,11 @@ +# textdomain: df_caverns + + +### underworld.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A glowing pit=Un pozzo luminoso +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ancient ruin=Antica rovina +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mysterious seal=Sigillo misterioso diff --git a/mods/dfcaverns/df_caverns/locale/template.txt b/mods/dfcaverns/df_caverns/locale/template.txt new file mode 100644 index 0000000..2edf2ac --- /dev/null +++ b/mods/dfcaverns/df_caverns/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: df_caverns + + +### underworld.lua ### + +A glowing pit= +Ancient ruin= +Mysterious seal= diff --git a/mods/dfcaverns/df_caverns/mod.conf b/mods/dfcaverns/df_caverns/mod.conf new file mode 100644 index 0000000..e2e9db8 --- /dev/null +++ b/mods/dfcaverns/df_caverns/mod.conf @@ -0,0 +1,4 @@ +name = df_caverns +description = Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. Also adds stalactite/stalagmite decorations in the smaller tunnels. +depends = df_dependencies, subterrane, df_trees, df_mapitems, +optional_depends = df_farming, ice_sprites, oil, df_underworld_items, magma_conduits, bones_loot, named_waypoints, name_generator, fireflies, chasms, big_webs, mcl_flowers, mine_gas \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/node_ids.lua b/mods/dfcaverns/df_caverns/node_ids.lua new file mode 100644 index 0000000..0b003cd --- /dev/null +++ b/mods/dfcaverns/df_caverns/node_ids.lua @@ -0,0 +1,81 @@ +df_caverns.node_id = {} + +minetest.after(0, function() df_caverns.node_id = nil end) -- should only be used during initialization. + +if df_dependencies.node_name_fireflies then + df_caverns.node_id.fireflies = minetest.get_content_id(df_dependencies.node_name_fireflies) +end + +df_caverns.node_id.cobble = minetest.get_content_id(df_dependencies.node_name_cobble) +df_caverns.node_id.desert_sand = minetest.get_content_id(df_dependencies.node_name_desert_sand) +df_caverns.node_id.dirt = minetest.get_content_id(df_dependencies.node_name_dirt) +df_caverns.node_id.gravel = minetest.get_content_id(df_dependencies.node_name_gravel) +df_caverns.node_id.ice = minetest.get_content_id(df_dependencies.node_name_ice) +df_caverns.node_id.lava = minetest.get_content_id(df_dependencies.node_name_lava_source) +df_caverns.node_id.meseore = minetest.get_content_id(df_dependencies.node_name_stone_with_mese) +df_caverns.node_id.mossycobble = minetest.get_content_id(df_dependencies.node_name_mossycobble) +df_caverns.node_id.obsidian = minetest.get_content_id(df_dependencies.node_name_obsidian) +df_caverns.node_id.sand = minetest.get_content_id(df_dependencies.node_name_sand) +df_caverns.node_id.silver_sand = minetest.get_content_id(df_dependencies.node_name_silver_sand) +df_caverns.node_id.snow = minetest.get_content_id(df_dependencies.node_name_snow) +df_caverns.node_id.stone = minetest.get_content_id(df_dependencies.node_name_stone) +df_caverns.node_id.stone_with_coal = minetest.get_content_id(df_dependencies.node_name_stone_with_coal) +df_caverns.node_id.water = minetest.get_content_id(df_dependencies.node_name_water_source) + +if minetest.get_modpath("big_webs") then + df_caverns.node_id.big_webs = minetest.get_content_id("big_webs:webbing") + df_caverns.node_id.big_webs_egg = minetest.get_content_id("big_webs:web_egg") +end + +if minetest.get_modpath("ice_sprites") then + df_caverns.node_id.sprite = minetest.get_content_id("ice_sprites:ice_sprite") +end + +if minetest.get_modpath("df_farming") then + df_caverns.node_id.dead_fungus = minetest.get_content_id("df_farming:dead_fungus") +end + +df_caverns.node_id.air = minetest.get_content_id("air") + +df_caverns.node_id.cobble_fungus = minetest.get_content_id("df_mapitems:cobble_with_floor_fungus") +df_caverns.node_id.cobble_fungus_fine = minetest.get_content_id("df_mapitems:cobble_with_floor_fungus_fine") +df_caverns.node_id.dirt_moss = minetest.get_content_id("df_mapitems:dirt_with_cave_moss") +df_caverns.node_id.dry_flowstone = minetest.get_content_id("df_mapitems:dry_flowstone") +df_caverns.node_id.glow_ore = minetest.get_content_id("df_mapitems:glow_ruby_ore") +df_caverns.node_id.hoar_moss = minetest.get_content_id("df_mapitems:ice_with_hoar_moss") +df_caverns.node_id.mese_crystal = minetest.get_content_id("df_mapitems:mese_crystal") +df_caverns.node_id.mese_crystal_block = minetest.get_content_id("df_mapitems:glow_mese") +df_caverns.node_id.pearls = minetest.get_content_id("df_mapitems:cave_pearls") +df_caverns.node_id.pebble_fungus = minetest.get_content_id("df_mapitems:dirt_with_pebble_fungus") +df_caverns.node_id.rock_rot = minetest.get_content_id("df_mapitems:rock_rot") +df_caverns.node_id.spongestone = minetest.get_content_id("df_mapitems:spongestone") +df_caverns.node_id.salt_crystal = minetest.get_content_id("df_mapitems:salt_crystal") +df_caverns.node_id.salty_cobble = minetest.get_content_id("df_mapitems:salty_cobble") +df_caverns.node_id.sand_scum = minetest.get_content_id("df_mapitems:sand_scum") +df_caverns.node_id.stillworm = minetest.get_content_id("df_mapitems:dirt_with_stillworm") +df_caverns.node_id.veinstone = minetest.get_content_id("df_mapitems:veinstone") +df_caverns.node_id.wet_flowstone = minetest.get_content_id("df_mapitems:wet_flowstone") + +df_caverns.node_id.spindlestem_red = minetest.get_content_id("df_trees:spindlestem_cap_red") +df_caverns.node_id.spindlestem_white = minetest.get_content_id("df_trees:spindlestem_cap_white") + +df_caverns.node_id.amethyst = minetest.get_content_id("df_underworld_items:glow_amethyst") +df_caverns.node_id.glowstone = minetest.get_content_id("df_underworld_items:glowstone") +df_caverns.node_id.pit_plasma = minetest.get_content_id("df_underworld_items:pit_plasma") +df_caverns.node_id.slade = minetest.get_content_id("df_underworld_items:slade") +df_caverns.node_id.slade_block = minetest.get_content_id("df_underworld_items:slade_block") + +df_caverns.node_id.oil = minetest.get_content_id("oil:oil_source") + +df_caverns.node_id.gas = minetest.get_content_id("mine_gas:gas") +df_caverns.node_id.gas_wisp = minetest.get_content_id("mine_gas:gas_wisp") + +df_caverns.node_id.giant_mycelium = minetest.get_content_id("df_primordial_items:giant_hypha_apical_mapgen") +df_caverns.node_id.ivy = minetest.get_content_id("df_primordial_items:jungle_ivy") +df_caverns.node_id.jungle_dirt = minetest.get_content_id("df_primordial_items:dirt_with_jungle_grass") +df_caverns.node_id.mycelial_dirt = minetest.get_content_id("df_primordial_items:dirt_with_mycelium") +df_caverns.node_id.orb = minetest.get_content_id("df_primordial_items:glow_orb_hanging") +df_caverns.node_id.packed_roots = minetest.get_content_id("df_primordial_items:packed_roots") +df_caverns.node_id.plant_matter = minetest.get_content_id("df_primordial_items:plant_matter") +df_caverns.node_id.root_1 = minetest.get_content_id("df_primordial_items:jungle_roots_1") +df_caverns.node_id.root_2 = minetest.get_content_id("df_primordial_items:jungle_roots_2") \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/oil_sea.lua b/mods/dfcaverns/df_caverns/oil_sea.lua new file mode 100644 index 0000000..7123b2d --- /dev/null +++ b/mods/dfcaverns/df_caverns/oil_sea.lua @@ -0,0 +1,131 @@ +if not df_caverns.config.enable_oil_sea then + return +end + +local c_oil = df_caverns.node_id.oil +local c_gas = df_caverns.node_id.gas +local c_gas_wisp = df_caverns.node_id.gas_wisp +local c_lava = df_caverns.node_id.lava +local c_obsidian = df_caverns.node_id.obsidian + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +------------------------------------------------------------------------------------------- + +local perlin_cave = { + offset = 0, + scale = 1, + spread = {x=300, y=300, z=300}, + seed = 6000089, + octaves = 3, + persist = 0.67 +} + +-- large-scale rise and fall +local perlin_wave = { + offset = 0, + scale = 1, + spread = {x=1000, y=1000, z=1000}, + seed = 10089, + octaves = 3, + persist = 0.67 +} + +local median = df_caverns.config.oil_sea_level +local floor_mult = -80 +local floor_displace = 60 +local ceiling_mult = 40 +local ceiling_displace = -30 +local wave_mult = 10 + +local c_lava_set + +local y_max = median + 2*wave_mult + 2*ceiling_mult + ceiling_displace +local y_min = median - 2*wave_mult + 2*floor_mult + floor_displace + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y > y_max or pos.y < y_min then + return + end + return "oil_sea" +end) + +minetest.register_on_generated(function(minp, maxp, seed) + --if out of range of cave definition limits, abort + if minp.y > y_max or maxp.y < y_min then + return + end + + local t_start = os.clock() + + local vm, data, area = mapgen_helper.mapgen_vm_data() + + local nvals_cave = mapgen_helper.perlin2d("df_caverns:oil_cave", minp, maxp, perlin_cave) + local nvals_wave = mapgen_helper.perlin2d("df_caverns:oil_wave", minp, maxp, perlin_wave) + + if c_lava_set == nil then + c_lava_set = {} + for name, def in pairs(minetest.registered_nodes) do + if def.groups ~= nil and def.groups.lava ~= nil then + c_lava_set[minetest.get_content_id(name)] = true + end + end + end + + for vi, x, y, z in area:iterp_yxz(minp, maxp) do + local index2d = mapgen_helper.index2d(minp, maxp, x, z) + + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + + local floor_height = math.floor(abs_cave * floor_mult + floor_displace + median + wave) + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + + if y > floor_height - 5 and y < ceiling_height + 5 then + if c_lava_set[data[vi]] then + data[vi] = c_obsidian + end + end + if y > floor_height and y < ceiling_height then + if y > median then + if math.random() < 0.00025 and ((y < median + 3) or (y > ceiling_height - 3)) then + data[vi] = c_gas_wisp + else + data[vi] = c_gas + end + else + data[vi] = c_oil + if log_location then log_location("oil_sea", area:position(vi)) end + end + end + + end + + + --send data back to voxelmanip + vm:set_data(data) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + + vm:update_liquids() + --write it to world + vm:write_to_map() + + local time_taken = os.clock() - t_start -- how long this chunk took, in seconds + mapgen_helper.record_time("df_caverns oil sea", time_taken) +end) + +minetest.register_ore({ + ore_type = "scatter", + ore = "mine_gas:gas_seep", + wherein = df_dependencies.node_name_stone, + clust_scarcity = 32 * 32 * 32, + clust_num_ores = 27, + clust_size = 6, + y_max = df_caverns.config.sunless_sea_min, + y_min = y_min, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/primordial.lua b/mods/dfcaverns/df_caverns/primordial.lua new file mode 100644 index 0000000..d72f708 --- /dev/null +++ b/mods/dfcaverns/df_caverns/primordial.lua @@ -0,0 +1,508 @@ +if not df_caverns.config.enable_primordial or not minetest.get_modpath("df_primordial_items") then + return +end + +local c_air = df_caverns.node_id.air + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local perlin_cave_primordial = { + offset = 0, + scale = 1, + spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale*0.5, z=df_caverns.config.horizontal_cavern_scale}, + seed = 14055553, + octaves = 3, + persist = 0.67 +} + +local perlin_wave_primordial = { + offset = 0, + scale = 1, + spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale*0.5, z=df_caverns.config.horizontal_cavern_scale}, + seed = 923444, + octaves = 6, + persist = 0.63 +} + +local giant_mycelium_timer_spread = tonumber(minetest.settings:get("dcaverns_giant_mycelium_timer_spread")) or 10 + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.primordial_min or pos.y > df_caverns.config.primordial_max then + return nil + end + if subterrane.get_cavern_value("primordial", pos) < 0 then + return "primordial jungle" + end + return "primordial fungus" +end) + +----------------------------------------------------------------------------------------- +-- Fungal biome + +local c_orb = df_caverns.node_id.orb +local c_mycelial_dirt = df_caverns.node_id.mycelial_dirt +local c_dirt = df_caverns.node_id.dirt +local c_giant_mycelium = df_caverns.node_id.giant_mycelium + +local fungal_plant_names = {} +local fungal_plants = {} +for node_name, node_def in pairs(minetest.registered_nodes) do + if minetest.get_item_group(node_name, "primordial_fungal_plant") > 0 then + table.insert(fungal_plant_names, node_name) + table.insert(fungal_plants, minetest.get_content_id(node_name)) + end +end + +local mushroom_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2) + local ystride = area.ystride + local humidityfactor = humidity/200 + 0.5 + abs_cracks = abs_cracks * humidityfactor + + if abs_cracks < 0.7 then + data[vi] = c_mycelial_dirt + elseif abs_cracks < 1 then + data[vi] = c_dirt + end + + local rand = math.random() * math.min(abs_cracks, 1) * humidityfactor + if rand < 0.0005 then + local mycelium_index = vi+ystride + data[mycelium_index] = c_giant_mycelium + minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread)) + elseif rand < 0.003 then + local schematic = df_primordial_items.get_primordial_mushroom() + local rotation = (math.random(1,4)-1)*90 + mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), schematic, rotation) + elseif rand < 0.05 then + data[vi+ystride] = fungal_plants[math.random(1,5)] + end +end + +local mushroom_cavern_ceiling = function(abs_cracks, humidity, vi, area, data, data_param2) + local ystride = area.ystride + local humidityfactor = humidity/200 + 0.5 + abs_cracks = abs_cracks * humidityfactor + + if abs_cracks < 0.5 then + data[vi] = c_mycelial_dirt + if abs_cracks < 0.3 then + local rand = math.random() * humidityfactor + if rand < 0.002 then + local mycelium_index = vi-ystride + data[mycelium_index] = c_giant_mycelium + minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread)) + elseif rand < 0.03 then + df_primordial_items.spawn_ceiling_spire_vm(vi, area, data) + elseif rand < 0.2 then + data[vi-ystride] = c_orb + data_param2[vi-ystride] = math.random(0,179) + end + end + end +end + +local mushroom_warren_ceiling = function(abs_cracks, vi, area, data, data_param2) + local ystride = area.ystride + + if abs_cracks < 0.3 then + data[vi] = c_mycelial_dirt + if abs_cracks < 0.2 then + local rand = math.random() + if rand < 0.001 then + local mycelium_index = vi-ystride + data[mycelium_index] = c_giant_mycelium + minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread)) + elseif rand < 0.2 then + data[vi-ystride] = c_orb + data_param2[vi-ystride] = math.random(0,179) + end + end + end +end + +local mushroom_warren_floor = function(abs_cracks, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.7 then + data[vi] = c_mycelial_dirt + elseif abs_cracks < 1 then + data[vi] = c_dirt + end + local rand = math.random() * math.min(abs_cracks, 1) + if rand < 0.001 then + local mycelium_index = vi+ystride + data[mycelium_index] = c_giant_mycelium + minetest.get_node_timer(area:position(mycelium_index)):start(math.random(1,giant_mycelium_timer_spread)) + elseif rand < 0.03 then + data[vi+ystride] = fungal_plants[math.random(1,5)] + end +end + +-------------------------------------------------------------------------------------------------- +-- Jungle biome + +local jungle_plant_names = {} +local jungle_plants = {} +for node_name, node_def in pairs(minetest.registered_nodes) do + if minetest.get_item_group(node_name, "primordial_jungle_plant") > 0 then + table.insert(jungle_plant_names, node_name) + table.insert(jungle_plants, minetest.get_content_id(node_name)) + end +end + +local c_jungle_dirt = df_caverns.node_id.jungle_dirt +local c_plant_matter = df_caverns.node_id.plant_matter +local c_packed_roots = df_caverns.node_id.packed_roots +local c_glowstone = df_caverns.node_id.glowstone +local c_ivy = df_caverns.node_id.ivy +local c_root_2 = df_caverns.node_id.root_2 +local c_root_1 = df_caverns.node_id.root_1 +local c_fireflies = df_caverns.node_id.fireflies + +local jungle_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_param2) + local ystride = area.ystride + local humidityfactor = humidity/100 + + if log_location then + local pos = area:position(vi) + log_location("primordial_jungle", pos) + if humidityfactor < 0.25 then + log_location("primordial_jungle_low_humidity", pos) + elseif humidityfactor > 0.75 then + log_location("primordial_jungle_high_humidity", pos) + end + end + + data[vi] = c_jungle_dirt + + local rand = math.random() + if rand < 0.025 * humidityfactor then + local fern_schematic = df_primordial_items.get_fern_schematic() + local rotation = (math.random(1,4)-1)*90 + mapgen_helper.place_schematic_on_data_if_it_fits(data, data_param2, area, area:position(vi+ystride), fern_schematic, rotation) + elseif rand < 0.025 * (1-humidityfactor) then + df_primordial_items.spawn_jungle_mushroom_vm(vi+ystride, area, data) + elseif rand < 0.05 * (1-humidityfactor) then + df_primordial_items.spawn_jungle_tree_vm(math.random(8,14), vi+ystride, area, data) + elseif rand < 0.3 then + data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)] + end + + if c_fireflies and math.random() < 0.01 then + local firefly_vi = vi + ystride * math.random(1, 5) + if data[firefly_vi] == c_air then + data[firefly_vi] = c_fireflies + minetest.get_node_timer(area:position(firefly_vi)):start(1) + end + end +end + +local jungle_cavern_ceiling = function(abs_cracks, vi, area, data, data_param2) + if abs_cracks < 0.25 then + data[vi] = c_glowstone + elseif abs_cracks > 0.75 and math.random() < 0.1 then + local ystride = area.ystride + data[vi] = c_dirt + local index = vi - ystride + local hanging_node + if math.random() < 0.5 then + hanging_node = c_ivy + else + hanging_node = c_root_2 + end + for i = 1, math.random(16) do + if data[index] == c_air then + data[index] = hanging_node + index = index - ystride + else + break + end + end + end +end + +local jungle_warren_ceiling = function(abs_cracks, vi, area, data, data_param2) + if abs_cracks < 0.1 then + data[vi] = c_glowstone + elseif abs_cracks > 0.75 and math.random() < 0.1 then + local ystride = area.ystride + data[vi] = c_dirt + local index = vi - ystride + local hanging_node + if math.random() < 0.5 then + hanging_node = c_root_1 + else + hanging_node = c_root_2 + end + for i = 1, math.random(8) do + if data[index] == c_air then + data[index] = hanging_node + index = index - ystride + else + break + end + end + end +end + +local jungle_warren_floor = function(abs_cracks, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.7 then + data[vi] = c_jungle_dirt + local rand = math.random() * abs_cracks + if rand < 0.1 then + data[vi+ystride] = jungle_plants[math.random(1,#jungle_plants)] + end + elseif abs_cracks < 1 then + data[vi] = c_dirt + end + + if c_fireflies and math.random() < 0.005 then + local firefly_vi = vi + ystride * math.random(1, 5) + if data[firefly_vi] == c_air then + data[firefly_vi] = c_fireflies + minetest.get_node_timer(area:position(firefly_vi)):start(1) + end + end +end +--------------------------------------------------------------------------------------------------------- + +local decorate_primordial = function(minp, maxp, seed, vm, node_arrays, area, data) + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local data_param2 = df_caverns.data_param2 + vm:get_param2_data(data_param2) + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + local cave_area = node_arrays.cave_area + local nvals_cave = node_arrays.nvals_cave + + local humiditymap = minetest.get_mapgen_object("humiditymap") + + + --------------------------------------------------------- + -- Cavern floors + + for _, vi in ipairs(node_arrays.cavern_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local humidity = humiditymap[index2d] + local jungle = nvals_cave[vi] < 0 + + if jungle then + jungle_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2) + else + mushroom_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2) + if log_location then log_location("primordial_mushrooms", area:position(vi)) end + end + end + + -------------------------------------- + -- Cavern ceilings + + for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local jungle = nvals_cave[vi] < 0 + local humidity = humiditymap[index2d] + if jungle then + jungle_cavern_ceiling(abs_cracks, vi, area, data, data_param2) + else + mushroom_cavern_ceiling(abs_cracks, humidity, vi, area, data, data_param2) + end + end + + ---------------------------------------------- + -- Tunnel floors + +-- for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do +-- end + + ------------------------------------------------------ + -- Tunnel ceiling + +-- for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do +-- end + + ------------------------------------------------------ + -- Warren ceiling + + for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local jungle = nvals_cave[vi] < 0 + + if jungle then + jungle_warren_ceiling(abs_cracks, vi, area, data, data_param2) + else + mushroom_warren_ceiling(abs_cracks, vi, area, data, data_param2) + end + + end + + ---------------------------------------------- + -- Warren floors + + for _, vi in ipairs(node_arrays.warren_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local jungle = nvals_cave[vi] < 0 + + if jungle then + jungle_warren_floor(abs_cracks, vi, area, data, data_param2) + if log_location then log_location("primordial_jungle_warren", area:position(vi)) end + else + mushroom_warren_floor(abs_cracks, vi, area, data, data_param2) + if log_location then log_location("primordial_mushroom_warren", area:position(vi)) end + end + end + + -- columns + -- no flowstone below the Sunless Sea, replace with something else + local random_dir = {1, -1, area.zstride, -area.zstride} + for _, vi in ipairs(node_arrays.column_nodes) do + local jungle = nvals_cave[vi] < 0 + if jungle then + data[vi] = c_plant_matter + minetest.get_node_timer(area:position(vi)):start(math.random(30, 120)) + else + data[vi] = c_mycelial_dirt + if math.random() < 0.05 then + local rand_vi = vi + random_dir[math.random(1,4)] + if data[rand_vi] == c_air then + data[rand_vi] = c_giant_mycelium + minetest.get_node_timer(area:position(rand_vi)):start(math.random(1,giant_mycelium_timer_spread)) + end + end + end + end + + vm:set_param2_data(data_param2) +end + +--Primordial Caverns +subterrane.register_layer({ + name = "primordial", + y_max = df_caverns.config.primordial_max, + y_min = df_caverns.config.primordial_min, + cave_threshold = df_caverns.config.sunless_sea_threshold, -- Make the caves a bit bigger than above + perlin_cave = perlin_cave_primordial, + perlin_wave = perlin_wave_primordial, + solidify_lava = true, + columns = { + maximum_radius = 20, + minimum_radius = 5, + node = df_dependencies.node_name_stone, -- no flowstone below the Sunless Sea, replace with something else + weight = 0.5, + maximum_count = 60, + minimum_count = 10, + }, + decorate = decorate_primordial, + double_frequency = true, + is_ground_content = df_caverns.is_ground_content, +}) + +minetest.register_ore({ + ore_type = "vein", + ore = "df_underworld_items:glowstone", + wherein = { + "default:stone", + "default:stone_with_coal", + "default:stone_with_iron", + "default:stone_with_copper", + "default:stone_with_tin", + "default:stone_with_gold", + "default:stone_with_diamond", + "default:dirt", + "default:sand", + "default:desert_sand", + "default:silver_sand", + "default:gravel", + }, + column_height_min = 2, + column_height_max = 6, + y_min = df_caverns.config.primordial_min, + y_max = df_caverns.config.primordial_max, + noise_threshold = 0.9, + noise_params = { + offset = 0, + scale = 3, + spread = {x=400, y=400, z=400}, + seed = 25111, + octaves = 4, + persist = 0.5, + flags = "eased", + }, + random_factor = 0, +}) + +-- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there by foraging, not farming. +minetest.register_abm({ + label = "Primordial plant growth", + nodenames = {"df_primordial_items:dirt_with_jungle_grass"}, + neighbors = {"air"}, + interval = 60.0, + chance = 50, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, 2, {"group:primordial_jungle_plant"}) == nil then + local pos_above = {x=pos.x, y=pos.y+1, z=pos.z} + local node_above = minetest.get_node(pos_above) + if node_above.name == "air" then + minetest.set_node(pos_above, {name = jungle_plant_names[math.random(1,#jungle_plant_names)]}) + end + end + end, +}) + +minetest.register_abm({ + label = "Primordial fungus growth", + nodenames = {"df_primordial_items:dirt_with_mycelium"}, + neighbors = {"air"}, + interval = 60.0, + chance = 50, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, 3, {"group:primordial_fungal_plant"}) == nil then + local pos_above = {x=pos.x, y=pos.y+1, z=pos.z} + local node_above = minetest.get_node(pos_above) + if node_above.name == "air" then + minetest.set_node(pos_above, {name = fungal_plant_names[math.random(1,#fungal_plant_names)]}) + end + end + end, +}) + +-- an ABM to extinguish fires on the primordial layer. Glowstone next to plant life equals too much fire. +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.settings:get_bool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end +end +if fire_enabled and minetest.get_modpath("fire") then + local primordial_min = df_caverns.config.primordial_min + local primordial_max = df_caverns.config.primordial_max + minetest.register_abm({ + label = "Remove fire in the primordial layer", + nodenames = {"fire:basic_flame"}, + --neighbors = {"fire:basic_flame"}, + interval = 3, + chance = 3, + catch_up = false, + action = function(pos) + local pos_y = pos.y + if pos_y > primordial_min and pos_y < primordial_max then + minetest.remove_node(pos) + end + end + }) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/schematics/lamppost.lua b/mods/dfcaverns/df_caverns/schematics/lamppost.lua new file mode 100644 index 0000000..5565469 --- /dev/null +++ b/mods/dfcaverns/df_caverns/schematics/lamppost.lua @@ -0,0 +1,49 @@ +local n1 = { name = "df_underworld_items:slade_block", force_place=true } +local n2 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n3 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n4 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } +local n5 = { name = "air", force_place=true } +local n6 = { name = "df_underworld_items:slade_seal", force_place=true } +local n7 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n8 = { name = "df_underworld_items:slade_brick", force_place=true } +local n9 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n10 = { name = "df_underworld_items:slade_wall", force_place=true } +local n11 = { name = "df_underworld_items:ancient_lantern_slade_worn", prob=192 } -- 50% chance of being force-placed +local n12 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n13 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n14 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } + +return { + name = "df_caverns:lamppost", + size = {x = 3, y = 15, z = 3}, + center_pos = {x = 1, y = 7, z = 1}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n2, n3, n4, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n11, n5, + n5, n5, n5, + n1, n1, n1, n1, n5, n1, n1, n5, n1, + n1, n5, n1, n1, n5, n1, n1, n5, n1, + n1, n5, n1, n1, n6, n1, n7, n8, n9, + n5, n8, n5, + n5, n8, n5, + n5, n10, n5, + n5, n10, n5, + n11, n10, n11, + n5, n5, n5, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n12, n13, n14, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n11, n5, + n5, n5, n5, + } +} diff --git a/mods/dfcaverns/df_caverns/schematics/medium_building.lua b/mods/dfcaverns/df_caverns/schematics/medium_building.lua new file mode 100644 index 0000000..1385364 --- /dev/null +++ b/mods/dfcaverns/df_caverns/schematics/medium_building.lua @@ -0,0 +1,115 @@ +local n1 = { name = "ignore"} +local n8 = { name = "air", force_place=true } + +local n3 = { name = "df_underworld_items:slade_brick", force_place=true } +local n4 = { name = "df_underworld_items:slade_wall", force_place=true } +local n5 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n6 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n7 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } +local n9 = { name = df_dependencies.node_name_slab_slade_brick, param2 = 23, force_place=true } +local n10 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n11 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n14 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 23, force_place=true } +local n15 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n16 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n17 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } + +-- foundation nodes +local n2 = { name = "df_underworld_items:slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n12 = { name = "df_underworld_items:slade_wall", force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n13 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=false, place_on_condition=mapgen_helper.buildable_to } + + +return { + name = "df_caverns:medium_building", + size = {x = 15, y = 12, z = 8}, + center_pos = {x = 10, y = 6, z = 3}, + data = { + n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, + n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, + n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, + n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, + n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n3, n4, n4, n4, n4, + n4, n4, n3, n1, n1, n1, n1, n1, n1, n1, n3, n4, n4, n4, n4, n4, n4, + n3, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n1, + n1, n1, n1, n1, n1, n1, n3, n4, n4, n4, n4, n4, n4, n3, n1, n1, n1, + n1, n1, n1, n1, n3, n4, n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, n1, + n1, n1, n5, n6, n6, n6, n6, n6, n6, n7, n1, n1, n1, n1, n1, n1, n1, + n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, + n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, + n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, + n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, + n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n8, n4, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, + n1, n1, n8, n4, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, + n1, n3, n9, n9, n9, n9, n9, n9, n3, n1, n1, n1, n1, n1, n1, n1, n4, + n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n4, n8, n8, + n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n10, n9, n9, n9, n9, + n9, n9, n11, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, + n2, n2, n1, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, + n1, n1, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, + n1, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, + n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, + n12, n12, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, + n12, n3, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n8, n3, + n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n3, n9, n9, + n9, n9, n9, n9, n3, n1, n1, n1, n1, n1, n1, n1, n4, n8, n8, n8, n8, + n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n4, n8, n8, n8, n8, n8, n8, + n4, n1, n1, n1, n1, n1, n1, n1, n10, n9, n9, n9, n9, n9, n9, n11, n1, + n13, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n13, + n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n13, n2, + n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n13, n2, n2, + n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n13, n2, n2, n2, + n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n13, n3, n3, n3, n3, + n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n8, n8, n8, n8, n8, n8, n8, + n8, n4, n1, n1, n1, n1, n1, n1, n8, n8, n8, n8, n8, n8, n8, n8, n4, + n1, n1, n1, n1, n1, n1, n1, n3, n9, n9, n9, n9, n9, n9, n3, n1, n1, + n1, n1, n1, n1, n1, n4, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, + n1, n1, n1, n4, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, + n1, n10, n9, n9, n9, n9, n9, n9, n11, n1, n13, n2, n2, n2, n2, n2, + n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n13, n2, n2, n2, n2, n2, n2, + n2, n2, n2, n2, n2, n2, n1, n1, n1, n13, n2, n2, n2, n2, n2, n2, n2, + n2, n2, n2, n2, n1, n1, n1, n1, n13, n2, n2, n2, n2, n2, n2, n2, n2, + n2, n2, n1, n1, n1, n1, n1, n13, n2, n2, n2, n2, n2, n2, n2, n2, n2, + n1, n1, n1, n1, n1, n1, n13, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n8, n8, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, + n1, n1, n8, n8, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, + n1, n3, n9, n9, n9, n9, n9, n9, n3, n1, n1, n1, n1, n1, n1, n1, n4, + n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n4, n8, n8, + n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n10, n9, n9, n9, n9, + n9, n9, n11, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, + n2, n2, n1, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, + n1, n1, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, + n1, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, + n12, n12, n12, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, + n12, n12, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, + n12, n3, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n8, n3, + n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n3, n9, n9, + n9, n9, n9, n9, n3, n1, n1, n1, n1, n1, n1, n1, n4, n8, n8, n8, n8, + n8, n8, n4, n1, n1, n1, n1, n1, n1, n1, n4, n8, n8, n8, n8, n8, n8, + n4, n1, n1, n1, n1, n1, n1, n1, n10, n9, n9, n9, n9, n9, n9, n11, n1, + n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, + n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, + n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, + n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, + n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n8, n4, n8, n8, n14, n11, n8, + n8, n4, n1, n1, n1, n1, n1, n1, n8, n4, n8, n14, n11, n8, n8, n8, n4, + n1, n1, n1, n1, n1, n1, n1, n3, n14, n11, n8, n8, n8, n9, n3, n1, n1, + n1, n1, n1, n1, n1, n4, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, + n1, n1, n1, n4, n8, n8, n8, n8, n8, n8, n4, n1, n1, n1, n1, n1, n1, + n1, n10, n9, n9, n9, n9, n9, n9, n11, n1, n1, n1, n1, n1, n1, n1, n2, + n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, + n2, n2, n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, + n2, n2, n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, + n2, n1, n1, n1, n1, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, + n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n3, n4, n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, n1, + n1, n1, n3, n4, n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, n1, n1, n1, + n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n3, n4, + n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, n1, n1, n1, n3, n4, n4, n4, + n4, n4, n4, n3, n1, n1, n1, n1, n1, n1, n1, n15, n16, n16, n16, n16, + n16, n16, n17, + } +} diff --git a/mods/dfcaverns/df_caverns/schematics/oubliette.lua b/mods/dfcaverns/df_caverns/schematics/oubliette.lua new file mode 100644 index 0000000..99c7d51 --- /dev/null +++ b/mods/dfcaverns/df_caverns/schematics/oubliette.lua @@ -0,0 +1,24 @@ +local n1 = { name = "df_underworld_items:slade_block", force_place=true } +local n2 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n3 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n4 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } +local n5 = { name = "air", force_place=true } +local n6 = { name = "df_underworld_items:slade_seal", force_place=true } +local n7 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n8 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n9 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n10 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n11 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } + +return { + name="df_caverns:oubliette", + size = {x = 3, y = 9, z = 3}, + center_pos = {x = 1, y = 7, z = 1}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n3, n4, n1, n1, n1, n1, n5, n1, n1, + n5, n1, n1, n5, n1, n1, n5, n1, n1, n5, n1, n1, n5, n1, n1, n6, n1, + n7, n5, n8, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n9, n10, n11, + }, +} diff --git a/mods/dfcaverns/df_caverns/schematics/small_building.lua b/mods/dfcaverns/df_caverns/schematics/small_building.lua new file mode 100644 index 0000000..a819b48 --- /dev/null +++ b/mods/dfcaverns/df_caverns/schematics/small_building.lua @@ -0,0 +1,74 @@ +local n1 = { name = "ignore" } +local n10 = { name = "air", force_place=true } + +local n3 = { name = "df_underworld_items:slade_brick", force_place=true } +local n4 = { name = "df_underworld_items:slade_wall", force_place=true } +local n5 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n6 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n7 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } +local n11 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n12 = { name = df_dependencies.node_name_slab_slade_brick, param2 = 22, force_place=true} +local n13 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n15 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n16 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n17 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } + +-- foundation nodes +local n2 = { name = "df_underworld_items:slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n8 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n9 = { name = df_dependencies.node_name_stair_slade_brick, force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n14 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=false, place_on_condition=mapgen_helper.buildable_to } + + +local n18 = { name = "df_underworld_items:puzzle_chest_closed", param2 = 1, prob=192 } -- 50% chance of being force-placed. + +return { + name = "df_caverns:small_building", + size = {x = 11, y = 9, z = 7}, + center_pos = {x = 7, y = 5, z = 3}, + data = { + n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, + n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, + n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n2, n2, n2, + n2, n2, n2, n2, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n3, n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, n3, n4, n4, n4, + n4, n4, n3, n1, n1, n1, n1, n5, n6, n6, n6, n6, n6, n7, n1, n1, n2, + n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, n2, + n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n8, n2, + n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n9, n2, n2, n2, n2, n2, n2, + n2, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n10, n4, + n10, n10, n10, n10, n10, n4, n1, n1, n1, n10, n4, n10, n10, n10, n10, + n10, n4, n1, n1, n1, n1, n11, n12, n12, n12, n12, n12, n13, n1, n1, + n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, + n2, n2, n2, n1, n1, n8, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, n2, n2, n2, + n2, n2, n1, n1, n1, n9, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n10, + n3, n10, n10, n10, n10, n10, n4, n1, n1, n1, n10, n3, n10, n10, n10, + n10, n10, n4, n1, n1, n1, n1, n11, n12, n12, n12, n12, n12, n13, n14, + n2, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n14, n2, n2, n2, n2, n2, + n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, + n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, n2, n2, + n2, n2, n2, n1, n1, n1, n2, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + n10, n10, n10, n10, n10, n10, n18, n4, n1, n1, n1, n10, n10, n10, + n10, n10, n10, n10, n4, n1, n1, n1, n1, n11, n12, n12, n12, n12, n12, + n13, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, + n2, n2, n2, n2, n2, n2, n1, n1, n9, n2, n2, n2, n2, n2, n2, n2, n2, + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, + n2, n2, n2, n2, n2, n1, n1, n1, n8, n3, n3, n3, n3, n3, n3, n3, n1, + n1, n1, n10, n3, n10, n10, n10, n10, n10, n4, n1, n1, n1, n10, n3, + n10, n10, n10, n10, n10, n4, n1, n1, n1, n1, n11, n12, n12, n12, n12, + n12, n13, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, + n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, + n2, n1, n1, n9, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n8, n2, + n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, + n1, n1, n1, n10, n4, n10, n10, n10, n10, n10, n4, n1, n1, n1, n10, + n4, n10, n10, n10, n10, n10, n4, n1, n1, n1, n1, n11, n12, n12, n12, + n12, n12, n13, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, + n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, + n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n1, n3, n3, n3, n3, n3, + n3, n3, n1, n1, n1, n1, n3, n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, + n3, n4, n4, n4, n4, n4, n3, n1, n1, n1, n1, n15, n16, n16, n16, n16, + n16, n17, + } +} diff --git a/mods/dfcaverns/df_caverns/schematics/small_slab.lua b/mods/dfcaverns/df_caverns/schematics/small_slab.lua new file mode 100644 index 0000000..91c46c4 --- /dev/null +++ b/mods/dfcaverns/df_caverns/schematics/small_slab.lua @@ -0,0 +1,16 @@ + +local n1 = { name = "df_underworld_items:slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n2 = { name = df_dependencies.node_name_stair_inner_slade_brick, param2 = 1, force_place=true } +local n3 = { name = df_dependencies.node_name_stair_inner_slade_brick, force_place=true } +local n4 = { name = "df_underworld_items:slade_brick", force_place=true } +local n5 = { name = df_dependencies.node_name_stair_inner_slade_brick, param2 = 2, force_place=true } +local n6 = { name = df_dependencies.node_name_stair_inner_slade_brick, param2 = 3, force_place=true } + +return { + name = "df_caverns:small_slab", + size = {y = 2, x = 2, z = 3}, + center_pos = {x = 1, y = 1, z = 1}, + data = { + n1, n1, n2, n3, n1, n1, n4, n4, n1, n1, n5, n6, + } +} \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/screenshots/black_cap.jpg b/mods/dfcaverns/df_caverns/screenshots/black_cap.jpg new file mode 100644 index 0000000..894ea46 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/black_cap.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/bloodthorn.jpg b/mods/dfcaverns/df_caverns/screenshots/bloodthorn.jpg new file mode 100644 index 0000000..652b0a7 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/bloodthorn.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/cave_coral_snareweed.jpg b/mods/dfcaverns/df_caverns/screenshots/cave_coral_snareweed.jpg new file mode 100644 index 0000000..27ea1a7 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/cave_coral_snareweed.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/cave_pearls.jpg b/mods/dfcaverns/df_caverns/screenshots/cave_pearls.jpg new file mode 100644 index 0000000..8b7eedd Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/cave_pearls.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/chasm.jpg b/mods/dfcaverns/df_caverns/screenshots/chasm.jpg new file mode 100644 index 0000000..c349f93 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/chasm.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/crystals.jpg b/mods/dfcaverns/df_caverns/screenshots/crystals.jpg new file mode 100644 index 0000000..1138879 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/crystals.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/farmable_plants.jpg b/mods/dfcaverns/df_caverns/screenshots/farmable_plants.jpg new file mode 100644 index 0000000..8847205 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/farmable_plants.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/fungiwood.jpg b/mods/dfcaverns/df_caverns/screenshots/fungiwood.jpg new file mode 100644 index 0000000..4f521d4 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/fungiwood.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/glowing_pit.jpg b/mods/dfcaverns/df_caverns/screenshots/glowing_pit.jpg new file mode 100644 index 0000000..98e973a Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/glowing_pit.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/goblin_cap.jpg b/mods/dfcaverns/df_caverns/screenshots/goblin_cap.jpg new file mode 100644 index 0000000..6ccdae4 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/goblin_cap.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/magma_sea_mese.jpg b/mods/dfcaverns/df_caverns/screenshots/magma_sea_mese.jpg new file mode 100644 index 0000000..be1a729 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/magma_sea_mese.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/mine_gas.jpg b/mods/dfcaverns/df_caverns/screenshots/mine_gas.jpg new file mode 100644 index 0000000..6c59d42 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/mine_gas.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/mysterious_seal.jpg b/mods/dfcaverns/df_caverns/screenshots/mysterious_seal.jpg new file mode 100644 index 0000000..68bfd1d Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/mysterious_seal.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/nethercap.jpg b/mods/dfcaverns/df_caverns/screenshots/nethercap.jpg new file mode 100644 index 0000000..2f85edf Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/nethercap.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/pit_cave.jpg b/mods/dfcaverns/df_caverns/screenshots/pit_cave.jpg new file mode 100644 index 0000000..428f6f7 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/pit_cave.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/primordial_fungal.jpg b/mods/dfcaverns/df_caverns/screenshots/primordial_fungal.jpg new file mode 100644 index 0000000..6f3056f Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/primordial_fungal.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/primordial_jungle.jpg b/mods/dfcaverns/df_caverns/screenshots/primordial_jungle.jpg new file mode 100644 index 0000000..2fb2146 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/primordial_jungle.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/spindlestems.jpg b/mods/dfcaverns/df_caverns/screenshots/spindlestems.jpg new file mode 100644 index 0000000..691d21d Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/spindlestems.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/spore_tree.jpg b/mods/dfcaverns/df_caverns/screenshots/spore_tree.jpg new file mode 100644 index 0000000..c98c326 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/spore_tree.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/sunless_river.jpg b/mods/dfcaverns/df_caverns/screenshots/sunless_river.jpg new file mode 100644 index 0000000..6a36cb2 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/sunless_river.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/tower_cap.jpg b/mods/dfcaverns/df_caverns/screenshots/tower_cap.jpg new file mode 100644 index 0000000..6e61668 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/tower_cap.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/tunnel_tube.jpg b/mods/dfcaverns/df_caverns/screenshots/tunnel_tube.jpg new file mode 100644 index 0000000..66cd3b9 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/tunnel_tube.jpg differ diff --git a/mods/dfcaverns/df_caverns/screenshots/underworld.jpg b/mods/dfcaverns/df_caverns/screenshots/underworld.jpg new file mode 100644 index 0000000..0b42fa2 Binary files /dev/null and b/mods/dfcaverns/df_caverns/screenshots/underworld.jpg differ diff --git a/mods/dfcaverns/df_caverns/shared.lua b/mods/dfcaverns/df_caverns/shared.lua new file mode 100644 index 0000000..ffdf1e1 --- /dev/null +++ b/mods/dfcaverns/df_caverns/shared.lua @@ -0,0 +1,296 @@ +-- This file contains code that is used by multiple different cavern layers. + +local c_air = df_caverns.node_id.air +local c_cobble = df_caverns.node_id.cobble +local c_cobble_fungus = df_caverns.node_id.cobble_fungus +local c_cobble_fungus_fine = df_caverns.node_id.cobble_fungus_fine +local c_dead_fungus = df_caverns.node_id.dead_fungus +local c_dirt = df_caverns.node_id.dirt +local c_dirt_moss = df_caverns.node_id.dirt_moss +local c_dry_flowstone = df_caverns.node_id.dry_flowstone +local c_fireflies = df_caverns.node_id.fireflies +local c_glowstone = df_caverns.node_id.glowstone +local c_ice = df_caverns.node_id.ice +local c_mossycobble = df_caverns.node_id.mossycobble +local c_oil = df_caverns.node_id.oil +local c_sand_scum = df_caverns.node_id.sand_scum +local c_spongestone = df_caverns.node_id.spongestone +local c_rock_rot = df_caverns.node_id.rock_rot +local c_water = df_caverns.node_id.water +local c_wet_flowstone = df_caverns.node_id.wet_flowstone +local c_webs = df_caverns.node_id.big_webs +local c_webs_egg = df_caverns.node_id.big_webs_egg + +df_caverns.data_param2 = {} -- shared among all mapgens to reduce memory clutter + +local get_biome_at_pos_list = {} -- a list of methods of the form function(pos, heat, humidity) to allow modpack-wide queries about what should grow where +df_caverns.register_biome_check = function(func) + table.insert(get_biome_at_pos_list, func) +end +df_caverns.get_biome = function(pos) + pos = vector.round(pos) + local heat = minetest.get_heat(pos) + local humidity = minetest.get_humidity(pos) + for _, val in pairs(get_biome_at_pos_list) do + local biome = val(pos, heat, humidity) + if biome ~= nil then + return biome + end + end +end + +-- for testing +--local debug_timer = 0 +--minetest.register_globalstep(function(dtime) +-- debug_timer = debug_timer + dtime +-- if debug_timer > 5 then +-- local singleplayer = minetest.get_player_by_name("singleplayer") +-- if singleplayer then +-- minetest.debug(df_caverns.get_biome(singleplayer:get_pos())) +-- end +-- debug_timer = debug_timer - 5 +-- end +--end) + +-- prevent mapgen from using these nodes as a base for stalactites or stalagmites +local dont_build_speleothems_on = {} +for _, content_id in pairs(df_mapitems.wet_stalagmite_ids) do + dont_build_speleothems_on[content_id] = true +end +for _, content_id in pairs(df_mapitems.dry_stalagmite_ids) do + dont_build_speleothems_on[content_id] = true +end +if minetest.get_modpath("big_webs") then + dont_build_speleothems_on[c_webs] = true + dont_build_speleothems_on[c_webs_egg] = true +end + +-------------------------------------------------- + +df_caverns.stalagmites = function(abs_cracks, vert_rand, vi, area, data, data_param2, wet, reverse_sign) + if dont_build_speleothems_on[data[vi]] then + return + end + local flowstone + local stalagmite_ids + if wet then + flowstone = c_wet_flowstone + stalagmite_ids = df_mapitems.wet_stalagmite_ids + else + flowstone = c_dry_flowstone + stalagmite_ids = df_mapitems.dry_stalagmite_ids + end + + local height_mult = 1 + local ystride = area.ystride + if reverse_sign then + ystride = - ystride + height_mult = -1 + end + + if vert_rand < 0.004 then + if reverse_sign then + subterrane.big_stalactite(vi+ystride, area, data, 6, 15, flowstone, flowstone, flowstone) + else + subterrane.big_stalagmite(vi+ystride, area, data, 6, 15, flowstone, flowstone, flowstone) + end + else + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = math.floor(abs_cracks * 50) + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, height*height_mult, stalagmite_ids) + end + data[vi] = flowstone +end + +df_caverns.stalactites = function(abs_cracks, vert_rand, vi, area, data, data_param2, wet) + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, wet, true) +end + +-------------------------------------------------- + + +df_caverns.flooded_cavern_floor = function(abs_cracks, vert_rand, vi, area, data) + local ystride = area.ystride + if abs_cracks < 0.25 then + data[vi] = c_mossycobble + elseif data[vi-ystride] ~= c_water then + data[vi] = c_sand_scum + end + + -- put in only the large stalagmites that won't get in the way of the water + if abs_cracks < 0.1 then + if vert_rand < 0.004 then + subterrane.big_stalagmite(vi+ystride, area, data, 6, 15, c_wet_flowstone, c_wet_flowstone, c_wet_flowstone) + end + end +end + +df_caverns.dry_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + if abs_cracks < 0.075 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + elseif abs_cracks < 0.4 then + data[vi] = c_cobble + elseif abs_cracks < 0.6 then + data[vi] = c_cobble_fungus_fine + else + data[vi] = c_cobble_fungus + if c_dead_fungus and math.random() < 0.05 then + data[vi+area.ystride] = c_dead_fungus + end + end +end + +df_caverns.wet_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif abs_cracks < 0.6 then + data[vi] = c_cobble + elseif abs_cracks < 0.8 then + data[vi] = c_rock_rot + else + data[vi] = c_spongestone + if c_dead_fungus and math.random() < 0.05 then + data[vi+area.ystride] = c_dead_fungus + end + end +end + +-------------------------------------- + +df_caverns.glow_worm_cavern_ceiling = function(abs_cracks, vert_rand, vi, area, data, data_param2) + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif abs_cracks < 0.5 and abs_cracks > 0.3 and math.random() < 0.3 then + df_mapitems.glow_worm_ceiling(area, data, vi-area.ystride) + end +end + +df_caverns.tunnel_floor = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet, dirt_node) + if maxp.y > -30 then + wet = false + end + local ystride = area.ystride + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + + if wet then + if abs_cracks < 0.05 and data[vi+ystride] == c_air and not dont_build_speleothems_on[data[vi]] then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = math.floor(abs_cracks * 100) + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, height, df_mapitems.wet_stalagmite_ids) + data[vi] = c_wet_flowstone + elseif dirt_node and abs_cracks > 0.5 and data[vi-ystride] ~= c_air then + data[vi] = dirt_node + end + else + if abs_cracks < 0.025 and data[vi+ystride] == c_air and not dont_build_speleothems_on[data[vi]] then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = math.floor(abs_cracks * 100) + subterrane.stalagmite(vi+ystride, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids) + elseif dirt_node and cracks > 0.5 and data[vi-ystride] ~= c_air then + data[vi] = dirt_node + end + end +end + +df_caverns.tunnel_ceiling = function(minp, maxp, area, vi, nvals_cracks, data, data_param2, wet) + if maxp.y > -30 then + wet = false + end + + local ystride = area.ystride + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + + if wet then + if abs_cracks < 0.05 and data[vi-ystride] == c_air and not dont_build_speleothems_on[data[vi]] then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = math.floor(abs_cracks * 100) + subterrane.stalactite(vi-ystride, area, data, data_param2, param2, height, df_mapitems.wet_stalagmite_ids) + data[vi] = c_wet_flowstone + end + else + if abs_cracks < 0.025 and data[vi-ystride] == c_air and not dont_build_speleothems_on[data[vi]] then -- make sure data[vi] is not already flowstone. Stalagmites from lower levels are acting as base for further stalagmites + local param2 = abs_cracks*1000000 - math.floor(abs_cracks*1000000/4)*4 + local height = math.floor(abs_cracks * 100) + subterrane.stalactite(vi-ystride, area, data, data_param2, param2, height, df_mapitems.dry_stalagmite_ids) + end + end +end + +df_caverns.perlin_cave = { + offset = 0, + scale = 1, + spread = {x=df_caverns.config.horizontal_cavern_scale, y=df_caverns.config.vertical_cavern_scale, z=df_caverns.config.horizontal_cavern_scale}, + seed = -400000000089, + octaves = 3, + persist = 0.67 +} + +df_caverns.perlin_wave = { + offset = 0, + scale = 1, + spread = {x=df_caverns.config.horizontal_cavern_scale * 2, y=df_caverns.config.vertical_cavern_scale, z=df_caverns.config.horizontal_cavern_scale * 2}, -- squashed 2:1 + seed = 59033, + octaves = 6, + persist = 0.63 +} + +-- Used for making lines of dripstone, and in various other places where small-scale patterns are needed +df_caverns.np_cracks = { + offset = 0, + scale = 1, + spread = {x = 20, y = 20, z = 20}, + seed = 5717, + octaves = 3, + persist = 0.63, + lacunarity = 2.0, +} + +--------------------------------------------------------------------------------- + +df_caverns.place_shrub = function(vi, area, data, param2_data, shrub_list) + if shrub_list == nil then + return + end + + local shrub = shrub_list[math.random(#shrub_list)] + shrub(vi, area, data, param2_data) +end + +--------------------------------------------------------------------------------- +-- This method allows subterrane to overgenerate caves without destroying any of the decorations +local dfcaverns_nodes = nil +local dfcaverns_mods = { + "df_farming:", + "df_mapitems:", + "df_primordial_items:", + "df_trees:", + "df_underworld_items:", + "ice_sprites:", + "mine_gas:", +} + +df_caverns.is_ground_content = function(c_node) + if dfcaverns_nodes then + return not dfcaverns_nodes[c_node] + end + dfcaverns_nodes = {} + for k, v in pairs(minetest.registered_nodes) do + for _, prefix in ipairs(dfcaverns_mods) do + if k:sub(1, #prefix) == prefix then + dfcaverns_nodes[minetest.get_content_id(k)] = true + end + end + end + dfcaverns_nodes[c_ice] = true -- needed for nethercap cavern water covering + dfcaverns_nodes[c_oil] = true -- needed for blackcap oil slicks + if c_fireflies then + dfcaverns_nodes[c_fireflies] = true -- used in the primordial caverns + end + dfcaverns_nodes[c_glowstone] = nil + dfcaverns_mods = nil + return not dfcaverns_nodes[c_node] +end \ No newline at end of file diff --git a/mods/dfcaverns/df_caverns/sunless_sea.lua b/mods/dfcaverns/df_caverns/sunless_sea.lua new file mode 100644 index 0000000..607d91f --- /dev/null +++ b/mods/dfcaverns/df_caverns/sunless_sea.lua @@ -0,0 +1,454 @@ +local c_water = df_caverns.node_id.water +local c_air = df_caverns.node_id.air +local c_dirt = df_caverns.node_id.dirt +local c_dirt_moss = df_caverns.node_id.dirt_moss +local c_sand = df_caverns.node_id.sand +local c_gravel = df_caverns.node_id.gravel +local c_wet_flowstone = df_caverns.node_id.wet_flowstone +local c_dry_flowstone = df_caverns.node_id.dry_flowstone +local c_lava = df_caverns.node_id.lava +local c_obsidian = df_caverns.node_id.obsidian + +local chasms_path = minetest.get_modpath("chasms") + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local c_coral_table = {} +for node_name, node_def in pairs(minetest.registered_nodes) do + if minetest.get_item_group(node_name, "dfcaverns_cave_coral") > 0 then + table.insert(c_coral_table, minetest.get_content_id(node_name)) + end +end + +local towergoblin_shrublist +local fungispore_shrublist + +if minetest.get_modpath("df_farming") then + towergoblin_shrublist = { + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_plump_helmet_vm, + df_farming.spawn_dimple_cup_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } + fungispore_shrublist = { + df_farming.spawn_pig_tail_vm, + df_farming.spawn_sweet_pod_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_cave_wheat_vm, + df_farming.spawn_dead_fungus_vm, + df_farming.spawn_cavern_fungi_vm, + } +end + +------------------------------------------------------------------------------------------ + +local perlin_cave_sunless_sea = { + offset = 0, + scale = 1, + spread = {x=df_caverns.config.horizontal_cavern_scale * 2, y=df_caverns.config.vertical_cavern_scale * 0.5, z=df_caverns.config.horizontal_cavern_scale * 2}, + seed = -400000000089, + octaves = 3, + persist = 0.67 +} + +local perlin_wave_sunless_sea = { + offset = 0, + scale = 1, + spread = {x=df_caverns.config.horizontal_cavern_scale * 4, y=df_caverns.config.vertical_cavern_scale * 0.5, z=df_caverns.config.horizontal_cavern_scale * 4}, -- squashed 2:1 + seed = 59033, + octaves = 6, + persist = 0.63 +} + +local perlin_cave_rivers = { + offset = 0, + scale = 1, + spread = {x=400, y=400, z=400}, + seed = -400000000089, + octaves = 3, + persist = 0.67, + flags = "", -- remove "eased" flag, makes the paths of rivers a bit jaggedier and more interesting that curvy smooth paths +} + +-- large-scale rise and fall to make the seam between roof and floor less razor-flat and make the rivers shallower and deeper in various places +local perlin_wave_rivers = { + offset = 0, + scale = 1, + spread = {x=800, y=800, z=800}, + seed = -4000089, + octaves = 3, + persist = 0.67, +} + +local sea_level = df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.sunless_sea_min) * 0.5 + +local floor_mult = 100 +local floor_displace = -10 +local ceiling_mult = -200 +local ceiling_displace = 20 +local wave_mult = 7 +local ripple_mult = 15 +local y_max_river = sea_level + 2*wave_mult + ceiling_displace + ripple_mult +local y_min_river = sea_level - 2*wave_mult + floor_displace + +local hot_zone_boundary = 70 +local middle_zone_boundary = 50 +local cool_zone_boundary = 30 + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.sunless_sea_min or pos.y >= df_caverns.config.level3_min then + return nil + end + if pos.y < sea_level then + return "sunless undersea" + elseif heat > hot_zone_boundary then + return "barren" -- hot zone + elseif heat > middle_zone_boundary then + return "fungispore" + elseif heat > cool_zone_boundary then + return "towergoblin" + else + return "barren" -- cool zone + end +end) + +local towergoblin_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air and data[vi-ystride] ~= c_water then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_dirt_moss + end + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, towergoblin_shrublist) + elseif abs_cracks > 0.25 then + if math.random() < 0.01 then + df_trees.spawn_tower_cap_vm(vi+ystride, area, data) + elseif math.random() < 0.01 then + df_trees.spawn_goblin_cap_vm(vi+ystride, area, data, data_param2) + elseif math.random() < 0.02 then + df_trees.spawn_spindlestem_vm(vi+ystride, area, data, data_param2) + end + end + end +end + +local fungispore_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + local ystride = area.ystride + if abs_cracks < 0.1 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) + elseif data[vi-ystride] ~= c_air and data[vi-ystride] ~= c_water then -- leave the ground as rock if it's only one node thick + if math.random() < 0.25 then + data[vi] = c_dirt + else + data[vi] = c_dirt_moss + end + if math.random() < 0.1 then + df_caverns.place_shrub(vi+ystride, area, data, data_param2, fungispore_shrublist) + elseif abs_cracks > 0.35 then + if math.random() < 0.025 then + df_trees.spawn_fungiwood_vm(vi+ystride, area, data) + elseif math.random() < 0.025 then + df_trees.spawn_spore_tree_vm(vi+ystride, area, data, data_param2) + end + end + end +end + +local cool_zone_ceiling = function(abs_cracks, vert_rand, vi, area, data, data_param2) + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end +end + +local hot_zone_ceiling = function(abs_cracks, vert_rand, vi, area, data, data_param2) + -- dry zone ceiling, add crystals + if abs_cracks < 0.1 then + df_caverns.stalactites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + end + if abs_cracks > 0.3 and math.random() < 0.005 then + df_mapitems.place_big_crystal_cluster(area, data, data_param2, vi, math.random(0,3), true) + end +end + +local cool_zone_floor = df_caverns.dry_cavern_floor + +local hot_zone_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) + if abs_cracks < 0.075 then + df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, false) + elseif abs_cracks > 0.3 and math.random() < 0.005 then + df_mapitems.place_big_crystal_cluster(area, data, data_param2, vi+area.ystride, math.random(0,2), false) + end +end + + +local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, data) + math.randomseed(minp.x + minp.y*2^8 + minp.z*2^16 + seed) -- make decorations consistent between runs + + local heatmap = minetest.get_mapgen_object("heatmap") + local data_param2 = df_caverns.data_param2 + vm:get_param2_data(data_param2) + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + + local minp_below = minp.y <= sea_level + local maxp_above = maxp.y > sea_level + + local nvals_cave = mapgen_helper.perlin2d("df_caverns:sunless_sea", minp, maxp, perlin_cave_rivers) --cave noise for structure + local nvals_wave = mapgen_helper.perlin2d("df_caverns:sunless_sea_wave", minp, maxp, perlin_wave_rivers) --cave noise for structure + + local skip_next = false -- mapgen is proceeding upward on the y axis, + --if this is true it skips a step to allow for things to be placed above the floor + + -- creates "river" caverns + for vi, x, y, z in area:iterp_yxz(minp, maxp) do + if not skip_next then + if y < y_max_river and y > y_min_river then + local index2d = mapgen_helper.index2d(minp, maxp, x, z) + local abs_cave = math.abs(nvals_cave[index2d]) + local wave = nvals_wave[index2d] * wave_mult + local cracks = nvals_cracks[index2d] + + local ripple = cracks * ((y - y_min_river) / (y_max_river - y_min_river)) * ripple_mult + + -- above floor and below ceiling + local floor_height = math.floor(abs_cave * floor_mult + sea_level + floor_displace + wave) + local ceiling_height = math.floor(abs_cave * ceiling_mult + sea_level + ceiling_displace + wave + ripple) + + -- deal with lava + if y <= floor_height and y > floor_height - 3 and y < sea_level + 5 and data[vi] == c_lava then + data[vi] = c_obsidian + end + + if y == floor_height and y < sea_level and not mapgen_helper.buildable_to(data[vi]) then + if cracks > 0.2 then + data[vi] = c_sand + if cracks > 0.5 then + data[vi+area.ystride] = c_sand + skip_next = true + end + else + data[vi] = c_gravel + end + elseif y > floor_height and y < ceiling_height and data[vi] ~= c_wet_flowstone then + data[vi] = c_air + if log_location then log_location("sunless_sea_river", vector.new(x,y,z)) end + elseif y == ceiling_height and not mapgen_helper.buildable_to(data[vi]) then + df_caverns.glow_worm_cavern_ceiling(math.abs(cracks), + mapgen_helper.xz_consistent_randomi(area, vi), vi, area, data, data_param2) + end + + -- Deal with lava + if y >= ceiling_height and y < ceiling_height + 5 and y > sea_level - 5 and data[vi] == c_lava then + data[vi] = c_obsidian + end + end + else + skip_next = false + end + end + + if minp.y <= sea_level then + for vi, x, y, z in area:iterp_yxz(area.MinEdge, area.MaxEdge) do + -- convert all air below sea level into water + if y <= sea_level and data[vi] == c_air then + data[vi] = c_water + end + end + end + + + --------------------------------------------------------- + -- Cavern floors + + for _, vi in ipairs(node_arrays.cavern_floor_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local heat = heatmap[index2d] + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local y = area:get_y(vi) + + -- The vertically squished aspect of these caverns produces too many very thin shelves, this blunts them + if mapgen_helper.buildable_to(data[vi-area.ystride]) then + if y <= sea_level then + data[vi] = c_water + else + data[vi] = c_air + end + end + + -- extra test is needed because the rivers can remove nodes that Subterrane marked as floor. + if not mapgen_helper.buildable_to(data[vi]) then + if y >= sea_level then + if heat > hot_zone_boundary then + hot_zone_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_hot", area:position(vi)) end + elseif heat > middle_zone_boundary then + fungispore_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_fungispore", area:position(vi)) end + elseif heat > cool_zone_boundary then + towergoblin_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_towergoblin", area:position(vi)) end + else + cool_zone_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_cool", area:position(vi)) end + end + elseif y >= sea_level - 30 then + if math.random() < 0.005 then + df_mapitems.place_snareweed_patch(area, data, vi, data_param2, 6) + else + data[vi] = c_dirt + end + else + data[vi] = c_sand + if math.random() < 0.001 then + local iterations = math.random(1, 6) + df_mapitems.spawn_coral_pile(area, data, vi, iterations) + df_mapitems.spawn_castle_coral(area, data, vi+area.ystride, iterations) + if log_location then log_location("sunless_sea_castle_coral", area:position(vi)) end + end + end + end + end + + -------------------------------------- + -- Cavern ceilings + + for _, vi in ipairs(node_arrays.cavern_ceiling_nodes) do + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local heat = heatmap[index2d] + local cracks = nvals_cracks[index2d] + local abs_cracks = math.abs(cracks) + local vert_rand = mapgen_helper.xz_consistent_randomi(area, vi) + local y = area:get_y(vi) + + if y > sea_level and not mapgen_helper.buildable_to(data[vi]) then + if heat > hot_zone_boundary then + hot_zone_ceiling(abs_cracks, vert_rand, vi, area, data, data_param2) + elseif heat > cool_zone_boundary then + df_caverns.glow_worm_cavern_ceiling(abs_cracks, vert_rand, vi, area, data, data_param2) + else + cool_zone_ceiling(abs_cracks, vert_rand, vi, area, data, data_param2) + end + end + + end + + ---------------------------------------------- + -- Tunnel floors + + for _, vi in ipairs(node_arrays.tunnel_floor_nodes) do + if area:get_y(vi) >= sea_level and not mapgen_helper.buildable_to(data[vi]) then + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + end + end + + ------------------------------------------------------ + -- Tunnel ceiling + + for _, vi in ipairs(node_arrays.tunnel_ceiling_nodes) do + if area:get_y(vi) > sea_level and not mapgen_helper.buildable_to(data[vi]) then + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + -- air pockets + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local ystride = area.ystride + if cracks > 0.6 and data[vi-ystride] == c_water then + data[vi-ystride] = c_air + if cracks > 0.8 and data[vi-ystride*2] == c_water then + data[vi-ystride*2] = c_air + end + end + end + end + + ------------------------------------------------------ + -- Warren ceiling + + for _, vi in ipairs(node_arrays.warren_ceiling_nodes) do + if area:get_y(vi) > sea_level and not mapgen_helper.buildable_to(data[vi]) then + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + else + -- air pockets + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local cracks = nvals_cracks[index2d] + local ystride = area.ystride + if cracks > 0.6 and data[vi-ystride] == c_water then + data[vi-ystride] = c_air + if cracks > 0.8 and data[vi-ystride*2] == c_water then + data[vi-ystride*2] = c_air + end + end + end + end + + ---------------------------------------------- + -- Warren floors + + for _, vi in ipairs(node_arrays.warren_floor_nodes) do + if area:get_y(vi) >= sea_level and not mapgen_helper.buildable_to(data[vi]) then + df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + if log_location then log_location("sunless_sea_warren", area:position(vi)) end + end + end + + -- columns + for _, vi in ipairs(node_arrays.column_nodes) do + if data[vi] == c_wet_flowstone then + if area:get_y(vi) > sea_level then + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + local heat = heatmap[index2d] + if heat > hot_zone_boundary then + data[vi] = c_dry_flowstone + end + else + data[vi] = c_coral_table[math.random(1,3)] + data_param2[vi] = math.random(1,4)-1 + minetest.get_node_timer(area:position(vi)):start(math.random(10, 60)) + end + + if chasms_path then + local pos = area:position(vi) + if chasms.is_in_chasm(pos) then + if pos.y <= sea_level then + data[vi] = c_water + else + data[vi] = c_air + end + end + end + end + end + + vm:set_param2_data(data_param2) +end + +--Sunless Sea +subterrane.register_layer({ + name = "sunless sea", + y_max = df_caverns.config.level3_min-1, + y_min = df_caverns.config.sunless_sea_min, + cave_threshold = df_caverns.config.sunless_sea_threshold, + perlin_cave = perlin_cave_sunless_sea, + perlin_wave = perlin_wave_sunless_sea, + solidify_lava = true, + columns = { + maximum_radius = 20, + minimum_radius = 5, + node = "df_mapitems:wet_flowstone", + weight = 0.5, + maximum_count = 60, + minimum_count = 10, + }, + decorate = decorate_sunless_sea, + double_frequency = false, + is_ground_content = df_caverns.is_ground_content, +}) diff --git a/mods/dfcaverns/df_caverns/surface_tunnels.lua b/mods/dfcaverns/df_caverns/surface_tunnels.lua new file mode 100644 index 0000000..0335748 --- /dev/null +++ b/mods/dfcaverns/df_caverns/surface_tunnels.lua @@ -0,0 +1,87 @@ +-- surface tunnels + +local y_max = 200 +local y_min = df_caverns.config.ymax + +local c_stone = df_caverns.node_id.stone +local c_air = df_caverns.node_id.air + +minetest.register_on_generated(function(minp, maxp, seed) + --if out of range of cave definition limits, abort + if minp.y > y_max or maxp.y < y_min then + return + end + + local t_start = os.clock() + + local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2() + local data_changed = false + + local eminp = {x=minp.x, y=area.MinEdge.y, z=minp.z} + local emaxp = {x=maxp.x, y=area.MaxEdge.y, z=maxp.z} + local minp_y = minp.y + local maxp_y = maxp.y + + local humiditymap = minetest.get_mapgen_object("humiditymap") + local nvals_cracks = mapgen_helper.perlin2d("df_cavern:cracks", minp, maxp, df_caverns.np_cracks) + + local previous_y = eminp.y-1 + + local previous_potential_floor_vi + local previous_potential_floor_y + local previous_node + + for vi, x, y, z in area:iterp_yxz(eminp, emaxp) do + + if y < previous_y then + -- we've started a new column, initialize everything + previous_potential_floor_vi = nil + previous_potential_floor_y = nil + previous_node = nil + end + previous_y = y + + local current_node = data[vi] + if previous_node and y < y_max then + if current_node == c_air and previous_node == c_stone then + -- this may be a floor, but only if we eventually hit a ceiling in this column + previous_potential_floor_vi = vi-area.ystride + previous_potential_floor_y = y-1 + elseif current_node == c_stone and previous_node == c_air and previous_potential_floor_vi then + -- we hit a ceiling after passing through a floor + local index2d = mapgen_helper.index2d(minp, maxp, x, z) + local humidity = humiditymap[index2d] + if previous_potential_floor_y <= maxp_y and previous_potential_floor_y >= minp_y then + data_changed = true + df_caverns.tunnel_floor(minp, maxp, area, previous_potential_floor_vi, nvals_cracks, data, data_param2, humidity > 30) + end + if y <= maxp_y and y >= minp_y then + data_changed = true + df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30) + end + previous_potential_floor_vi = nil + elseif not mapgen_helper.buildable_to(current_node) then + -- we've entered a non-stone ceiling of some kind. Abort potential floor-ceiling pair detection. + previous_potential_floor_vi = nil + end + end + previous_node = current_node + + end + + if data_changed then + --send data back to voxelmanip + vm:set_data(data) + vm:set_param2_data(data_param2) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + + vm:update_liquids() + --write it to world + vm:write_to_map() + end + + local time_taken = os.clock() - t_start -- how long this chunk took, in seconds + mapgen_helper.record_time("df_caverns surface tunnels", time_taken) +end) diff --git a/mods/dfcaverns/df_caverns/underworld.lua b/mods/dfcaverns/df_caverns/underworld.lua new file mode 100644 index 0000000..bdd32f0 --- /dev/null +++ b/mods/dfcaverns/df_caverns/underworld.lua @@ -0,0 +1,628 @@ +if not df_caverns.config.enable_underworld or not minetest.get_modpath("df_underworld_items") then + return +end +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) + +local bones_loot_path = minetest.get_modpath("bones_loot") +local bones_node = df_dependencies.node_name_bones +local named_waypoints_path = minetest.get_modpath("named_waypoints") +local name_generator_path = minetest.get_modpath("name_generator") + +local hunters_enabled = minetest.get_modpath("hunter_statue") and df_underworld_items.config.underworld_hunter_statues + +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +-- Exposed as a global so that other mods can override it. +df_caverns.populate_puzzle_chest = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, math.random(1,8) do + local item = ItemStack(df_underworld_items.colour_items[math.random(1,#df_underworld_items.colour_items)]) + --item:set_count(math.random(1,4)) + inv:add_item("main", item) + end +end + +local name_pit = function() end +local name_ruin = function() end + +if named_waypoints_path then + + local item_required = nil + if minetest.settings:get_bool("dfcaverns_underworld_hud_requires_item", true) then + local setting_item_required = minetest.settings:get("dfcaverns_underworld_hud_item_required") + if setting_item_required == nil or setting_item_required == "" then + setting_item_required = "map:mapping_kit" + end + item_required = setting_item_required + end + + local pit_waypoint_def = { + default_name = S("A glowing pit"), + default_color = 0xFF88FF, + discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_discovery_range")) or 60, + visibility_requires_item = item_required, + } + + if minetest.settings:get_bool("dfcaverns_show_pits_in_hud", true) then + pit_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_pit_visibility_range")) or 500 + pit_waypoint_def.on_discovery = named_waypoints.default_discovery_popup + end + named_waypoints.register_named_waypoints("glowing_pits", pit_waypoint_def) + + local seal_waypoint_def = { + default_name = S("Mysterious seal"), + default_color = 0x9C2233, + discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_discovery_range")) or 10, + visibility_requires_item = item_required, + } + + if minetest.settings:get_bool("dfcaverns_show_seals_in_hud", true) then + seal_waypoint_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_seal_visibility_range")) or 200 + seal_waypoint_def.on_discovery = named_waypoints.default_discovery_popup + end + named_waypoints.register_named_waypoints("puzzle_seals", seal_waypoint_def) + + if name_generator_path then + name_generator.parse_lines(io.lines(modpath.."/underworld_names.cfg")) + + name_pit = function() + return name_generator.generate("glowing_pits") + end + name_ruin = function() + return name_generator.generate("underworld_ruins") + end + + local underworld_ruin_def = { + default_name = S("Ancient ruin"), + discovery_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_discovery_range")) or 40, + visibility_requires_item = item_required, + } + if minetest.settings:get_bool("dfcaverns_show_ruins_in_hud", true) then + underworld_ruin_def.visibility_volume_radius = tonumber(minetest.settings:get("dfcaverns_ruin_visibility_range")) or 250 + underworld_ruin_def.on_discovery = named_waypoints.default_discovery_popup + end + + named_waypoints.register_named_waypoints("underworld_ruins", underworld_ruin_def) + end +end + +local c_slade = df_caverns.node_id.slade +local c_slade_block = df_caverns.node_id.slade_block +local c_air = df_caverns.node_id.air +local c_water = df_caverns.node_id.water + +local c_glowstone = df_caverns.node_id.glowstone +local c_amethyst = df_caverns.node_id.amethyst +local c_pit_plasma = df_caverns.node_id.pit_plasma + +local MP = minetest.get_modpath(minetest.get_current_modname()) +local oubliette_schematic = dofile(MP.."/schematics/oubliette.lua") +local lamppost_schematic = dofile(MP.."/schematics/lamppost.lua") +local small_slab_schematic = dofile(MP.."/schematics/small_slab.lua") +local small_building_schematic = dofile(MP.."/schematics/small_building.lua") +local medium_building_schematic = dofile(MP.."/schematics/medium_building.lua") + +local perlin_cave = { + offset = 0, + scale = 1, + spread = {x=200, y=200, z=200}, + seed = 88233498, + octaves = 6, + persist = 0.67 +} + +-- large-scale rise and fall to make the seam between stone and slade less razor-flat +local perlin_wave = { + offset = 0, + scale = 1, + spread = {x=1000, y=1000, z=1000}, + seed = 993455, + octaves = 3, + persist = 0.67 +} + +-- building zones +local perlin_zone = { + offset = 0, + scale = 1, + spread = {x=500, y=500, z=500}, + seed = 199422, + octaves = 3, + persist = 0.67 +} + +local median = df_caverns.config.underworld_level +local floor_mult = 20 +local floor_displace = -10 +local ceiling_mult = -40 +local ceiling_displace = 20 +local wave_mult = 50 + +local y_max = median + 2*wave_mult + ceiling_displace + -2*ceiling_mult +local y_min = median - 2*wave_mult + floor_displace - 2*floor_mult + +--df_caverns.config.underworld_min = y_min + +--local poisson = mapgen_helper.get_poisson_points({x=-32000, z=-32000}, {x=32000, z=32000}, 1000) +--minetest.debug(dump(poisson.objects)) + +--------------------------------------------------------- +-- Buildings + +local oubliette_threshold = 0.8 +local town_threshold = 1.1 + +local local_random = function(x, z) + local next_seed = math.floor(math.random()*2^21) + math.randomseed(x + z*2^16) + local ret = math.random() + math.randomseed(next_seed) + return ret +end + +-- create a deterministic list of buildings +local get_buildings = function(emin, emax, nvals_zone) + local buildings = {} + for x = emin.x, emax.x do + for z = emin.z, emax.z do + + local index2d = mapgen_helper.index2d(emin, emax, x, z) + local zone = math.abs(nvals_zone[index2d]) + + if zone > oubliette_threshold and zone < town_threshold then + -- oubliette zone + --zone = (zone - oubliette_threshold)/(town_threshold-oubliette_threshold) -- turn this into a 0-1 spread + local building_val = local_random(x, z) + if building_val > 0.98 then + building_val = (building_val - 0.98)/0.02 + local building_type + if building_val < 0.8 then + building_type = "oubliette" + elseif building_val < 0.9 then + building_type = "open oubliette" + else + building_type = "lamppost" + end + table.insert(buildings, + { + pos = {x=x, y=0, z=z}, -- y to be determined later + building_type = building_type, + bounding_box = {minpos={x=x-2, z=z-2}, maxpos={x=x+2, z=z+2}}, + priority = math.floor(building_val * 10000000) % 1000, -- indended to allow for deterministic removal of overlapping buildings + } + ) + end + elseif zone > town_threshold then + -- town zone + local building_val = local_random(x, z) + if building_val > 0.9925 then + building_val = (building_val - 0.9925)/0.0075 + + local building_type + local bounding_box + local priority = math.floor(building_val * 10000000) % 1000 + local rotation = (priority % 4) * 90 + + if building_val < 0.75 then + building_type = "small building" + local boundmin, boundmax = mapgen_helper.get_schematic_bounding_box({x=x, y=0, z=z}, small_building_schematic, rotation) + bounding_box = {minpos=boundmin, maxpos=boundmax} + elseif building_val < 0.85 then + building_type = "medium building" + local boundmin, boundmax = mapgen_helper.get_schematic_bounding_box({x=x, y=0, z=z}, medium_building_schematic, rotation) + bounding_box = {minpos=boundmin, maxpos=boundmax} + else + building_type = "small slab" + local boundmin, boundmax = mapgen_helper.get_schematic_bounding_box({x=x, y=0, z=z}, small_slab_schematic, rotation) + bounding_box = {minpos=boundmin, maxpos=boundmax} + end + + table.insert(buildings, + { + pos = {x=x, y=0, z=z}, -- y to be determined later + building_type = building_type, + bounding_box = bounding_box, + rotation = rotation, + priority = priority, -- indended to allow for deterministic removal of overlapping buildings + } + ) + end + end + end + end + + -- eliminate overlapping buildings + local building_count = table.getn(buildings) + local overlap_count = 0 + for i = 1, building_count-1 do + local curr_building = buildings[i] + for j = i+1, building_count do + local test_building = buildings[j] + if test_building ~= nil and curr_building ~= nil and mapgen_helper.intersect_exists_xz( + curr_building.bounding_box.minpos, + curr_building.bounding_box.maxpos, + test_building.bounding_box.minpos, + test_building.bounding_box.maxpos) then + + if curr_building.priority < test_building.priority then -- this makes elimination of overlapping buildings deterministic + buildings[i] = nil + j=building_count+1 + else + buildings[j] = nil + end + overlap_count = overlap_count + 1 + end + end + end + + if building_count > 50 and overlap_count > building_count * 2/3 then + minetest.log("warning", "[df_caverns] underworld mapgen generated " .. + tostring(building_count) .. " buildings and " .. tostring(overlap_count) .. + " were eliminated as overlapping, if this happens a lot consider reducing building" .. + " generation probability to improve efficiency.") + end + + local compacted_buildings = {} + for _, building in pairs(buildings) do + compacted_buildings[minetest.hash_node_position(building.pos)] = building + end + + return compacted_buildings +end + +----------------------------------------------------------- +-- Pits + +local radius_pit_max = 40 -- won't actually be this wide, there'll be crystal spires around it +local radius_pit_variance = 10 +local plasma_depth_min = 5 +local plasma_depth_max = 75 + +local region_mapblocks = df_caverns.config.underworld_glowing_pit_mapblocks -- One glowing pit in each region this size +local mapgen_chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) +local pit_region_size = region_mapblocks * mapgen_chunksize * 16 + +local scatter_2d = function(min_xz, gridscale, border_width) + local bordered_scale = gridscale - 2 * border_width + local point = {} + point.x = math.floor(math.random() * bordered_scale + min_xz.x + border_width) + point.y = 0 + point.z = math.floor(math.random() * bordered_scale + min_xz.z + border_width) + return point +end + +-- For some reason, map chunks generate with -32, -32, -32 as the "origin" minp. To make the large-scale grid align with map chunks it needs to be offset like this. +local get_corner = function(pos) + return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32} +end + +local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) % 2^21 + +local get_pit = function(pos) + if region_mapblocks < 1 then return nil end + + local corner_xz = get_corner(pos) + local next_seed = math.floor(math.random() * 2^21) + math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed) + local location = scatter_2d(corner_xz, pit_region_size, radius_pit_max + radius_pit_variance) + local variance_multiplier = math.random() + local radius = variance_multiplier * (radius_pit_max - 15) + 15 + local variance = radius_pit_variance/2 + radius_pit_variance*variance_multiplier/2 + local depth = math.random(plasma_depth_min, plasma_depth_max) + math.randomseed(next_seed) + return {location = location, radius = radius, variance = variance, depth = depth} +end + +df_caverns.get_nearest_glowing_pit = get_pit + +local perlin_pit = { + offset = 0, + scale = 1, + spread = {x=30, y=30, z=30}, + seed = 901, + octaves = 3, + persist = 0.67 +} + +------------------------------------- + +minetest.register_chatcommand("find_pit", { + params = "", + privs = {server=true}, + decription = "find a nearby glowing pit", + func = function(name, param) + local player = minetest.get_player_by_name(name) + local pit = get_pit(player:get_pos()) + if pit then + minetest.chat_send_player(name, "Pit location: x=" .. math.floor(pit.location.x) .. " z=" .. math.floor(pit.location.z)) + end + end, +}) + +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y > y_max or pos.y < y_min then + return + end + return "underworld" +end) + +minetest.register_on_generated(function(minp, maxp, seed) + + --if out of range of cave definition limits, abort + if minp.y > y_max or maxp.y < y_min then + return + end + + local t_start = os.clock() + + local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2() + local emin = area.MinEdge + local emax = area.MaxEdge + + local nvals_cave = mapgen_helper.perlin2d("df_caverns:underworld_cave", emin, emax, perlin_cave) --cave noise for structure + local nvals_wave = mapgen_helper.perlin2d("df_caverns:underworld_wave", emin, emax, perlin_wave) --cave noise for structure + local nvals_zone = mapgen_helper.perlin2d("df_caverns:underworld_zone", emin, emax, perlin_zone) --building zones + + local pit = get_pit(minp) + --minetest.chat_send_all(minetest.pos_to_string(pit.location)) + + local buildings = get_buildings(emin, emax, nvals_zone) + + local pit_uninitialized = true + local nvals_pit, area_pit + + for vi, x, y, z in area:iterp_yxz(minp, maxp) do + if y > y_min then + local index2d = mapgen_helper.index2d(emin, emax, x, z) + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + + local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave) + + if named_waypoints_path and floor_height == y and pit and pit.location.x == x and pit.location.z == z then + named_waypoints.add_waypoint("glowing_pits", {x=x, y=y, z=z}, {name=name_pit()}) + end + + local underside_height = math.floor(y_min + math.abs(wave) / 5)+2 -- divide wave by five to smooth out the underside of the slade, we only want the interface to ripple a little down here + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + if (y == underside_height or y == underside_height - 1) and (x % 8 == 0 or z % 8 == 0) then + data[vi] = c_air + elseif y < floor_height and y > underside_height then + data[vi] = c_slade + if pit and + pit.location.x - radius_pit_max - radius_pit_variance < maxp.x and + pit.location.x + radius_pit_max + radius_pit_variance > minp.x and + pit.location.z - radius_pit_max - radius_pit_variance < maxp.z and + pit.location.z + radius_pit_max + radius_pit_variance > minp.z + then + -- there's a pit nearby + if pit_uninitialized then + nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit) + pit_uninitialized = false + end + local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance + local distance = vector.distance({x=x, y=y, z=z}, {x=pit.location.x, y=y, z=pit.location.z}) + pit_value + if distance < pit.radius -2.5 then + if y < median + floor_displace + wave - pit.depth or y < underside_height + plasma_depth_min then + data[vi] = c_pit_plasma + if log_location then log_location("underworld_pit", vector.new(x,y,z)) end + else + data[vi] = c_air + end + elseif distance < pit.radius then + data[vi] = c_amethyst + elseif distance < radius_pit_max and y == floor_height - 4 then + if math.random() > 0.95 then + df_underworld_items.underworld_shard(data, area, vi) + end + end + end + elseif y >= floor_height and y < ceiling_height and data[vi] ~= c_amethyst then + data[vi] = c_air + elseif data[vi] == c_water then + data[vi] = c_air -- no water down here + end + end + end + + -- Ceiling decoration + for x = minp.x + 1, maxp.x-1 do + for z = minp.z + 1, maxp.z -1 do + local index2d = mapgen_helper.index2d(emin, emax, x, z) + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave) + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + + if ceiling_height > floor_height + 5 and ceiling_height < maxp.y and ceiling_height > minp.y then + local vi = area:index(x, ceiling_height, z) + if ( + --test if we're nestled in a crevice + (not mapgen_helper.buildable_to(data[vi-area.ystride + 1]) and not mapgen_helper.buildable_to(data[vi-area.ystride - 1])) or + (not mapgen_helper.buildable_to(data[vi-area.ystride + area.zstride]) and not mapgen_helper.buildable_to(data[vi-area.ystride - area.zstride])) + ) + then + data[vi] = c_glowstone + end + end + end + end + + -- buildings + for x = emin.x + 5, emax.x - 5 do + for z = emin.z + 5, emax.z - 5 do + + local skip = false + if pit and + pit.location.x - radius_pit_max - radius_pit_variance < x and + pit.location.x + radius_pit_max + radius_pit_variance > x and + pit.location.z - radius_pit_max - radius_pit_variance < z and + pit.location.z + radius_pit_max + radius_pit_variance > z + then + if vector.distance(pit.location, {x=x, y=0, z=z}) < radius_pit_max + radius_pit_variance then + -- there's a pit nearby + skip = true + end + end + if not skip then + local index2d = mapgen_helper.index2d(emin, emax, x, z) + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave) + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + + if ceiling_height > floor_height and floor_height <= maxp.y and floor_height >= minp.y then + local building = buildings[minetest.hash_node_position({x=x,y=0,z=z})] + if building ~= nil then + building.pos.y = floor_height + --minetest.chat_send_all("placing " .. building.building_type .. " at " .. minetest.pos_to_string(building.pos)) + if building.building_type == "oubliette" then + mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, oubliette_schematic) + elseif building.building_type == "open oubliette" then + mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, oubliette_schematic, 0, {["df_underworld_items:slade_seal"] = "air"}) + elseif building.building_type == "lamppost" then + mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, lamppost_schematic) + local lamp_pos = vector.new(building.pos.x, building.pos.y+6, building.pos.z) + minetest.after(math.random()*10, function() + -- not all of these locations will get a lamp, but it's easier to just set four + -- timers than to worry about testing first. + minetest.get_node_timer({x=lamp_pos.x+1, y=lamp_pos.y, z=lamp_pos.z}):start(math.random()*30) + minetest.get_node_timer({x=lamp_pos.x-1, y=lamp_pos.y, z=lamp_pos.z}):start(math.random()*30) + minetest.get_node_timer({x=lamp_pos.x, y=lamp_pos.y, z=lamp_pos.z+1}):start(math.random()*30) + minetest.get_node_timer({x=lamp_pos.x, y=lamp_pos.y, z=lamp_pos.z-1}):start(math.random()*30) + end) + elseif building.building_type == "small building" then + mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation) + local pos = building.pos + minetest.after(1, function() + local puzzle_chest = minetest.find_node_near(pos, 4, {"df_underworld_items:puzzle_chest_closed"}, true) + if puzzle_chest then + local def = minetest.registered_nodes["df_underworld_items:puzzle_chest_closed"] + def.can_dig(puzzle_chest) -- initializes the inventory + df_caverns.populate_puzzle_chest(puzzle_chest) + end + end) + elseif building.building_type == "medium building" then + mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation) + if name_generator_path then + if not next(named_waypoints.get_waypoints_in_area("underworld_ruins", vector.subtract(building.pos, 250), vector.add(building.pos, 250))) then + named_waypoints.add_waypoint("underworld_ruins", {x=building.pos.x, y=floor_height+1, z=building.pos.z}, {name=name_ruin()}) + end + end + if log_location then log_location("underworld_building", building.pos) end + elseif building.building_type == "small slab" then + mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation) + else + minetest.log("error", "unrecognized underworld building type: " .. tostring(building.building_type)) + end + end + end + end + end + end + + -- puzzle seal + local puzzle_seal = nil + if pit_uninitialized and math.random() < 0.05 then + local index2d = mapgen_helper.index2d(emin, emax, minp.x + 3, minp.z + 3) + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + + local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave) + local underside_height = math.floor(y_min + math.abs(wave) / 5) + + if floor_height < maxp.y and floor_height > minp.y then + for plat_vi in area:iter(minp.x, floor_height-6, minp.z, minp.x+6, floor_height, minp.z+6) do + data[plat_vi] = c_slade_block + end + puzzle_seal = {x=minp.x+3, y=floor_height+1, z=minp.z+3} + minetest.log("info", "Puzzle seal generated at " .. minetest.pos_to_string(puzzle_seal)) + if log_location then log_location("underworld_puzzle_seal", puzzle_seal) end + end + end + + --send data back to voxelmanip + vm:set_data(data) + vm:set_param2_data(data_param2) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + vm:update_liquids() + --write it to world + vm:write_to_map() + + if puzzle_seal ~= nil then + if named_waypoints_path then + named_waypoints.add_waypoint("puzzle_seals", puzzle_seal) + end + + minetest.place_schematic({x=puzzle_seal.x-3, y=puzzle_seal.y, z=puzzle_seal.z-3}, df_underworld_items.seal_temple_schem, 0, {}, true) + local node_name = minetest.get_node(puzzle_seal).name + local node_def = minetest.registered_nodes[node_name] + node_def.on_construct(puzzle_seal) + end + + if bones_loot_path then + for i = 1, 30 do + local x = math.random(minp.x, maxp.x) + local z = math.random(minp.z, maxp.z) + local index2d = mapgen_helper.index2d(emin, emax, x, z) + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)-1 + local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) + if floor_height < ceiling_height then + local zone = math.abs(nvals_zone[index2d]) + if math.random() < zone/2 then -- bones are more common in the built-up areas + local floor_node = minetest.get_node({x=x, y=floor_height, z=z}) + local floor_node_def = minetest.registered_nodes[floor_node.name] + if floor_node_def and not floor_node_def.buildable_to then + local y = floor_height + 1 + while y < ceiling_height do + local target_pos = {x=x, y=y, z=z} + local target_node = minetest.get_node(target_pos) + if target_node.name == "air" then + bones_loot.place_bones(target_pos, "underworld_warrior", math.random(3, 10), nil, true) + break + elseif target_node.name == bones_node then + -- don't stack bones on bones, it looks silly + break + end + y = y + 1 + end + end + end + end + end + end + + if hunters_enabled then + local x = math.random(minp.x, maxp.x) + local z = math.random(minp.z, maxp.z) + local index2d = mapgen_helper.index2d(emin, emax, x, z) + local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands + local wave = nvals_wave[index2d] * wave_mult + local floor_height = math.floor(abs_cave * floor_mult + median + floor_displace + wave)-1 + local zone = math.abs(nvals_zone[index2d]) + if math.random() < zone / 4 then -- hunters are more common in the built-up areas. zone/4 gives ~ 400 hunters per square kilometer. + for y = floor_height, floor_height+20 do + local target_pos = {x=x, y=y, z=z} + local target_node = minetest.get_node(target_pos) + if minetest.get_item_group(target_node.name, "slade") == 0 then + minetest.set_node(target_pos, {name="df_underworld_items:hunter_statue"}) + break + end + end + end + + end + + local time_taken = os.clock() - t_start -- how long this chunk took, in seconds + mapgen_helper.record_time("df_caverns underworld", time_taken) +end) diff --git a/mods/dfcaverns/df_caverns/underworld_names.cfg b/mods/dfcaverns/df_caverns/underworld_names.cfg new file mode 100644 index 0000000..97f7ed6 --- /dev/null +++ b/mods/dfcaverns/df_caverns/underworld_names.cfg @@ -0,0 +1,18 @@ +name "glowing_pits" { + customGroupA = "Actinic, Amethyst, Angry, Atrocious, Bad, Blighted, Baneful, Baleful, Beastly, Calamitous, Corrupt, Crazed, Damnable, Demoniacal, Demonic, Depraved, Destructive, Devilish, Diabolical, Disastrous, Execrable, Fiendish, Foul, Frenzied, Glaring, Harmful, Hateful, Heinous, Hellish, Hideous, Infernal, Iniquitous, Injurious, Loathsome, Lost, Maleficent, Malevolent, Malicious, Malignant, Manic, Nefarious, Nightmare, Obscene, Offensive, Pernicious, Poison, Possessed, Rancorous, Repugnant, Repulsive, Revolting, Spiteful, Unhallowed, Unpleasant, Vicious, Vile, Villainous, Violent, Wicked, Wrathful" + + customGroupB = "Abyss, Aperture, Breach, Cavity, Chasm, Crevasse, Depth, Deep, Fissure, Funnel, Gate, Gulf, Hell, Hole, Hollow, Inferno, Maw, Mouth, Opening, Pit, Portal, Puncture, Ravager, Rent, Rift, Rim, Schism, Shaft, Split, Throat, Void, Well" + + customGroupC = "Adversity, Affliction, Annihilation, Bale, Bane, Blight, Calamity, Cataclysm, Catastrophe, Collapse, Conclusion, Condemnation, Death, Defeat, Destiny, Destruction, Disaster, Doom, Downfall, Failure, Grief, Harm, Hazard, Judgment, Karma, Misadventure, Mischance, Misfortune, Mishap, Ruin, Ruination, Tragedy, Undoing, Verdict, Woe" + + rules = "%50The_$A_$B, The_$B_of_$C, %10The_$A_$B_of_$C" +} + +name "underworld_ruins" { + + customGroupA = "Abandoned, Absent, Adrift, Alien, Anonymous, Bare, Barren, Blank, Buried, Clandestine, Cloaked, Concealed, Covered, Cryptic, Dark, Dead, Depleted, Deserted, Desolate, Despoiled, Destitute, Devoid, Disappeared, Distant, Exhausted, Empty, Forfeit, Forfeited, Forsaken, Hidden, Incognito, Indiscernible, Invisible, Irretrievable, Irrevocable, Masked, Mislaid, Misplaced, Mystic, Mystical, Nameless, Obscured, Secluded, Secret, Sequestered, Shadowy, Shrouded, Stark, Strange, Uncelebrated, Uncharted, Undiscovered, Unexplained, Unexplored, Unfamiliar, Unfilled, Unidentified, Unknown, Unnamed, Unredeemed, Unsung, Untold, Vacant, Vacated, Vanished, Veiled, Wayward, Warrior's, King's, Knave's, Coward's, Cardinal's, Priest's, Soldier's, Noble, Steadfast, Children's, Howling, Silent, Grinding, Dusty" + + customGroupB = "Temple, Chapel, House, Sanctuary, Shrine, Fortress, Tomb, Crypt, Graves, Citadel, Garrison, Rampart, Redoubt, Refuge, Asylum, Haven, Hideout, Retreat, Shelter, Stronghold, Covert, Den, Settlement, Preserve, Seat, Watch, Bulwark, Necropolis, Catacomb, Ruin, Hulk, Wreck" + + rules = "The_$A_$B" +} \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/README.md b/mods/dfcaverns/df_dependencies/README.md new file mode 100644 index 0000000..ae97313 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/README.md @@ -0,0 +1,5 @@ +The DF_Caverns modpack was originally written based on the minetest_game. It made extensive use of various nodes and helper functions that came from minetest_game's constituent mods. + +When Mineclone games rose in popularity, the task of making it compatible was a daunting one - there were dependencies on minetest_game's mods scattered everywhere. To make the task manageable, I created this mod to serve as a central location where analogous objects could be taken from those games to be referenced in a generic way. + +This requires abusing the "dependencies" system of Minetest, unfortunately. This mod is an enormous collection of either/or dependencies - things that can come from either mod A or mod B, but must come from one of them. \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/config.lua b/mods/dfcaverns/df_dependencies/config.lua new file mode 100644 index 0000000..f3a484f --- /dev/null +++ b/mods/dfcaverns/df_dependencies/config.lua @@ -0,0 +1,59 @@ +local CONFIG_FILE_PREFIX = "dfcaverns_" + +local config = {} +df_dependencies.config = config + + +local print_settingtypes = false + +local function setting(stype, name, default, description) + local value + if stype == "bool" then + value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default) + elseif stype == "string" then + value = minetest.settings:get(CONFIG_FILE_PREFIX..name) + elseif stype == "int" or stype == "float" then + value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + config[name] = value + + if print_settingtypes then + minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default)) + end +end + +--Caverns + +setting("float", "vertical_cavern_scale", 256, "Vertical cavern dimension scale") +setting("float", "horizontal_cavern_scale", 256, "Horizontal cavern dimension scale") +setting("float", "cavern_threshold", 0.5, "Cavern threshold") +setting("float", "sunless_sea_threshold", 0.4, "Cavern threshold for sunless seas (higher number means sparser caverns)") +setting("float", "tunnel_flooding_threshold", 0.25, "Threshold for flooding tunnels around flooded caverns") + +setting("int", "ymax", -193, "Upper limit of level 1") +setting("int", "level1_min", -832, "Upper limit of level 2") +setting("int", "level2_min", -1472, "Upper limit of level 3") +setting("int", "level3_min", -2112, "Upper limit of the sunless seas") +setting("int", "sunless_sea_min", -2512, "Lower limit of the sunless seas") + +setting("bool", "enable_oil_sea", true, "Enable oil sea") +config.enable_oil_sea = config.enable_oil_sea and minetest.get_modpath("oil") ~= nil +setting("int", "oil_sea_level", -2700, "Oil sea level") + +setting("bool", "enable_lava_sea", true, "Enable magma sea") +setting("int", "lava_sea_level", -2900, "Lava sea level") + +setting("bool", "enable_underworld", true, "Enable underworld") +config.enable_underworld = config.enable_underworld and minetest.get_modpath("df_underworld_items") ~= nil +setting("int", "underworld_level", -3200, "Underworld level") +setting("int", "underworld_glowing_pit_mapblocks", 8, "Average pit spacing measured in mapblocks") + +setting("bool", "enable_primordial", true, "Enable primordial cavern") +setting("int", "primordial_max", -3393, "Upper limit to primordial caverns") +setting("int", "primordial_min", -4032, "Lower limit to primordial caverns") + +setting("bool", "restrict_trees_to_biomes", false, "Restrict underground tree growth to their home biomes") +setting("bool", "restrict_farmables_to_biomes", false, "Restrict underground farmable plant growth to their home biomes") \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/fireflies.lua b/mods/dfcaverns/df_dependencies/fireflies.lua new file mode 100644 index 0000000..38ec608 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/fireflies.lua @@ -0,0 +1,187 @@ +-- firefly/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator(minetest.get_current_modname()) + +local bottle = df_dependencies.node_name_glass_bottle + +minetest.register_node("df_dependencies:firefly", { + description = S("Firefly"), + drawtype = "plantlike", + tiles = {{ + name = "fireflies_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1, destroy_by_lava_flow=1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "df_dependencies:firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "df_dependencies:hidden_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("df_dependencies:hidden_firefly", { + description = S("Hidden Firefly"), + drawtype = "airlike", + inventory_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + wield_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1, destroy_by_lava_flow=1}, + floodable = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "df_dependencies:hidden_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "df_dependencies:firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + + +-- bug net +minetest.register_tool("df_dependencies:bug_net", { + description = S("Bug Net"), + inventory_image = "fireflies_bugnet.png", + on_use = function(itemstack, player, pointed_thing) + local player_name = player and player:get_player_name() or "" + if not pointed_thing or pointed_thing.type ~= "node" or + minetest.is_protected(pointed_thing.under, player_name) then + return + end + local node_name = minetest.get_node(pointed_thing.under).name + local inv = player:get_inventory() + if minetest.get_item_group(node_name, "catchable") == 1 then + minetest.set_node(pointed_thing.under, {name = "air"}) + local stack = ItemStack(node_name.." 1") + local leftover = inv:add_item("main", stack) + if leftover:get_count() > 0 then + minetest.add_item(pointed_thing.under, node_name.." 1") + end + end + if not minetest.is_creative_enabled(player_name) then + itemstack:add_wear_by_uses(256) + return itemstack + end + end +}) + +minetest.register_craft( { + output = "df_dependencies:bug_net", + recipe = { + {df_dependencies.node_name_string, df_dependencies.node_name_string}, + {df_dependencies.node_name_string, df_dependencies.node_name_string}, + {"group:stick", ""} + } +}) + + +-- firefly in a bottle +minetest.register_node("df_dependencies:firefly_bottle", { + description = S("Firefly in a Bottle"), + inventory_image = "fireflies_bottle.png", + wield_image = "fireflies_bottle.png", + tiles = {{ + name = "fireflies_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + walkable = false, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, material_glass = 1, destroy_by_lava_flow=1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + sounds = df_dependencies.sound_glass(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local firefly_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + firefly_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + firefly_pos = lower_pos + end + + if firefly_pos then + minetest.add_item(pos, bottle) + minetest.set_node(pos, {name = "air"}) + minetest.set_node(firefly_pos, {name = "df_dependencies:firefly"}) + minetest.get_node_timer(firefly_pos):start(1) + end + end +}) + +minetest.register_craft( { + output = "df_dependencies:firefly_bottle", + type = "shapeless", + recipe = {"df_dependencies:firefly", bottle}, +}) diff --git a/mods/dfcaverns/df_dependencies/fireflies_license.txt b/mods/dfcaverns/df_dependencies/fireflies_license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/fireflies_license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/helper_functions.lua b/mods/dfcaverns/df_dependencies/helper_functions.lua new file mode 100644 index 0000000..ffc8bfa --- /dev/null +++ b/mods/dfcaverns/df_dependencies/helper_functions.lua @@ -0,0 +1,218 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +if minetest.get_modpath("default") then + df_dependencies.register_leafdecay = default.register_leafdecay + df_dependencies.after_place_leaves = default.after_place_leaves +elseif ("mcl_core") then + -- Mineclone does leaf decay differently, it uses the "leafdecay" group to require that leaves remain + -- within the group value distance of any node of group "tree". + -- make sure to add place_param2 = 1 to leaves to prevent decay of player-placed leaves + df_dependencies.register_leafdecay = function() end + df_dependencies.after_place_leaves = function() end +end + + +df_dependencies.mods_required.bucket = true +df_dependencies.mods_required.mcl_buckets = true +if minetest.get_modpath("bucket") then + df_dependencies.bucket_register_liquid = bucket.register_liquid +elseif minetest.get_modpath("mcl_buckets") then + df_dependencies.bucket_register_liquid = function(source_liquid, flowing_liquid, bucket_node, texture, desc) + mcl_buckets.register_liquid({ + bucketname = bucket_node, + source_take = {source_liquid}, + source_place = source_liquid, + inventory_image = texture, + name = desc}) + end +end + + +-- Note that a circular table reference will result in a crash, TODO: guard against that. +-- Unlikely to be needed, though - it'd take a lot of work for users to get into this bit of trouble. +local function deep_copy(table_in) + local table_out = {} + + for index, value in pairs(table_in) do + if type(value) == "table" then + table_out[index] = deep_copy(value) + else + table_out[index] = value + end + end + return table_out +end + +df_dependencies.mods_required.stairs = true +df_dependencies.mods_required.moreblocks = true +df_dependencies.mods_required.doors = true +df_dependencies.mods_required.mcl_stairs = true +df_dependencies.mods_required.mcl_fences = true +df_dependencies.mods_required.mcl_core = true + +local node_name_to_stair_properties = function(name, override_def) + local mod = minetest.get_current_modname() + + local node_def = minetest.registered_nodes[mod..":"..name] + override_def = override_def or {} + + local node_copy = deep_copy(node_def) + for index, value in pairs(override_def) do + node_copy[index] = value + end + return mod, node_copy +end + +df_dependencies.register_stairs = function(name, override_def) + local mod, node_copy = node_name_to_stair_properties(name, override_def) + if minetest.get_modpath("stairs") and stairs.register_stair_and_slab then + stairs.register_stair_and_slab( + name, + mod ..":" .. name, + node_copy.groups, + node_copy.tiles, + S("@1 Stair", node_copy.description), + S("@1 Slab", node_copy.description), + node_copy.sounds + ) + end + if minetest.get_modpath("mcl_stairs") and mcl_stairs.register_stair_and_slab_simple then + mcl_stairs.register_stair_and_slab_simple( + name, + mod ..":" .. name, + S("@1 Stair", node_copy.description), + S("@1 Slab", node_copy.description), + S("Double @1 Slab", node_copy.description) + ) + end +end + +df_dependencies.register_more_stairs = function(name, override_def) + local mod, node_copy = node_name_to_stair_properties(name, override_def) + if minetest.get_modpath("moreblocks") and stairsplus.register_all then + stairsplus:register_all(mod, name, mod..":"..name, node_copy) + end +end + +df_dependencies.register_all_fences = function (name, override_def) + local mod, node_def = node_name_to_stair_properties(name, override_def) + + override_def = override_def or {} + + local material = override_def.material or mod..":"..name + local burntime = override_def.burntime + local texture = override_def.texture or node_def.tiles[1] + + if minetest.get_modpath("default") then + if default.register_fence then + default.register_fence(material .. "_fence", { + description = S("@1 Fence", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + if burntime then + minetest.register_craft({ + type = "fuel", + recipe = material .. "_fence", + burntime = burntime, -- ignoring two sticks + }) + end + end + + if default.register_fence_rail then + default.register_fence_rail(material .. "_fence_rail", { + description = S("@1 Fence Rail", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence_rail function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + if burntime then + minetest.register_craft({ + type = "fuel", + recipe = material .. "_fence_rail", + burntime = burntime * 4/16, + }) + end + end + + if default.register_mesepost then + default.register_mesepost(material .. "_mese_light", { + description = S("@1 Mese Post Light", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence_rail function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + end + end + + if minetest.get_modpath("doors") and doors.register_fencegate then + doors.register_fencegate(material .. "_fence_gate", { + description = S("@1 Fence Gate", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence_rail function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + + if burntime then + minetest.register_craft({ + type = "fuel", + recipe = material .. "_fence_gate_closed", + burntime = burntime * 2, -- ignoring four sticks + }) + end + end + + if minetest.get_modpath("mcl_fences") and mcl_fences.register_fence_and_fence_gate then + local groups = deep_copy(node_def.groups or {}) + groups.fence_wood = 1 + mcl_fences.register_fence_and_fence_gate(name .. "_fence", + S("@1 Fence", node_def.description), + S("@1 Fence Gate", node_def.description), + texture, + groups, + node_def._mcl_hardness or minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + node_def._mcl_blast_resistance or minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + {"group:fence_wood"} + ) + end +end + +df_dependencies.register_all_stairs_and_fences = function(name, override_def) + df_dependencies.register_stairs(name, override_def) + df_dependencies.register_more_stairs(name, override_def) + df_dependencies.register_all_fences(name, override_def) +end + +df_dependencies.mods_required.tnt = true +df_dependencies.mods_required.mcl_explosions = true + +if minetest.get_modpath("tnt") then + df_dependencies.tnt_boom = tnt.boom +elseif minetest.get_modpath("mcl_explosions") then + df_dependencies.tnt_boom = function(pos, def) + local strength = def.radius * 5 + mcl_explosions.explode(pos, strength) + end +end + +df_dependencies.mods_required.mcl_formspec = true +df_dependencies.get_itemslot_bg = function(X,Y,W,H) return "" end +df_dependencies.get_itemslot_bg_padded = function(X,Y,W,H) return "" end +if minetest.get_modpath("mcl_formspec") then + df_dependencies.get_itemslot_bg = mcl_formspec.get_itemslot_bg + + df_dependencies.get_itemslot_bg_padded = function(x,y,w,h, padding) + local out = "" + for i = 0, w - 1, 1 do + for j = 0, h - 1, 1 do + out = out .. mcl_formspec.get_itemslot_bg(x+i+(i*padding), y+j+(j*padding), 1, 1) + end + end + return out + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/init.lua b/mods/dfcaverns/df_dependencies/init.lua new file mode 100644 index 0000000..b8cbc49 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/init.lua @@ -0,0 +1,55 @@ +df_dependencies = {} +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +df_dependencies.mods_required = {} + +df_dependencies.select_required = function(def) + local ret + for _, dependency in ipairs(def) do + local mod = dependency[1] + local item = dependency[2] + df_dependencies.mods_required[mod] = true + if minetest.get_modpath(mod) then + ret = item + end + end + assert(ret, "Unable to find item for dependency set " .. dump(def)) + return ret +end + +df_dependencies.select_optional = function(def) + local ret + for _, dependency in ipairs(def) do + local mod = dependency[1] + local item = dependency[2] + df_dependencies.mods_required[mod] = true + if minetest.get_modpath(mod) then + ret = item + end + end + return ret +end + +dofile(modpath.."/config.lua") +dofile(modpath.."/sounds.lua") +dofile(modpath.."/helper_functions.lua") +dofile(modpath.."/nodes.lua") +dofile(modpath.."/misc.lua") +dofile(modpath.."/mapgen.lua") + +local list_mods_required = function() + local mods_required = "" + local mods_sorted = {} + for mod, _ in pairs(df_dependencies.mods_required) do + table.insert(mods_sorted, mod) + end + table.sort(mods_sorted) + for _, mod in ipairs(mods_sorted) do + mods_required = mods_required .. ", " .. mod + end + minetest.debug(mods_required) +end +--list_mods_required() + +-- This mod is meant to only exist at initialization time. Other mods should make copies of anything it points to for their own use. +minetest.after(1, function() df_dependencies = nil end) diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.de.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.de.tr new file mode 100644 index 0000000..e4674a4 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.de.tr @@ -0,0 +1,27 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Insektennetz +# textdomain: fireflies +Firefly=Glühwürmchen +Firefly in a Bottle=Glühwürmchen in einer Flasche +Hidden Firefly=Verborgenes Glühwürmchen + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Slab=@1 Platte +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Stair=@1 Treppe +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.eo.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.eo.tr new file mode 100644 index 0000000..ec20c31 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.eo.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Insekta Reto +# textdomain: fireflies +Firefly=Lampiro +Firefly in a Bottle=Lampiro en Botelo +Hidden Firefly=Kaŝita Lampiro + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.es.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.es.tr new file mode 100644 index 0000000..ab86da8 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.es.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Red de insectos +# textdomain: fireflies +Firefly=Luciérnaga +Firefly in a Bottle=Luciérnaga en botella +Hidden Firefly=Luciérnaga oculta + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.fr.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.fr.tr new file mode 100644 index 0000000..1f3a4ff --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.fr.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Filet à papillon +# textdomain: fireflies +Firefly=Luciole +Firefly in a Bottle=Luciole en bouteille +Hidden Firefly=Luciole cachée + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.id.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.id.tr new file mode 100644 index 0000000..595d4a0 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.id.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Jaring Serangga +# textdomain: fireflies +Firefly=Kunang-Kunang +Firefly in a Bottle=Kunang-Kunang dalam Botol +Hidden Firefly=Kunang-Kunang Tersembunyi + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.it.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.it.tr new file mode 100644 index 0000000..d10fc23 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.it.tr @@ -0,0 +1,27 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Retino +# textdomain: fireflies +Firefly=Lucciola +Firefly in a Bottle=Lucciola imbottigliata +Hidden Firefly=Lucciola nascosta + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Slab=@1 Lastra +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Stair=@1 Scala +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap=Cappello del Nether diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.ja.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.ja.tr new file mode 100644 index 0000000..13c85e3 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.ja.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=虫取り網 +# textdomain: fireflies +Firefly=ホタル +Firefly in a Bottle=ホタルの入った瓶 +Hidden Firefly=隠されたホタル + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.jbo.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.jbo.tr new file mode 100644 index 0000000..39854d8 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.jbo.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=lo cinki julne +# textdomain: fireflies +Firefly=lo gusycinki +Firefly in a Bottle=lo gusycinki poi nenri lo botpi +Hidden Firefly=lo se mipri gusycinki + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.ms.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.ms.tr new file mode 100644 index 0000000..f19cd14 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.ms.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Jaring Pepijat +# textdomain: fireflies +Firefly=Kelip-Kelip +Firefly in a Bottle=Kelip-Kelip dalam Botol +Hidden Firefly=Kelip-Kelip Tersembunyi + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.pl.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.pl.tr new file mode 100644 index 0000000..f7f6118 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.pl.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Siatka na owady +# textdomain: fireflies +Firefly=Świetlik +Firefly in a Bottle=Świetlik w butelce +Hidden Firefly=Ukryty świetlik + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.pt_BR.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.pt_BR.tr new file mode 100644 index 0000000..ff7f09a --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.pt_BR.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Rede de Insetos +# textdomain: fireflies +Firefly=Vaga-lume +Firefly in a Bottle=Vaga-lume em uma garrafa +Hidden Firefly=Vaga-lume escondido + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.ru.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.ru.tr new file mode 100644 index 0000000..bc5897d --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.ru.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Сачок Для Ловли Насекомых +# textdomain: fireflies +Firefly=Светлячок +Firefly in a Bottle=Светлячок в Бутылке +Hidden Firefly=Притаившийся Светлячок + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.sk.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.sk.tr new file mode 100644 index 0000000..11fb58e --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.sk.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Sieťka na hmyz +# textdomain: fireflies +Firefly=Svetluška +Firefly in a Bottle=Svetluška vo fľaši +Hidden Firefly=Skrytá svetluška + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.sv.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.sv.tr new file mode 100644 index 0000000..181fbe5 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.sv.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Insektshåv +# textdomain: fireflies +Firefly=Eldfluga +Firefly in a Bottle=Eldfluga i en flaska +Hidden Firefly=Gömd eldfluga + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.uk.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.uk.tr new file mode 100644 index 0000000..d265c25 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.uk.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Сачок Для Ловлі Комах +# textdomain: fireflies +Firefly=Світлячок +Firefly in a Bottle=Світлячок у Пляшці +Hidden Firefly=Світлячок, що причаївся + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.zh_CN.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.zh_CN.tr new file mode 100644 index 0000000..5650f18 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.zh_CN.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=虫网 +# textdomain: fireflies +Firefly=萤火虫 +Firefly in a Bottle=放在瓶子里的萤火虫 +Hidden Firefly=隐藏的萤火虫 + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/df_dependencies.zh_TW.tr b/mods/dfcaverns/df_dependencies/locale/df_dependencies.zh_TW.tr new file mode 100644 index 0000000..ed83ca0 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/df_dependencies.zh_TW.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=蟲網 +# textdomain: fireflies +Firefly=螢火蟲 +Firefly in a Bottle=放在瓶子裡的螢火蟲 +Hidden Firefly=隱藏的螢火蟲 + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/locale/template.txt b/mods/dfcaverns/df_dependencies/locale/template.txt new file mode 100644 index 0000000..b89a4a4 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/locale/template.txt @@ -0,0 +1,24 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net= +Firefly= +Firefly in a Bottle= +Hidden Firefly= + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/mods/dfcaverns/df_dependencies/mapgen.lua b/mods/dfcaverns/df_dependencies/mapgen.lua new file mode 100644 index 0000000..131bc67 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/mapgen.lua @@ -0,0 +1,305 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local function deep_copy(table_in) + local table_out = {} + for index, value in pairs(table_in) do + if type(value) == "table" then + table_out[index] = deep_copy(value) + else + table_out[index] = value + end + end + return table_out +end + +local config = df_dependencies.config + +local lowest_elevation = config.sunless_sea_min +if config.enable_oil_sea then + lowest_elevation = config.oil_sea_level +end +if config.enable_lava_sea then + lowest_elevation = config.lava_sea_level +end +if config.enable_underworld then + lowest_elevation = config.underworld_level +end +if config.enable_primordial then + lowest_elevation = config.primordial_min +end +lowest_elevation = lowest_elevation - 193 -- add a little buffer space + +df_dependencies.mods_required.mcl_init = true +df_dependencies.mods_required.mcl_worlds = true +df_dependencies.mods_required.mcl_strongholds = true +df_dependencies.mods_required.mcl_compatibility = true +df_dependencies.mods_required.mcl_mapgen = true + +local old_overworld_min + +local ores_extended = false +local extend_ores = function() + if ores_extended then return end -- should only do this once. + ores_extended = true + local ores_registered = {} + for key, val in pairs(minetest.registered_ores) do + ores_registered[val.ore] = true + end + + local wherein_stonelike = {"mcl_core:stone"} + local localseed = 12345 + + local stone_blobs = { + wherein = wherein_stonelike, + clust_scarcity = 1000, + clust_size = 7, + y_min = lowest_elevation, + y_max = old_overworld_min, + ore_type = "blob", + clust_num_ores = 58, + noise_params = { + octaves = 3, + seed = 12345, + lacunarity = 2, + spread = { + y = 250, + x = 250, + z = 250 + }, + persist = 0.6, + flags = "defaults", + offset = 0, + scale = 1 + }, + } + + local register_blob = function(ore, cluster_size, cluster_scarcity_cuberoot, ymin, ymax) + localseed = localseed + 1 -- increment this every time it's called to ensure different distributions + local blob_copy = deep_copy(stone_blobs) + blob_copy.ore = ore + blob_copy.clust_num_ores = cluster_size + blob_copy.clust_size = math.ceil(math.sqrt(cluster_size)) + blob_copy.clust_scarcity = cluster_scarcity_cuberoot*cluster_scarcity_cuberoot*cluster_scarcity_cuberoot + blob_copy.seed = localseed + blob_copy.y_min = ymin or stone_blobs.y_min + blob_copy.y_max = ymax or stone_blobs.y_max + --minetest.debug(dump(blob_copy)) + minetest.register_ore(blob_copy) + end + + local scattered_ore = { + wherein = wherein_stonelike, + ore_type = "scatter", + --ore = "mcl_core:stone_with_coal", + clust_scarcity = 525*3, + clust_num_ores = 5, + clust_size = 3, + y_min = lowest_elevation, + y_max = old_overworld_min, + noise_params = deep_copy(stone_blobs.noise_params), -- since there's so much volume to scatter ore in, using noise to make some regions "rich" and others "poor" for variety + noise_threshold= 0, + } + + local register_scattered_internal = function(ore, cluster_size, cluster_scarcity_cuberoot, threshold, ymin, ymax, wherein) + local scattered_copy = deep_copy(scattered_ore) + scattered_copy.ore = ore + scattered_copy.clust_size = cluster_size*cluster_size*cluster_size + scattered_copy.clust_scarcity = cluster_scarcity_cuberoot*cluster_scarcity_cuberoot*cluster_scarcity_cuberoot + scattered_copy.clust_num_ores = math.ceil(scattered_copy.clust_size/3) + scattered_copy.seed = localseed + scattered_copy.threshold = threshold + scattered_copy.y_min = ymin or scattered_ore.y_min + scattered_copy.y_max = ymax or scattered_ore.y_max + scattered_copy.wherein = wherein or scattered_ore.wherein + --minetest.debug(dump(scattered_copy)) + minetest.register_ore(scattered_copy) + end + local register_scattered = function(ore, cluster_size, cluster_scarcity_cuberoot, ymin, ymax, wherein) + assert(not (ymin and ymax) or ymin < ymax, "Elevation parameter error for register_scattered") + localseed = localseed + 1 -- increment this every time it's called to ensure different distributions + -- same seed makes the noise patterns overlap. + -- one produces widespread smaller clusters, other produces larger clusters at the peaks of the noise in addition to the smaller ones + register_scattered_internal(ore, cluster_size, cluster_scarcity_cuberoot, 0, ymin, ymax, wherein) + register_scattered_internal(ore, cluster_size*2, cluster_scarcity_cuberoot, 0.25, ymin, ymax, wherein) + end + + if ores_registered["mcl_core:diorite"] then + register_blob("mcl_core:diorite", 58, 10) + register_blob("mcl_core:diorite", 33, 15) + table.insert(wherein_stonelike, "mcl_core:diorite") + end + if ores_registered["mcl_core:andesite"] then + register_blob("mcl_core:andesite", 58, 10) + register_blob("mcl_core:andesite", 33, 15) + table.insert(wherein_stonelike, "mcl_core:andesite") + end + if ores_registered["mcl_core:granite"] then + register_blob("mcl_core:granite", 58, 10) + register_blob("mcl_core:granite", 33, 15) + table.insert(wherein_stonelike, "mcl_core:granite") + end + if ores_registered["mcl_core:dirt"] then + register_blob("mcl_core:dirt", 33, 15, config.sunless_sea_min) + if config.enable_primordial then + register_blob("mcl_core:dirt", 33, 15, config.primordial_min, config.primoridal_max) + end + end + if ores_registered["mcl_core:gravel"] then + register_blob("mcl_core:gravel", 33, 14) + end + + if ores_registered["mcl_core:stone_with_iron"] then + register_scattered("mcl_core:stone_with_iron", 3, 12) + end + if ores_registered["mcl_core:stone_with_coal"] then + register_scattered("mcl_core:stone_with_coal", 3, 12) + if config.enable_oil_sea then + register_blob("mcl_core:stone_with_coal", 80, 10, config.oil_sea_level-200, config.oil_sea_level+200) -- tons of coal in the oil sea + end + end + + if ores_registered["mcl_core:stone_with_lapis"] then + register_scattered("mcl_core:stone_with_lapis", 3, 25, config.sunless_sea_min, config.level3_min) -- Lapis is an ocean gem, I decided + if config.enable_primordial then + register_scattered("mcl_core:stone_with_lapis", 3, 25, config.primordial_min, config.primordial_max) + end + end + + if ores_registered["mcl_core:stone_with_redstone"] then + register_scattered("mcl_core:stone_with_redstone", 3, 15, config.level3_min, config.level2_min) -- Level 3 is the most magical, scatter redstone there + if config.enable_lava_sea then + register_scattered("mcl_core:stone_with_redstone", 4, 15, config.lava_sea_level-200, config.lava_sea_level+100) -- and of course plenty of redstone in the lava sea + end + end + + if ores_registered["mcl_core:stone_with_diamond"] then + register_scattered("mcl_core:stone_with_diamond", 2, 18, config.sunless_sea_min, config.level2_min) + if config.enable_oil_sea then + register_scattered("mcl_core:stone_with_diamond", 3, 18, config.oil_sea_level-200, config.oil_sea_level+200) + end + if config.enable_primordial then + register_scattered("mcl_core:stone_with_diamond", 3, 15, config.primordial_min, config.primordial_max) + end + end + + if ores_registered["mcl_core:stone_with_gold"] then + register_scattered("mcl_core:stone_with_gold", 2, 18) + if config.enable_primordial then + register_scattered("mcl_core:stone_with_gold", 3, 15, config.primordial_min, config.primordial_max) + end + end + + if ores_registered["mcl_core:stone_with_copper"] then + register_scattered("mcl_core:stone_with_copper", 3, 18) + end + + if ores_registered["mcl_deepslate:deepslate"] then + register_blob("mcl_deepslate:deepslate", 33, 15, lowest_elevation, config.sunless_sea_min) -- it's called deepslate, so put it deep + end + if ores_registered["mcl_deepslate:tuff"] then + register_blob("mcl_deepslate:tuff", 33, 15, lowest_elevation, config.sunless_sea_min) + end + + if ores_registered["mcl_deepslate:deepslate_with_emerald"] then + register_scattered("mcl_deepslate:deepslate_with_emerald", 1, 25, lowest_elevation, config.sunless_sea_min, "mcl_deepslate:deepslate") + end + if ores_registered["mcl_core:stone_with_emerald"] then + register_scattered("mcl_core:stone_with_emerald", 1, 25, lowest_elevation, config.sunless_sea_min) + end + +end + +if minetest.get_modpath("mcl_init") then -- Mineclone 2 + + old_overworld_min = mcl_vars.mg_overworld_min -- remember this for weather control + + mcl_vars.mg_overworld_min = lowest_elevation + mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min + mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_overworld_min + 4 + mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min + 10 + mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 + mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max + mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max - 11 + + -- try to detect any variables that should have been modified but weren't + local bad_entries = {} + for k, v in pairs(mcl_vars) do + -- if a value is in this range, it's probably a new value added by MineClone2 that we should be adjusting, add it to the table + if type(v) == "number" and v <= old_overworld_min + 10 and v >= mcl_vars.mg_overworld_min + 100 then + bad_entries[k] = v + end + end + + -- mark variables as ignored that we intentionally don't change, like so: + -- bad_entries.mg_value_that_shouldnt_be_adjusted = nil + + for k, v in pairs(bad_entries) do + local new_value = v + mcl_vars.mg_overworld_min - old_overworld_min + minetest.log("error", "dfcaverns: variable wasn't modified or marked as ignored! guessing new value:") + minetest.log("error", "mcl_var." .. tostring(k) .. " = " .. tostring(new_value) .. " -- was " .. tostring(v)) + minetest.log("error", "if it shouldn't be changed, mark it as ignored in df_dependencies/mapgen.lua like so:") + minetest.log("error", "bad_entries." .. tostring(k) .. " = nil") + minetest.log("error", "This is a bug, please report it to https://github.com/FaceDeer/dfcaverns/issues/new") + mcl_vars[k] = new_value + end + + -- shouldn't need to worry about the setting, extend_ores checks if the ores + -- have already been registered. + --if minetest.settings:get_bool("mcl_generate_ores", true) then + extend_ores() + --end + + df_dependencies.mods_required.mcl_structures = true + -- never mind - add dependency on mcl_strongholds and these will get generated before overworld_min gets changed. + --if minetest.get_modpath("mcl_structures") and minetest.get_modpath("mcl_strongholds") then + -- local elevation_delta = old_overworld_min - lowest_elevation + -- local strongholds = mcl_structures.get_structure_data("stronghold") + -- mcl_structures.register_structure_data("stronghold", strongholds) + --end +end +if minetest.get_modpath("mcl_compatibility") then -- Mineclone 5 + old_overworld_min = mcl_vars.mg_overworld_min -- remember this for weather control + + mcl_vars.mg_overworld_min = lowest_elevation + mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min + mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_overworld_min+4 + mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min+6 + mcl_vars.mg_lava = false + mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 + mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max + mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max-11 +end +if minetest.get_modpath("mcl_mapgen") then -- Mineclone 5 + old_overworld_min = mcl_mapgen.overworld.min -- remember this for weather control + + mcl_mapgen.overworld.min = lowest_elevation + mcl_mapgen.overworld.bedrock_min = mcl_mapgen.overworld.min + mcl_mapgen.overworld.bedrock_max = mcl_mapgen.overworld.bedrock_min + (mcl_mapgen.bedrock_is_rough and 4 or 0) + mcl_mapgen.overworld.lava_max = mcl_mapgen.overworld.min+6 + mcl_mapgen.overworld.railcorridors_height_min = -50 + mcl_mapgen.overworld.railcorridors_height_max = -2 + + mcl_mapgen.end_.max = mcl_mapgen.overworld.min - 2000 + mcl_mapgen.realm_barrier_overworld_end_max = mcl_mapgen.end_.max + mcl_mapgen.realm_barrier_overworld_end_min = mcl_mapgen.end_.max - 11 + + if mcl_mapgen.on_settings_changed then + mcl_mapgen.on_settings_changed() + else + minetest.log("error", "The installed version of the mcl_mapgen mod (part of Mineclone 5) " + .."does not have an mcl_mapgen.on_settings_changed method. This will likely result in " + .."altitudes below the original bedrock being inaccessible to players.") + end + + extend_ores() +end +if minetest.get_modpath("mcl_worlds") then + local old_has_weather = mcl_worlds.has_weather + mcl_worlds.has_weather = function(pos) + -- No weather in the deep caverns + if pos.y >= lowest_elevation and pos.y <= old_overworld_min then + return false + end + return old_has_weather(pos) + end +end diff --git a/mods/dfcaverns/df_dependencies/misc.lua b/mods/dfcaverns/df_dependencies/misc.lua new file mode 100644 index 0000000..d298eb2 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/misc.lua @@ -0,0 +1,76 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local select_required = df_dependencies.select_required +local select_optional = df_dependencies.select_optional + +df_dependencies.mods_required.farming = true + +-- If the farming mod is installed, add the "straw" group to farming straw. +-- This way goblin caps just need to check for group:straw to get cave straw as well +local straw_def = minetest.registered_items["farming:straw"] +if straw_def then + local new_groups = {} + for group, val in pairs(straw_def.groups) do + new_groups[group] = val + end + new_groups.straw = 1 + minetest.override_item("farming:straw", { + groups = new_groups + }) +end + +-- used to determine colour of spindlestem caps +if minetest.get_modpath("default") then + df_dependencies.data_iron_containing_nodes = {"default:stone_with_iron", "default:steelblock"} + df_dependencies.data_copper_containing_nodes = {"default:stone_with_copper", "default:copperblock"} + df_dependencies.data_mese_containing_nodes = {"default:stone_with_mese", "default:mese"} +elseif minetest.get_modpath("mcl_core") then + df_dependencies.data_iron_containing_nodes = {} + minetest.after(0, function() + for nodename, _ in pairs(minetest.registered_nodes) do + if string.find(nodename, "iron") then + table.insert(df_dependencies.data_iron_containing_nodes, nodename) + end + end + end) + df_dependencies.data_copper_containing_nodes = {} + minetest.after(0, function() + for nodename, _ in pairs(minetest.registered_nodes) do + if string.find(nodename, "copper") then + table.insert(df_dependencies.data_copper_containing_nodes, nodename) + end + end + end) + df_dependencies.data_mese_containing_nodes = {"mcl_deepslate:deepslate_with_redstone", "mcl_deepslate:deepslate_with_redstone_lit", + "mcl_core:stone_with_redstone", "mcl_core:stone_with_redstone_lit", "group:mesecon_conductor_craftable", "group:mesecon", "group:mesecon_effector_off"} +end + +-- common nodes that can be found next to pit plasma, triggering matter degradation +-- don't trigger on air, that's for sparkle generation +df_dependencies.abm_pit_plasma_neighbors = {"group:stone", "group:lava", "group:water", "group:material_stone"} + +df_dependencies.texture_cobble = select_required({{"default", "default_cobble.png"}, {"mcl_core", "default_cobble.png"}}) +df_dependencies.texture_coral_skeleton = select_required({{"default", "default_coral_skeleton.png"}, {"mcl_ocean", "mcl_ocean_dead_horn_coral_block.png"}}) +df_dependencies.texture_dirt = select_required({{"default", "default_dirt.png"}, {"mcl_core", "default_dirt.png"}}) +df_dependencies.texture_gold_block = select_required({{"default", "default_gold_block.png"}, {"mcl_core", "default_gold_block.png"}}) +df_dependencies.texture_ice = select_required({{"default", "default_ice.png"}, {"mcl_core", "default_ice.png"}}) +df_dependencies.texture_sand = select_required({{"default", "default_sand.png"}, {"mcl_core", "default_sand.png"}}) +df_dependencies.texture_stone = select_required({{"default", "default_stone.png"}, {"mcl_core", "default_stone.png"}}) +df_dependencies.texture_wood = select_required({{"default", "default_wood.png"}, {"mcl_core", "default_wood.png"}}) +df_dependencies.texture_mineral_coal = select_required({{"default", "default_mineral_coal.png"}, {"mcl_core", "mcl_core_coal_ore.png"}}) -- MCL's coal texture isn't transparent, but is only used with gas seeps and should work fine that way +df_dependencies.texture_glass_bottle = select_required({{"vessels", "vessels_glass_bottle.png"}, {"mcl_potions", "mcl_potions_potion_bottle.png"}}) +df_dependencies.texture_meselamp = "dfcaverns_glow_mese.png" + +df_dependencies.texture_tool_steelhoe = select_required({{"default", "farming_tool_steelhoe.png"}, {"mcl_farming", "farming_tool_steelhoe.png"}}) +df_dependencies.texture_tool_steelpick = select_required({{"default", "default_tool_steelpick.png"}, {"mcl_farming", "default_tool_steelpick.png"}}) +df_dependencies.texture_tool_steelshovel = select_required({{"default", "default_tool_steelshovel.png"}, {"mcl_farming", "default_tool_steelshovel.png"}}) +df_dependencies.texture_farming_soil = select_required({{"default", "(default_dirt.png^farming_soil.png)"}, {"mcl_farming", "mcl_farming_farmland_dry.png"}}) + +df_dependencies.texture_mapping_kit = select_required({{"default", "map_mapping_kit.png"}, {"mcl_maps", "mcl_maps_map_filled.png"}}) + +df_dependencies.nethercap_name = S("Nethercap") +if minetest.get_modpath("mcl_mapgen_core") then + -- since there's a whole layer called the Nether in Mineclone and it has its own mushrooms, rename + -- nethercaps when that's present to avoid confusion. + df_dependencies.nethercap_name = S("Icecap") +end \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/mod.conf b/mods/dfcaverns/df_dependencies/mod.conf new file mode 100644 index 0000000..214684d --- /dev/null +++ b/mods/dfcaverns/df_dependencies/mod.conf @@ -0,0 +1,5 @@ +name = df_dependencies +description = A utility mod for df_caverns that gathers all dependencies on minetest_game in one place, to ease cross-compatibility efforts with Minetest Game, MineClone2 and MineClone5. +depends = +optional_depends = beds, bucket, default, doors, farming, fireflies, mcl_beds, mcl_buckets, mcl_chests, mcl_compatibility, mcl_copper, mcl_core, mcl_doors, mcl_explosions, mcl_farming, mcl_fences, mcl_formspec, mcl_furnaces, mcl_init, mcl_mapgen, mcl_maps, mcl_mobitems, mcl_ocean, mcl_potions, mcl_sounds, mcl_stairs, mcl_strongholds, mcl_tnt, mcl_torches, mcl_wool, mcl_worlds, mclx_core, mesecons, moreblocks, stairs, tnt, vessels, wool +supported_games = minetest_game, MineClone2 \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/nodes.lua b/mods/dfcaverns/df_dependencies/nodes.lua new file mode 100644 index 0000000..2372547 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/nodes.lua @@ -0,0 +1,126 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local required_nodes = {} +local function select_required(def) + local newdef = {} + for _, node in ipairs(def) do + table.insert(newdef, {string.match(node, "(.-):"), node}) + end + local ret = df_dependencies.select_required(newdef) + table.insert(required_nodes, ret) + return ret +end + +local function select_optional(def) + local newdef = {} + for _, node in ipairs(def) do + table.insert(newdef, {string.match(node, "(.-):"), node}) + end + local ret = df_dependencies.select_optional(newdef) + table.insert(required_nodes, ret) + return ret +end + + +minetest.after(0, function() + -- "after" needs to be used here because some of these nodes actually get registered in DF Caverns itself + -- stair nodes, for example, depend on the stairs mod but get registered from here. Kind of weird but + -- one goes to war with the mods one has. + local problem_nodes = {} + for _, node_name in pairs(required_nodes) do + if minetest.registered_items[node_name] == nil then + table.insert(problem_nodes, node_name) + end + end + + assert(#problem_nodes == 0, "Nodes " .. table.concat(problem_nodes, ", ") .. " were returned by a selection call but are not registered.") +end) + + +df_dependencies.node_name_apple = select_required({"default:apple", "mcl_core:apple"}) +df_dependencies.node_name_chest = select_required({"default:chest", "mcl_chests:chest"}) +df_dependencies.node_name_coalblock = select_required({"default:coalblock", "mcl_core:coalblock"}) +df_dependencies.node_name_coal_lump = select_required({"default:coal_lump", "mcl_core:coal_lump"}) +df_dependencies.node_name_cobble = select_required({"default:cobble", "mcl_core:cobble"}) +df_dependencies.node_name_coral_skeleton = select_required({"default:coral_skeleton", "mcl_ocean:dead_horn_coral_block"}) +df_dependencies.node_name_desert_sand = select_required({"default:desert_sand", "mcl_core:redsand"}) +df_dependencies.node_name_dirt = select_required({"default:dirt", "mcl_core:dirt"}) +df_dependencies.node_name_dry_grass_3 = select_required({"default:dry_grass_3", "mcl_core:deadbush"}) -- There doesn't seem to be an MCL equivalent of this +df_dependencies.node_name_dry_grass_4 = select_required({"default:dry_grass_4", "mcl_core:deadbush"}) -- There doesn't seem to be an MCL equivalent of this +df_dependencies.node_name_dry_shrub = select_required({"default:dry_shrub", "mcl_core:deadbush"}) +df_dependencies.node_name_furnace = select_required({"default:furnace", "mcl_furnaces:furnace"}) +df_dependencies.node_name_gold_ingot = select_required({"default:gold_ingot", "mcl_core:gold_ingot"}) +df_dependencies.node_name_gravel = select_required({"default:gravel", "mcl_core:gravel"}) +df_dependencies.node_name_ice = select_required({"default:ice", "mcl_core:ice"}) +df_dependencies.node_name_junglewood = select_required({"default:junglewood", "mcl_core:junglewood"}) +df_dependencies.node_name_lava_source = select_required({"default:lava_source", "mcl_core:lava_source"}) +df_dependencies.node_name_mese_crystal = select_required({"mesecons:wire_00000000_off", "default:mese_crystal"}) --make sure default:mese_crystal is second, so that default will take priority if mesecons is also installed. +df_dependencies.node_name_mossycobble = select_required({"default:mossycobble", "mcl_core:mossycobble"}) +df_dependencies.node_name_obsidian = select_required({"default:obsidian", "mcl_core:obsidian"}) +df_dependencies.node_name_paper = select_required({"default:paper", "mcl_core:paper"}) +df_dependencies.node_name_river_water_flowing = select_required({"default:river_water_flowing", "mclx_core:river_water_flowing"}) +df_dependencies.node_name_river_water_source = select_required({"default:river_water_source", "mclx_core:river_water_source"}) +df_dependencies.node_name_sand = select_required({"default:sand", "mcl_core:sand"}) +df_dependencies.node_name_silver_sand = select_required({"default:silver_sand", "mcl_core:sand"}) -- There doesn't seem to be an MCL equivalent of this +df_dependencies.node_name_snow = select_required({"default:snow", "mcl_core:snow"}) +df_dependencies.node_name_stone = select_required({"default:stone", "mcl_core:stone"}) +df_dependencies.node_name_stone_with_coal = select_required({"default:stone_with_coal", "mcl_core:stone_with_coal"}) +df_dependencies.node_name_stone_with_mese = select_required({"default:stone_with_mese", "mcl_core:stone_with_redstone"}) +df_dependencies.node_name_torch = select_required({"default:torch", "mcl_torches:torch"}) +df_dependencies.node_name_torch_wall = select_required({"default:torch_wall", "mcl_torches:torch_wall"}) +df_dependencies.node_name_water_flowing = select_required({"default:water_flowing", "mcl_core:water_flowing"}) +df_dependencies.node_name_water_source = select_required({"default:water_source", "mcl_core:water_source"}) +df_dependencies.node_name_stone_with_iron = select_required({"default:stone_with_iron", "mcl_core:stone_with_iron"}) +df_dependencies.node_name_steelblock = select_required({"default:steelblock", "mcl_core:ironblock"}) +df_dependencies.node_name_stone_with_copper = select_required({"default:stone_with_copper", "mcl_copper:stone_with_copper"}) +df_dependencies.node_name_copperblock = select_required({"default:copperblock", "mcl_copper:block_raw"}) + +df_dependencies.node_name_dirt_furrowed = select_required({"farming:soil", "mcl_farming:soil"}) +df_dependencies.node_name_dirt_wet = select_required({"farming:soil_wet", "mcl_farming:soil_wet"}) +--df_dependencies.node_name_mortar_pestle = select_optional({"farming:mortar_pestle"}) -- TODO where did this go? +df_dependencies.node_name_string = select_required({"farming:string", "mcl_mobitems:string"}) + +df_dependencies.node_name_bucket_empty = select_required({"bucket:bucket_empty", "mcl_buckets:bucket_empty"}) +df_dependencies.node_name_bucket_lava = select_required({"bucket:bucket_lava", "mcl_buckets:bucket_lava"}) + +-- from "wool" + +df_dependencies.node_name_wool_white = select_required({"wool:white", "mcl_wool:white"}) + +-- from "fireflies" +df_dependencies.node_name_fireflies = select_optional({"fireflies:firefly"}) + +-- from "vessels" +df_dependencies.node_name_glass_bottle = select_required({"vessels:glass_bottle", "mcl_potions:glass_bottle"}) +df_dependencies.node_name_shelf = select_optional({"vessels:shelf"}) + +-- from "beds" +df_dependencies.node_name_bed_bottom = select_required({"beds:bed_bottom", "mcl_beds:bed_red_bottom"}) +df_dependencies.node_name_bed_top = select_required({"beds:bed_top", "mcl_beds:bed_red_top"}) + +-- from "doors" +df_dependencies.node_name_door_wood_a = select_required({"doors:door_wood_a", "mcl_doors:wooden_door_b_1"}) +df_dependencies.node_name_door_hidden = select_required({"doors:hidden", "mcl_doors:wooden_door_t_1"}) + +-- from "stairs" + +df_dependencies.node_name_slab_goblin_cap_stem_wood = select_required({"stairs:slab_goblin_cap_stem_wood", "mcl_stairs:slab_goblin_cap_stem_wood"}) +df_dependencies.node_name_slab_slade_brick = select_required({"stairs:slab_slade_brick", "mcl_stairs:slab_slade_brick"}) +df_dependencies.node_name_stair_goblin_cap_stem_wood = select_required({"stairs:stair_goblin_cap_stem_wood", "mcl_stairs:stair_goblin_cap_stem_wood"}) +df_dependencies.node_name_stair_inner_slade_brick = select_required({"stairs:stair_inner_slade_brick", "mcl_stairs:stair_slade_brick_inner"}) +df_dependencies.node_name_stair_outer_slade_brick = select_required({"stairs:stair_outer_slade_brick", "mcl_stairs:stair_slade_brick_outer"}) +df_dependencies.node_name_stair_slade_block = select_required({"stairs:stair_slade_block", "mcl_stairs:stair_slade_block"}) +df_dependencies.node_name_slab_slade_block = select_required({"stairs:slab_slade_block", "mcl_stairs:slab_slade_block"}) +df_dependencies.node_name_stair_slade_brick = select_required({"stairs:stair_slade_brick", "mcl_stairs:stair_slade_brick"}) +df_dependencies.node_name_slab_slade_block_top = select_optional({"mcl_stairs:slab_slade_block_top"}) + +-- from "tnt" + +df_dependencies.node_name_gunpowder = select_optional({"tnt:gunpowder", "mcl_mobitems:gunpowder"}) + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +if not df_dependencies.node_name_fireflies then + dofile(modpath.."/fireflies.lua") + df_dependencies.node_name_fireflies = "df_dependencies:firefly" +end \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/settingtypes.txt b/mods/dfcaverns/df_dependencies/settingtypes.txt new file mode 100644 index 0000000..e7c5c95 --- /dev/null +++ b/mods/dfcaverns/df_dependencies/settingtypes.txt @@ -0,0 +1,81 @@ +[Cavern dimensions] + +#Note that this doesn't guarantee caverns of this setting's size. This setting +#affects the scale of features in the perlin noise that is used to build caverns. +#Most caverns will be smaller than this (and a few might be larger) +dfcaverns_vertical_cavern_scale (Vertical cavern dimension scale) float 256 +#Note that this doesn't guarantee caverns of this setting's size. This setting +#affects the scale of features in the perlin noise that is used to build caverns. +#Most caverns will be smaller than this (and a few might be larger) +dfcaverns_horizontal_cavern_scale (Horizontal cavern dimension scale) float 256 +#Determines threshold for cave generation. Higher number means sparser, smaller caverns +dfcaverns_cavern_threshold (Cavern threshold) float 0.5 0.0 1.0 +#Determines threshold for lower sea cave generation. Higher number means sparser, smaller caverns +dfcaverns_sunless_sea_threshold (Cavern threshold for sunless sea) float 0.4 0.0 1.0 +#Determines how far out water extends into tunnels below the 'sea level' of from flooded +#caverns. Lower numbers give more flooded tunnel. If this number equals the cavern +#threshold tunnels will not be flooded at all, if it is 0 then half the tunnels will be flooded. +dfcaverns_tunnel_flooding_threshold (Tunnel flooding threshold) float 0.25 0.0 1.0 + +[Cavern depth borders] + +#maximum boundary for cavern depths are most efficient when they fit the formula (x*80-32-1) +#where x is an integer. That way you don't get map blocks that straddle two cavern layers. +dfcaverns_ymax (Upper limit of level 1) int -193 +#minimum boundaries for cavern depths are most efficient when they fit the formula (x*80-32) +#where x is an integer. that way you don't get map blocks that straddle two cavern layers. +dfcaverns_level1_min (Upper limit of level 2) int -832 +dfcaverns_level2_min (Upper limit of level 3) int -1472 +dfcaverns_level3_min (Upper limit of the sunless sea) int -2112 +dfcaverns_sunless_sea_min (Lower limit of the sunless sea) int -2512 + +[Lower Levels] + +dfcaverns_enable_oil_sea (Generate oil sea) bool true +dfcaverns_oil_sea_level (Oil sea level) int -2700 + +dfcaverns_enable_lava_sea (Generate magma sea) bool true +dfcaverns_lava_sea_level (Lava sea level) int -2900 + +dfcaverns_enable_underworld (Generate underworld) bool true +dfcaverns_underworld_level (Underworld level) int -3200 +#Set this to 0 to disable glowing pit generation entirely. +dfcaverns_underworld_glowing_pit_mapblocks(Average pit spacing measured in mapblocks) int 8 + +[Underworld feature HUD] + +dfcaverns_underworld_hud_requires_item (Require an item to view waypoints) bool true +#Players can still discover the locations of volcanoes without this, but waypoints +#will only be visible in their hud if they have this item in their inventory. You can also +#specify "group:groupname" here. Leave it blank to default to map:mapping_kit. +dfcaverns_underworld_hud_item_required (Specify the item or group required) string map:mapping_kit + +dfcaverns_show_pits_in_hud (Show pit locations in HUD) bool true +dfcaverns_pit_discovery_range (Pit discovery range) int 60 +dfcaverns_pit_visibility_range (Pit visibility range) int 500 + +dfcaverns_show_seals_in_hud (Seal locations in HUD) bool true +dfcaverns_seal_discovery_range (Seal discovery range) int 10 +dfcaverns_seal_visibility_range (Seal visibility range) int 200 + +dfcaverns_show_ruins_in_hud (Ruin locations visible in HUD) bool true +dfcaverns_ruin_discovery_range (Ruin discovery range) int 40 +dfcaverns_ruin_visibility_range (Ruin visibility range) int 250 + +[Primordial] + +dfcaverns_enable_primordial (Generate primordial caverns) bool true +dfcaverns_primordial_max (Upper limit of primordial caverns) int -3393 +dfcaverns_primordial_min (Lower limit of primordial caverns) int -4032 + +# This setting is pretty technical, it spreads out the +# construction of giant mycelium networks on mapgen +# over this many seconds. If you're experiencing lag spikes +# during mapgen of Primordial cavern layer mushroom caverns +# then increasing this number may help. +dcaverns_giant_mycelium_timer_spread (Giant Mycelium mapgen timer spread) int 10 + +[Plant growth restrictions] + +dfcaverns_restrict_trees_to_biomes (Restrict underground tree growth to their home biomes) bool false +dfcaverns_restrict_farmables_to_biomes (Restrict underground farmable plant growth to their home biomes) bool false \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/sounds.lua b/mods/dfcaverns/df_dependencies/sounds.lua new file mode 100644 index 0000000..90ab2ad --- /dev/null +++ b/mods/dfcaverns/df_dependencies/sounds.lua @@ -0,0 +1,38 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local select_required = df_dependencies.select_required +local select_optional = df_dependencies.select_optional + +df_dependencies.mods_required.mcl_sounds = true + +if minetest.get_modpath("default") then + df_dependencies.sound_dirt = default.node_sound_dirt_defaults + df_dependencies.sound_glass = default.node_sound_glass_defaults + df_dependencies.sound_gravel = default.node_sound_gravel_defaults + df_dependencies.sound_leaves = default.node_sound_leaves_defaults + df_dependencies.sound_sand = default.node_sound_sand_defaults + df_dependencies.sound_stone = default.node_sound_stone_defaults + df_dependencies.sound_water = default.node_sound_water_defaults + df_dependencies.sound_wood = default.node_sound_wood_defaults +elseif minetest.get_modpath("mcl_sounds") then + df_dependencies.sound_dirt = mcl_sounds.node_sound_dirt_defaults + df_dependencies.sound_glass = mcl_sounds.node_sound_glass_defaults + df_dependencies.sound_gravel = function(table) + table = table or {} + table.footstep = table.footstep or {name="default_gravel_footstep", gain=0.45} + return mcl_sounds.node_sound_dirt_defaults(table) + end + df_dependencies.sound_leaves = mcl_sounds.node_sound_leaves_defaults + df_dependencies.sound_sand = mcl_sounds.node_sound_sand_defaults + df_dependencies.sound_stone = mcl_sounds.node_sound_stone_defaults + df_dependencies.sound_water = mcl_sounds.node_sound_water_defaults + df_dependencies.sound_wood = mcl_sounds.node_sound_wood_defaults +else + assert(false, "One of [default] or [mcl_sounds] must be active") +end + +df_dependencies.soundfile_grass_footstep = select_required({{"default", "default_grass_footstep"}, {"mcl_sounds", "default_grass_footstep"}}) +df_dependencies.soundfile_snow_footstep = select_required({{"default", "default_snow_footstep"}, {"mcl_sounds", "pedology_snow_soft_footstep"}}) +df_dependencies.soundfile_gravel_footstep = select_required({{"default", "default_gravel_footstep"}, {"mcl_sounds", "default_gravel_footstep"}}) +df_dependencies.soundfile_cool_lava = select_required({{"default", "default_cool_lava"}, {"mcl_sounds", "default_cool_lava"}}) +df_dependencies.soundfile_tnt_ignite = select_required({{"default", "tnt_ignite"}, {"mcl_tnt", "tnt_ignite"}}) \ No newline at end of file diff --git a/mods/dfcaverns/df_dependencies/textures/default_invisible_node_overlay.png b/mods/dfcaverns/df_dependencies/textures/default_invisible_node_overlay.png new file mode 100644 index 0000000..7fc8806 Binary files /dev/null and b/mods/dfcaverns/df_dependencies/textures/default_invisible_node_overlay.png differ diff --git a/mods/dfcaverns/df_dependencies/textures/fireflies_bottle.png b/mods/dfcaverns/df_dependencies/textures/fireflies_bottle.png new file mode 100644 index 0000000..ecca036 Binary files /dev/null and b/mods/dfcaverns/df_dependencies/textures/fireflies_bottle.png differ diff --git a/mods/dfcaverns/df_dependencies/textures/fireflies_bottle_animated.png b/mods/dfcaverns/df_dependencies/textures/fireflies_bottle_animated.png new file mode 100644 index 0000000..294ff97 Binary files /dev/null and b/mods/dfcaverns/df_dependencies/textures/fireflies_bottle_animated.png differ diff --git a/mods/dfcaverns/df_dependencies/textures/fireflies_bugnet.png b/mods/dfcaverns/df_dependencies/textures/fireflies_bugnet.png new file mode 100644 index 0000000..8ec3d33 Binary files /dev/null and b/mods/dfcaverns/df_dependencies/textures/fireflies_bugnet.png differ diff --git a/mods/dfcaverns/df_dependencies/textures/fireflies_firefly.png b/mods/dfcaverns/df_dependencies/textures/fireflies_firefly.png new file mode 100644 index 0000000..c086689 Binary files /dev/null and b/mods/dfcaverns/df_dependencies/textures/fireflies_firefly.png differ diff --git a/mods/dfcaverns/df_dependencies/textures/fireflies_firefly_animated.png b/mods/dfcaverns/df_dependencies/textures/fireflies_firefly_animated.png new file mode 100644 index 0000000..e6932e3 Binary files /dev/null and b/mods/dfcaverns/df_dependencies/textures/fireflies_firefly_animated.png differ diff --git a/mods/dfcaverns/df_farming/LICENSE.txt b/mods/dfcaverns/df_farming/LICENSE.txt new file mode 100644 index 0000000..11ce895 --- /dev/null +++ b/mods/dfcaverns/df_farming/LICENSE.txt @@ -0,0 +1,26 @@ +Dwarf Fortress is copyright 2018 by Tarn Adams. This mod uses no assets or other copyrighted materials from Dwarf Fortress. + +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/aliases.lua b/mods/dfcaverns/df_farming/aliases.lua new file mode 100644 index 0000000..63ba925 --- /dev/null +++ b/mods/dfcaverns/df_farming/aliases.lua @@ -0,0 +1,54 @@ +minetest.register_alias("dfcaverns:cave_wheat" , "df_farming:cave_wheat" ) +minetest.register_alias("dfcaverns:cave_flour" , "df_farming:cave_flour" ) +minetest.register_alias("dfcaverns:cave_bread" , "df_farming:cave_bread" ) +minetest.register_alias("dfcaverns:pig_tail_thread" , "df_farming:pig_tail_thread" ) +minetest.register_alias("dfcaverns:quarry_bush_leaves" , "df_farming:quarry_bush_leaves" ) +minetest.register_alias("dfcaverns:sweet_pods" , "df_farming:sweet_pods" ) +minetest.register_alias("dfcaverns:sugar" , "df_farming:sugar" ) +minetest.register_alias("dfcaverns:dead_fungus" , "df_farming:dead_fungus" ) +minetest.register_alias("dfcaverns:cavern_fungi" , "df_farming:cavern_fungi" ) +minetest.register_alias("dfcaverns:plump_helmet_spawn" , "df_farming:plump_helmet_spawn" ) +minetest.register_alias("dfcaverns:plump_helmet_1" , "df_farming:plump_helmet_1" ) +minetest.register_alias("dfcaverns:plump_helmet_2" , "df_farming:plump_helmet_2" ) +minetest.register_alias("dfcaverns:plump_helmet_3" , "df_farming:plump_helmet_3" ) +minetest.register_alias("dfcaverns:plump_helmet_4" , "df_farming:plump_helmet_4" ) +minetest.register_alias("dfcaverns:plump_helmet_4_picked", "df_farming:plump_helmet_4_picked") +minetest.register_alias("dfcaverns:cave_wheat_1" , "df_farming:cave_wheat_1" ) +minetest.register_alias("dfcaverns:cave_wheat_2" , "df_farming:cave_wheat_2" ) +minetest.register_alias("dfcaverns:cave_wheat_3" , "df_farming:cave_wheat_3" ) +minetest.register_alias("dfcaverns:cave_wheat_4" , "df_farming:cave_wheat_4" ) +minetest.register_alias("dfcaverns:cave_wheat_5" , "df_farming:cave_wheat_5" ) +minetest.register_alias("dfcaverns:cave_wheat_6" , "df_farming:cave_wheat_6" ) +minetest.register_alias("dfcaverns:cave_wheat_7" , "df_farming:cave_wheat_7" ) +minetest.register_alias("dfcaverns:cave_wheat_8" , "df_farming:cave_wheat_8" ) +minetest.register_alias("dfcaverns:cave_wheat_seed" , "df_farming:cave_wheat_seed" ) +minetest.register_alias("dfcaverns:dimple_cup_1" , "df_farming:dimple_cup_1" ) +minetest.register_alias("dfcaverns:dimple_cup_2" , "df_farming:dimple_cup_2" ) +minetest.register_alias("dfcaverns:dimple_cup_3" , "df_farming:dimple_cup_3" ) +minetest.register_alias("dfcaverns:dimple_cup_4" , "df_farming:dimple_cup_4" ) +minetest.register_alias("dfcaverns:dimple_cup_seed" , "df_farming:dimple_cup_seed" ) +minetest.register_alias("dfcaverns:pig_tail_1" , "df_farming:pig_tail_1" ) +minetest.register_alias("dfcaverns:pig_tail_2" , "df_farming:pig_tail_2" ) +minetest.register_alias("dfcaverns:pig_tail_3" , "df_farming:pig_tail_3" ) +minetest.register_alias("dfcaverns:pig_tail_4" , "df_farming:pig_tail_4" ) +minetest.register_alias("dfcaverns:pig_tail_5" , "df_farming:pig_tail_5" ) +minetest.register_alias("dfcaverns:pig_tail_6" , "df_farming:pig_tail_6" ) +minetest.register_alias("dfcaverns:pig_tail_7" , "df_farming:pig_tail_7" ) +minetest.register_alias("dfcaverns:pig_tail_8" , "df_farming:pig_tail_8" ) +minetest.register_alias("dfcaverns:pig_tail_seed" , "df_farming:pig_tail_seed" ) +minetest.register_alias("dfcaverns:quarry_bush_1" , "df_farming:quarry_bush_1" ) +minetest.register_alias("dfcaverns:quarry_bush_2" , "df_farming:quarry_bush_2" ) +minetest.register_alias("dfcaverns:quarry_bush_3" , "df_farming:quarry_bush_3" ) +minetest.register_alias("dfcaverns:quarry_bush_4" , "df_farming:quarry_bush_4" ) +minetest.register_alias("dfcaverns:quarry_bush_5" , "df_farming:quarry_bush_5" ) +minetest.register_alias("dfcaverns:quarry_bush_seed" , "df_farming:quarry_bush_seed" ) +minetest.register_alias("dfcaverns:sweet_pod_1" , "df_farming:sweet_pod_1" ) +minetest.register_alias("dfcaverns:sweet_pod_2" , "df_farming:sweet_pod_2" ) +minetest.register_alias("dfcaverns:sweet_pod_3" , "df_farming:sweet_pod_3" ) +minetest.register_alias("dfcaverns:sweet_pod_4" , "df_farming:sweet_pod_4" ) +minetest.register_alias("dfcaverns:sweet_pod_5" , "df_farming:sweet_pod_5" ) +minetest.register_alias("dfcaverns:sweet_pod_6" , "df_farming:sweet_pod_6" ) +minetest.register_alias("dfcaverns:sweet_pod_seed" , "df_farming:sweet_pod_seed" ) +minetest.register_alias("dfcaverns:dwarven_syrup_source" , "df_farming:dwarven_syrup_source" ) +minetest.register_alias("dfcaverns:dwarven_syrup_flowing", "df_farming:dwarven_syrup_flowing") +minetest.register_alias("dfcaverns:dwarven_syrup_bucket" , "df_farming:dwarven_syrup_bucket" ) \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/cave_wheat.lua b/mods/dfcaverns/df_farming/cave_wheat.lua new file mode 100644 index 0000000..3040c4a --- /dev/null +++ b/mods/dfcaverns/df_farming/cave_wheat.lua @@ -0,0 +1,235 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local wheat_grow_time = df_farming.config.plant_growth_time * df_farming.config.cave_wheat_delay_multiplier / 8 + +local register_cave_wheat = function(number) + local name = "df_farming:cave_wheat_"..tostring(number) + local def = { + description = S("Cave Wheat"), + _doc_items_longdesc = df_farming.doc.cave_wheat_desc, + _doc_items_usagehelp = df_farming.doc.cave_wheat_usage, + drawtype = "plantlike", + paramtype2 = "meshoptions", + place_param2 = 3, + tiles = {"dfcaverns_cave_wheat_"..tostring(number)..".png"}, + inventory_image = "dfcaverns_cave_wheat_"..tostring(number)..".png", + paramtype = "light", + walkable = false, + is_ground_content = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + 2*number/16, 8/16}, + }, + }, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, name, elapsed) + end, + + drop = { + max_items = 1, + items = { + { + items = {'df_farming:cave_wheat_seed 2', 'df_farming:cave_wheat'}, + rarity = 9-number, + }, + { + items = {'df_farming:cave_wheat_seed 1', 'df_farming:cave_wheat'}, + rarity = 9-number, + }, + { + items = {'df_farming:cave_wheat_seed'}, + rarity = 9-number, + }, + }, + }, + + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + } + + if number < 8 then + def._dfcaverns_next_stage_time = wheat_grow_time + def._dfcaverns_next_stage = "df_farming:cave_wheat_"..tostring(number+1) + end + + minetest.register_node(name, def) +end + +for i = 1,8 do + register_cave_wheat(i) +end + +local place_list = { + minetest.get_content_id("df_farming:cave_wheat_1"), + minetest.get_content_id("df_farming:cave_wheat_2"), + minetest.get_content_id("df_farming:cave_wheat_3"), + minetest.get_content_id("df_farming:cave_wheat_4"), + minetest.get_content_id("df_farming:cave_wheat_5"), + minetest.get_content_id("df_farming:cave_wheat_6"), + minetest.get_content_id("df_farming:cave_wheat_7"), + minetest.get_content_id("df_farming:cave_wheat_8"), +} +-- doesn't set the timer running, so plants placed by this method won't grow +df_farming.spawn_cave_wheat_vm = function(vi, area, data, param2_data) + data[vi] = place_list[math.random(1,8)] + param2_data[vi] = 3 +end + + +df_farming.register_seed( + "cave_wheat_seed", + S("Cave Wheat Seed"), + "dfcaverns_cave_wheat_seed.png", + "df_farming:cave_wheat_1", + wheat_grow_time, + df_farming.doc.cave_wheat_desc, + df_farming.doc.cave_wheat_usage) + +minetest.register_craftitem("df_farming:cave_wheat", { + description = S("Cave Wheat"), + _doc_items_longdesc = df_farming.doc.cave_wheat_desc, + _doc_items_usagehelp = df_farming.doc.cave_wheat_usage, + inventory_image = "dfcaverns_cave_wheat.png", + stack_max = 99, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:cave_wheat", + burntime = 2 +}) + +------------- +--- Flour and bread + +minetest.register_craftitem("df_farming:cave_flour", { + description = S("Cave Wheat Flour"), + _doc_items_longdesc = df_farming.doc.cave_flour_desc, + _doc_items_usagehelp = df_farming.doc.cave_flour_usage, + inventory_image = "dfcaverns_flour.png", + groups = {flammable = 1, dfcaverns_cookable = 1, food_flour = 1}, +}) + +minetest.register_craftitem("df_farming:cave_bread", { + description = S("Dwarven Bread"), + _doc_items_longdesc = df_farming.doc.cave_bread_desc, + _doc_items_usagehelp = df_farming.doc.cave_bread_usage, + inventory_image = "dfcaverns_prepared_food13x16.png", + sound = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}, + on_use = minetest.item_eat(5), + _hunger_ng = {satiates = 5}, + _mcl_saturation = 3, + groups = {flammable = 2, food = 5, eatable=5}, +}) + +local recipe_registered = false +if minetest.get_modpath("cottages") then + cottages.handmill_product["df_farming:cave_wheat"] = "df_farming:cave_flour"; + recipe_registered = true +end + +if minetest.registered_items[df_dependencies.node_name_mortar_pestle] ~= nil then + minetest.register_craft({ + type = "shapeless", + output = "df_farming:cave_flour", + recipe = { + "df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat", + "df_farming:cave_wheat", df_dependencies.node_name_mortar_pestle + }, + replacements = {{"group:food_mortar_pestle", df_dependencies.node_name_mortar_pestle}}, + }) + recipe_registered = true +end + +if not recipe_registered then + minetest.register_craft({ + type = "shapeless", + output = "df_farming:cave_flour", + recipe = {"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"} + }) +end + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "df_farming:cave_bread", + recipe = "df_farming:cave_flour" +}) + +-------- +-- Straw + +minetest.register_node("df_farming:cave_straw", { + description = S("Cave Straw"), + tiles = {"dfcaverns_cave_straw.png"}, + is_ground_content = false, + groups = {snappy=3, flammable=4, straw=1, handy=1,hoey=1, compostability=85, flammable=2, fire_encouragement=60, fire_flammability=20, building_block=1, fall_damage_add_percent=-80, enderman_takable=1}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +minetest.register_craft({ + output = "df_farming:cave_straw 3", + recipe = { + {"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"}, + {"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"}, + {"df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat"}, + } +}) + +minetest.register_craft({ + output = "df_farming:cave_wheat 3", + recipe = { + {"df_farming:cave_straw"}, + } +}) + + +--------- +-- Trample support + +if minetest.get_modpath("footprints") then + minetest.register_node("df_farming:wheat_trampled", { + description = S("Flattened Cave Wheat"), + tiles = {"dfcaverns_cave_wheat_flattened.png"}, + inventory_image = "dfcaverns_cave_wheat_flattened.png", + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + buildable_to = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5} + }, + }, + groups = {snappy = 3, flammable = 2, attached_node = 1, handy=1, hoey=1, compostability=85, fire_encouragement=60, fire_flammability=20, fall_damage_add_percent=-30, destroy_by_lava_flow=1,dig_by_piston=1}, + drop = "", + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + }) + + footprints.register_trample_node("df_farming:cave_wheat_5", { + trampled_node_name = "df_farming:wheat_trampled", + randomize_trampled_param2 = true, + }) + footprints.register_trample_node("df_farming:cave_wheat_6", { + trampled_node_name = "df_farming:wheat_trampled", + randomize_trampled_param2 = true, + }) + footprints.register_trample_node("df_farming:cave_wheat_7", { + trampled_node_name = "df_farming:wheat_trampled", + randomize_trampled_param2 = true, + }) + footprints.register_trample_node("df_farming:cave_wheat_8", { + trampled_node_name = "df_farming:wheat_trampled", + randomize_trampled_param2 = true, + }) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/config.lua b/mods/dfcaverns/df_farming/config.lua new file mode 100644 index 0000000..b0223cc --- /dev/null +++ b/mods/dfcaverns/df_farming/config.lua @@ -0,0 +1,43 @@ +local CONFIG_FILE_PREFIX = "dfcaverns_" + +df_farming.config = {} + +local print_settingtypes = false + +local function setting(stype, name, default, description) + local value + if stype == "bool" then + value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default) + elseif stype == "string" then + value = minetest.settings:get(CONFIG_FILE_PREFIX..name) + elseif stype == "int" or stype == "float" then + value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + df_farming.config[name] = value + + if print_settingtypes then + minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default)) + end +end + +local plants = { + {name="cave_wheat", delay_multiplier=1}, + {name="dimple_cup", delay_multiplier=3}, + {name="pig_tail", delay_multiplier=1}, + {name="plump_helmet", delay_multiplier=3}, + {name="quarry_bush", delay_multiplier=2}, + {name="sweet_pod", delay_multiplier=2}, +} + +--Plants + +setting("int", "plant_growth_time", 3600, "Base plant growth time") -- 60 minutes + +for _, plant in pairs(plants) do + setting("float", plant.name.."_delay_multiplier", plant.delay_multiplier, plant.name.." growth delay multiplier") +end + +setting("bool", "light_kills_fungus", true, "Light kills fungus") \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/cooking.lua b/mods/dfcaverns/df_farming/cooking.lua new file mode 100644 index 0000000..7cc625f --- /dev/null +++ b/mods/dfcaverns/df_farming/cooking.lua @@ -0,0 +1,124 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local bucket_empty = df_dependencies.node_name_bucket_empty + +local chomp = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}} +local crisp = {eat = {name = "df_farming_crisp_chew", gain = 1.0}} +local gummy = {eat = {name = "df_farming_gummy_chew", gain = 1.0}} +local mushy = {eat = {name = "df_farming_mushy_chew", gain = 1.0}} +local soft = {eat = {name = "df_farming_soft_chew", gain = 1.0}} + +local recipes = { +{recipe = {"df_farming:cave_flour", "df_farming:cave_wheat_seed"}, name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png", sound = crisp}, +{recipe = {"df_farming:cave_flour", "df_farming:cave_wheat_seed", "group:sugar"}, name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png", sound = mushy}, +{recipe = {"df_farming:cave_flour", "group:food_flour", "df_farming:cave_wheat_seed", "df_farming:plump_helmet_spawn"}, name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png", sound = mushy}, +{recipe = {"df_farming:cave_wheat_seed", "group:plump_helmet"}, name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png", sound = crisp}, +{recipe = {"df_farming:cave_wheat_seed", "df_farming:cave_wheat_seed", "group:sugar"}, name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png", sound = soft}, +{recipe = {"df_farming:cave_wheat_seed", "df_farming:cave_wheat_seed", "df_farming:pig_tail_seed", "df_farming:plump_helmet_spawn"}, name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png", sound = gummy}, +{recipe = {"df_farming:sweet_pod_seed", "group:food_flour"}, name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png", sound = mushy}, +{recipe = {"df_farming:sweet_pod_seed", "group:food_flour", "group:sugar"}, name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png", sound = mushy}, +{recipe = {"df_farming:sweet_pod_seed", "group:sugar", "group:food_flour", "df_farming:dwarven_syrup_bucket"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png", sound = soft}, +{recipe = {"df_farming:sugar", "group:food_flour"}, name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png", sound = crisp}, +{recipe = {"df_farming:sugar", "group:food_flour", "df_farming:quarry_bush_leaves"}, name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png", sound = chomp}, +{recipe = {"df_farming:sugar", "group:sugar", "group:food_flour", "group:food_flour"}, name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png", sound = crisp}, +{recipe = {"group:plump_helmet", "group:plump_helmet"}, name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png", sound = mushy}, +{recipe = {"group:plump_helmet", "group:plump_helmet", "df_farming:quarry_bush_leaves"}, name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png", sound = gummy}, +{recipe = {"group:plump_helmet", "group:food_flour", "df_farming:plump_helmet_spawn", "df_farming:quarry_bush_leaves"}, name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png", sound = mushy}, +{recipe = {"df_farming:plump_helmet_spawn", "group:plump_helmet"}, name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png", sound = gummy}, +{recipe = {"df_farming:plump_helmet_spawn", "df_farming:quarry_bush_seed", "group:plump_helmet"}, name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png", sound = soft}, +{recipe = {"df_farming:plump_helmet_spawn", "df_farming:plump_helmet_spawn", "group:plump_helmet", "group:plump_helmet"}, name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png", sound = gummy}, +{recipe = {"df_farming:quarry_bush_leaves", "df_farming:cave_bread"}, name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png", sound = soft}, +{recipe = {"df_farming:quarry_bush_leaves", "group:food_flour", "group:plump_helmet"}, name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png", sound = soft}, +{recipe = {"df_farming:quarry_bush_leaves", "group:plump_helmet", "group:plump_helmet", "group:plump_helmet"}, name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png", sound = chomp}, +{recipe = {"df_farming:quarry_bush_seed", "df_farming:cave_bread"}, name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png", sound = soft}, +{recipe = {"df_farming:quarry_bush_seed", "group:food_flour", "group:sugar"}, name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png", sound = chomp}, +{recipe = {"df_farming:quarry_bush_seed", "group:sugar", "df_farming:sweet_pod_seed", "group:food_flour"}, name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png", sound = soft}, +{recipe = {"df_farming:dimple_cup_seed", "group:food_flour"}, name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png", sound = crisp}, +{recipe = {"df_farming:dimple_cup_seed", "group:food_flour", "group:sugar"}, name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png", sound = chomp}, +{recipe = {"df_farming:dimple_cup_seed", "df_farming:sweet_pod_seed", "df_farming:quarry_bush_seed", "group:food_flour"}, name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png", sound = soft}, +{recipe = {"df_farming:pig_tail_seed", "df_farming:cave_bread"}, name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png", sound = soft}, +{recipe = {"df_farming:pig_tail_seed", "df_farming:pig_tail_seed", "df_farming:dwarven_syrup_bucket"}, name=S("Pig Tail Spore Tofu"), replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, image="dfcaverns_prepared_food30x16.png", sound = gummy}, +{recipe = {"df_farming:pig_tail_seed", "df_farming:sweet_pod_seed", "group:food_flour", "group:food_flour"}, name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png", sound = mushy}, +{recipe = {"df_farming:dwarven_syrup_bucket", "df_farming:dwarven_syrup_bucket"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}, {"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png", sound = gummy}, +{recipe = {"df_farming:dwarven_syrup_bucket", "group:sugar", "group:plump_helmet"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png", sound = gummy}, +{recipe = {"df_farming:dwarven_syrup_bucket", "group:food_flour", "group:sugar", "df_farming:quarry_bush_seed"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png", sound = mushy}, +} + +local complexity = {[2]={name="simple", value=4}, [3]={name="medium", value=6}, [4]={name="complex", value=8}} +local alias_items = {} + +-- validate the recipes. +for index1 = 1, table.getn(recipes)-1 do + for index2 = index1+1, table.getn(recipes) do + local recipe1 = recipes[index1].recipe + local recipe2 = recipes[index2].recipe + local recipe1count = {} + local recipe2count = {} + for _, item in pairs(recipe1) do + recipe1count[item] = (recipe1count[item] or 0) + 1 + end + for _, item in pairs(recipe2) do + recipe2count[item] = (recipe2count[item] or 0) + 1 + end + local identical = true + for key, val in pairs(recipe1count) do + if recipe2count[key] ~= val then + identical = false + break + end + end + for key, val in pairs(recipe2count) do + if recipe1count[key] ~= val then + identical = false + break + end + end + assert(not identical, "recipes " .. recipes[index1].name .. " and " .. recipes[index2].name .. " have identical ingredients!") + end +end +local ingredient_count = {} +--for _, recipe_entry in pairs(recipes) do +-- for _, item in pairs(recipe_entry.recipe) do +-- ingredient_count[item] = (ingredient_count[item] or 0) + 1 +-- end +--end +--minetest.debug(dump(ingredient_count)) + +for _, def in pairs(recipes) do + local recipe_type = complexity[table.getn(def.recipe)] + local _, item_name = string.match(def.recipe[1], "(.*):(.*)") + local output = "df_farming:"..item_name.."_"..recipe_type.name.."_meal" + alias_items[item_name] = true + + minetest.register_craftitem(output, { + description = def.name, + _doc_items_longdesc = df_farming.doc[recipe_type.name.."_meal_desc"], + _doc_items_usagehelp = df_farming.doc[recipe_type.name.."_meal_usage"], + inventory_image = def.image, + sound = def.sound, + on_use = minetest.item_eat(recipe_type.value), + groups = {food = recipe_type.value, eatable=recipe_type.value}, + _hunger_ng = {satiates = recipe_type.value}, + _mcl_saturation = recipe_type.value, -- TODO: make this more interesting + }) + + minetest.register_craft({ + type = "shapeless", + output = output, + recipe = def.recipe, + replacements = def.replacements + }) +end + +for item, _ in pairs(alias_items) do + minetest.register_alias("dfcaverns:"..item.."_biscuit", "df_farming:"..item.."_simple_meal") + minetest.register_alias("dfcaverns:"..item.."_stew", "df_farming:"..item.."_medium_meal") + minetest.register_alias("dfcaverns:"..item.."_roast", "df_farming:"..item.."_complex_meal") + minetest.register_alias("df_farming:"..item.."_biscuit", "df_farming:"..item.."_simple_meal") + minetest.register_alias("df_farming:"..item.."_stew", "df_farming:"..item.."_medium_meal") + minetest.register_alias("df_farming:"..item.."_roast", "df_farming:"..item.."_complex_meal") +end + + +-- dfcaverns_prepared_food28 is currently unused +-- dfcaverns_prepared_food13 is used for dwarven bread \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/dimple_cup.lua b/mods/dfcaverns/df_farming/dimple_cup.lua new file mode 100644 index 0000000..71adedd --- /dev/null +++ b/mods/dfcaverns/df_farming/dimple_cup.lua @@ -0,0 +1,116 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local dimple_grow_time = df_farming.config.plant_growth_time * df_farming.config.dimple_cup_delay_multiplier / 4 + +local dimple_cup_groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, flower = 1, fire_encouragement=60,fire_flammability=100, compostability=70, handy=1,shearsy=1,hoey=1} + +local register_dimple_cup = function(number) + local name = "df_farming:dimple_cup_"..tostring(number) + local def = { + description = S("Dimple Cup"), + _doc_items_longdesc = df_farming.doc.dimple_cup_desc, + _doc_items_usagehelp = df_farming.doc.dimple_cup_usage, + drawtype = "plantlike", + tiles = {"dfcaverns_dimple_cup_"..tostring(number)..".png"}, + inventory_image = "dfcaverns_dimple_cup_"..tostring(number)..".png", + paramtype = "light", + walkable = false, + floodable = true, + is_ground_content = false, + buildable_to = true, + groups = dimple_cup_groups, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + 4*number/16, 8/16}, + }, + }, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, name, elapsed) + end, + + drop = { + max_items = 1, + items = { + { + items = {'df_farming:dimple_cup_seed 2', 'df_farming:dimple_cup_harvested'}, + rarity = 7-number, + }, + { + items = {'df_farming:dimple_cup_seed 1', 'df_farming:dimple_cup_harvested'}, + rarity = 5-number, + }, + }, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + } + + if number < 4 then + def._dfcaverns_next_stage_time = dimple_grow_time + def._dfcaverns_next_stage = "df_farming:dimple_cup_"..tostring(number+1) + end + + minetest.register_node(name, def) +end + +for i = 1,4 do + register_dimple_cup(i) +end + +local dimple_cup_groups_harvested = {} +for group, val in pairs(dimple_cup_groups) do + dimple_cup_groups_harvested[group] = val +end +dimple_cup_groups_harvested.color_blue = 1 +dimple_cup_groups_harvested.basecolor_blue = 1 +dimple_cup_groups_harvested.excolor_blue = 1 + +local name = "df_farming:dimple_cup_harvested" +local def = { + description = S("Dimple Cup"), + _doc_items_longdesc = df_farming.doc.dimple_cup_desc, + _doc_items_usagehelp = df_farming.doc.dimple_cup_usage, + drawtype = "plantlike", + tiles = {"dfcaverns_dimple_cup_4.png"}, + inventory_image = "dfcaverns_dimple_cup_4.png", + paramtype = "light", + walkable = false, + floodable = true, + is_ground_content = false, + buildable_to = true, + groups = dimple_cup_groups_harvested, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + 4*4/16, 8/16}, + }, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +} +minetest.register_node(name, def) + +local place_list = { + minetest.get_content_id("df_farming:dimple_cup_1"), + minetest.get_content_id("df_farming:dimple_cup_2"), + minetest.get_content_id("df_farming:dimple_cup_3"), + minetest.get_content_id("df_farming:dimple_cup_4"), +} +-- doesn't set the timer running, so plants placed by this method won't grow +df_farming.spawn_dimple_cup_vm = function(vi, area, data, param2_data) + data[vi] = place_list[math.random(1,4)] + param2_data[vi] = 0 +end + +df_farming.register_seed( + "dimple_cup_seed", + S("Dimple Cup Spores"), + "dfcaverns_dimple_cup_seed.png", + "df_farming:dimple_cup_1", + dimple_grow_time, + df_farming.doc.dimple_cup_desc, + df_farming.doc.dimple_cup_usage) diff --git a/mods/dfcaverns/df_farming/doc.lua b/mods/dfcaverns/df_farming/doc.lua new file mode 100644 index 0000000..c7820eb --- /dev/null +++ b/mods/dfcaverns/df_farming/doc.lua @@ -0,0 +1,60 @@ +df_farming.doc = {} + +if not minetest.get_modpath("doc") then + return +end + +local S = minetest.get_translator(minetest.get_current_modname()) + +df_farming.doc.simple_meal_desc = S("A meal made from the admixture of two ingredients, it keeps well but are not a rich source of nutrients.") +df_farming.doc.simple_meal_usage = nil +df_farming.doc.medium_meal_desc = S("A meal made from three ingredients mixed together. They're more wholesome, packing more nutrition into a single serving.") +df_farming.doc.medium_meal_usage = nil +df_farming.doc.complex_meal_desc = S("Four finely minced ingredients combine into a fine, full meal.") +df_farming.doc.complex_meal_usage = nil + + +-- Plants + +df_farming.doc.dead_fungus_desc = S("Whatever this fungus was in life, it is now dead.") +df_farming.doc.dead_fungus_usage = S("Dead fungus quickly decays into an unrecognizable mess. It can be used as weak fuel or terrible decor.") + +df_farming.doc.cavern_fungi_desc = S("A species of lavender mushroom ubiquitous in caves that is most notable for the soft bioluminescence it produces.") +df_farming.doc.cavern_fungi_usage = S("This mushroom is inedible but continues producing modest levels of light long after it's picked.") + +df_farming.doc.cave_wheat_desc = S("Cave wheat is literally a breed of grain-producing grass that somehow lost its ability to photosynthesize and adapted to a more fungal style of life.") +df_farming.doc.cave_wheat_usage = S("Like its surface cousin, cave wheat produces grain that can be ground into a form of flour.") +df_farming.doc.cave_flour_desc = S("Cave wheat seed ground into a powder suitable for cooking.") +df_farming.doc.cave_flour_usage = S("When baked alone it forms an edible bread, but it combines well with other more flavorful ingredients.") +df_farming.doc.cave_bread_desc = S("Bread baked from cave wheat flour is tough and durable. A useful ration for long expeditions.") +df_farming.doc.cave_bread_usage = S("It's not tasty, but it keeps you going.") + +df_farming.doc.dimple_cup_desc = S("The distinctive midnight-blue caps of these mushrooms are inverted, exposing their gills to any breeze that might pass, and have dimpled edges that give them their name.") +df_farming.doc.dimple_cup_usage = S("Dimple cups can be dried, ground, and processed to extract a deep blue dye.") + +df_farming.doc.pig_tail_desc = S("Pig tails are a fibrous fungal growth that's most notable for its twisting stalks. In a mature stand of pig tails the helical stalks intertwine into a dense mesh.") +df_farming.doc.pig_tail_usage = S("Pig tail stalks can be processed to extract fibers useful as thread.") +df_farming.doc.pig_tail_thread_desc = S("Threads of pig tail fiber.") +df_farming.doc.pig_tail_thread_usage = S("A crafting item that can be woven into textiles and other similar items.") + +df_farming.doc.plump_helmet_desc = S("Plump helmets are a thick, fleshy mushroom that's edible picked straight from the ground. They form a staple diet for both lost cave explorers and the fauna that preys on them.") +df_farming.doc.plump_helmet_usage = S("While they can be eaten fresh, they can be monotonous fare and are perhaps better appreciated as part of a more complex prepared dish.") + +df_farming.doc.quarry_bush_desc = S("A rare breed of fungus from deep underground that produces a bushy cluster of rumpled gray 'blades'. The biological function of these blades is not known, as quarry bushes reproduce via hard-shelled nodules that grow down at the blade's base.") +df_farming.doc.quarry_bush_usage = S("Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are edible with processing.") +df_farming.doc.quarry_bush_leaves_desc = S("The dried blades of a quarry bush add a welcome zing to recipes containing otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten on their own.") +df_farming.doc.quarry_bush_leaves_usage = S("Quarry bush leaves can be used as an ingredient in foodstuffs.") + +df_farming.doc.sweet_pod_desc = S("Sweet pods grow in rich soil, and once they reach maturity they draw that supply of nutrients up to concentrate it in their fruiting bodies. They turn bright red when ripe and can be processed in a variety of ways to extract the sugars they contain.") + +if minetest.get_modpath("cottages") then + df_farming.doc.sweet_pod_usage = S("When milled, sweet pods produce a granular sugary substance.") +else + df_farming.doc.sweet_pod_usage = S("When dried in an oven, sweet pods produce a granular sugary substance.") +end +df_farming.doc.sweet_pod_usage = df_farming.doc.sweet_pod_usage .. " " .. S("Crushing them in a bucket squeezes out a flavorful syrup.") + +df_farming.doc.sweet_pod_sugar_desc = S("Sweet pod sugar has a pink tint to it.") +df_farming.doc.sweet_pod_sugar_usage = S("Too sweet to be eaten directly, it makes an excellent ingredient in food recipes.") +df_farming.doc.sweet_pod_syrup_desc = S("Sweet pod syrup is thick and flavorful.") +df_farming.doc.sweet_pod_syrup_usage = S("Too strong and thick to drink straight, sweet pod syrup is useful in food recipes.") diff --git a/mods/dfcaverns/df_farming/growth_conditions.lua b/mods/dfcaverns/df_farming/growth_conditions.lua new file mode 100644 index 0000000..c65d441 --- /dev/null +++ b/mods/dfcaverns/df_farming/growth_conditions.lua @@ -0,0 +1,13 @@ +df_farming.growth_permitted = {} + +local growable = {[df_dependencies.node_name_dirt_wet] = true, [df_dependencies.node_name_dirt] = true} +local check_farm_plant_soil = function(pos) + return growable[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name] +end + +df_farming.growth_permitted["df_farming:cave_wheat_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:dimple_cup_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:pig_tail_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:quarry_bush_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:sweet_pod_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:plump_helmet_spawn"] = check_farm_plant_soil \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/init.lua b/mods/dfcaverns/df_farming/init.lua new file mode 100644 index 0000000..5e96c59 --- /dev/null +++ b/mods/dfcaverns/df_farming/init.lua @@ -0,0 +1,19 @@ +df_farming = {} + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +--load companion lua files +dofile(modpath.."/config.lua") +dofile(modpath.."/doc.lua") +dofile(modpath.."/aliases.lua") + +dofile(modpath.."/plants.lua") -- general functions +dofile(modpath.."/cave_wheat.lua") +dofile(modpath.."/dimple_cup.lua") +dofile(modpath.."/pig_tail.lua") +dofile(modpath.."/plump_helmet.lua") +dofile(modpath.."/quarry_bush.lua") +dofile(modpath.."/sweet_pod.lua") +dofile(modpath.."/cooking.lua") +dofile(modpath.."/growth_conditions.lua") \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/locale/df_farming.de.tr b/mods/dfcaverns/df_farming/locale/df_farming.de.tr new file mode 100644 index 0000000..6d1bb5e --- /dev/null +++ b/mods/dfcaverns/df_farming/locale/df_farming.de.tr @@ -0,0 +1,234 @@ +# textdomain: df_farming + + +### cave_wheat.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Straw=Höhlenstroh +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat=Höhlenweizen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat Flour=Höhlenweizenmehl +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat Seed=Höhlenweizensamen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dwarven Bread=Zwergenbrot +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flattened Cave Wheat=Abgeflachter Höhlenweizen + +### cooking.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat Flour Biscuit=Höhlenweizenmehlkeks +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat Flour Bun=Höhlenweizenmehlbrötchen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat Flour Pancake=Höhlenweizenmehlpfannkuchen +Cave Wheat Seed Loaf= +Cave Wheat Seed Puffs= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Wheat Seed Risotto=Höhlenweizensamen-Risotto +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dimple Cup Spore Flatbread=Dimple Cup Spore Fladenbrot +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dimple Cup Spore Roll=Dimple Cup Sporenrolle +Dimple Cup Spore Scone= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dwarven Syrup Delight=Zwergensirup-Freude +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dwarven Syrup Jellies=Zwergsirupgelees +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dwarven Syrup Taffy=Zwergensirup Taffy +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig Tail Spore Casserole=Schweineschwanz-Sporenauflauf +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig Tail Spore Sandwich=Schweineschwanz-Sporensandwich +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig Tail Spore Tofu=Schweineschwanzsporentofu +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Mince=Pralles Helmhackfleisch +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Roast=Praller Helmbraten +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Spawn Jambalaya=Praller Helmlaich Jambalaya +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Spawn Soup=Pralle Helmlaichsuppe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Sprout Stew=Praller Helmsprosseneintopf +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Stalk Sausage=Pralle Helmstielwurst +Quarry Bush Leaf Croissant= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry Bush Leaf Spicy Bun=Steinbruch Bush Leaf Spicy Bun +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Rock Nut Bread=Steinnussbrot +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Rock Nut Cake=Steinnusskuchen +Rock Nut Cookie= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Stuffed Quarry Bush Leaf=Gefülltes Steinbruch-Buschblatt +Sweet Pod Spore Brule= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet Pod Spore Dumplings=Sweet Pod Sporenknödel +Sweet Pod Spore Single Crust Pie= +Sweet Pod Sugar Cookie= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet Pod Sugar Gingerbread=Sweet Pod Sugar Lebkuchen +Sweet Pod Sugar Roll= + +### dimple_cup.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dimple Cup=Grübchen Tasse +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dimple Cup Spores=Grübchen Cup Sporen + +### doc.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A crafting item that can be woven into textiles and other similar items.=Ein Handwerksgegenstand, der in Textilien und ähnliche Gegenstände eingewebt werden kann. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A meal made from the admixture of two ingredients, it keeps well but are not a rich source of nutrients.=Eine Mahlzeit, die aus der Beimischung von zwei Zutaten hergestellt wird. Sie ist gut haltbar, aber keine reichhaltige Nährstoffquelle. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A meal made from three ingredients mixed together. They're more wholesome, packing more nutrition into a single serving.=Eine Mahlzeit aus drei Zutaten gemischt. Sie sind gesünder und verpacken mehr Nahrung in einer einzigen Portion. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A rare breed of fungus from deep underground that produces a bushy cluster of rumpled gray 'blades'. The biological function of these blades is not known, as quarry bushes reproduce via hard-shelled nodules that grow down at the blade's base.=Eine seltene Pilzrasse aus dem tiefen Untergrund, die eine buschige Ansammlung zerknitterter grauer "Klingen" erzeugt. Die biologische Funktion dieser Klingen ist nicht bekannt, da sich Steinbruchbüsche über hartschalige Knötchen vermehren, die an der Klingenbasis nachwachsen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A species of lavender mushroom ubiquitous in caves that is most notable for the soft bioluminescence it produces.=Eine in Höhlen allgegenwärtige Lavendelpilzart, die sich vor allem durch ihre weiche Biolumineszenz auszeichnet. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Bread baked from cave wheat flour is tough and durable. A useful ration for long expeditions.=Aus Höhlenweizenmehl gebackenes Brot ist zäh und haltbar. Ein nützliches Verhältnis für lange Expeditionen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave wheat is literally a breed of grain-producing grass that somehow lost its ability to photosynthesize and adapted to a more fungal style of life.=Höhlenweizen ist buchstäblich eine Rasse von Getreide produzierendem Gras, das irgendwie seine Fähigkeit zur Photosynthese verloren hat und sich an einen eher pilzartigen Lebensstil anpasst. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave wheat seed ground into a powder suitable for cooking.=Den gemahlenen Weizensamen zu einem zum Kochen geeigneten Pulver aushöhlen. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Crushing them in a bucket squeezes out a flavorful syrup.=Wenn man sie in einem Eimer zerquetscht, wird ein aromatischer Sirup herausgedrückt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dead fungus quickly decays into an unrecognizable mess. It can be used as weak fuel or terrible decor.=Toter Pilz zerfällt schnell in ein nicht wiederzuerkennendes Chaos. Es kann als schwacher Kraftstoff oder schreckliches Dekor verwendet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dimple cups can be dried, ground, and processed to extract a deep blue dye.=Grübchenbecher können getrocknet, gemahlen und verarbeitet werden, um einen tiefblauen Farbstoff zu extrahieren. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Four finely minced ingredients combine into a fine, full meal.=Vier fein gehackte Zutaten ergeben eine feine, vollständige Mahlzeit. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +It's not tasty, but it keeps you going.=Es ist nicht lecker, aber es hält dich am Laufen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Like its surface cousin, cave wheat produces grain that can be ground into a form of flour.=Höhlenweizen produziert wie sein Cousin an der Oberfläche Getreide, das zu Mehl gemahlen werden kann. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig tail stalks can be processed to extract fibers useful as thread.=Schweineschwanzstiele können verarbeitet werden, um Fasern zu extrahieren, die als Faden nützlich sind. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig tails are a fibrous fungal growth that's most notable for its twisting stalks. In a mature stand of pig tails the helical stalks intertwine into a dense mesh.=Schweineschwänze sind ein faseriges Pilzwachstum, das sich vor allem durch seine verdrehten Stiele auszeichnet. In einem ausgewachsenen Schweineschwanzbestand verflechten sich die helikalen Stiele zu einem dichten Netz. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump helmets are a thick, fleshy mushroom that's edible picked straight from the ground. They form a staple diet for both lost cave explorers and the fauna that preys on them.=Pralle Helme sind dicke, fleischige Pilze, die essbar direkt vom Boden gepflückt werden. Sie bilden eine Grundnahrungsmittel sowohl für verlorene Höhlenforscher als auch für die Fauna, die ihnen nachjagt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are edible with processing.=Steinbruchbuschblätter und Knötchen (sogenannte Steinnüsse) können geerntet werden und sind bei der Verarbeitung essbar. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry bush leaves can be used as an ingredient in foodstuffs.=Steinbruch Buschblätter können als Zutat in Lebensmitteln verwendet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet pod sugar has a pink tint to it.=Süßer Schotenzucker hat eine rosa Tönung. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet pod syrup is thick and flavorful.=Süßer Schotensirup ist dick und aromatisch. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet pods grow in rich soil, and once they reach maturity they draw that supply of nutrients up to concentrate it in their fruiting bodies. They turn bright red when ripe and can be processed in a variety of ways to extract the sugars they contain.=Süße Schoten wachsen auf reichem Boden und sobald sie reif sind, ziehen sie diese Nährstoffversorgung auf, um sie in ihren Fruchtkörpern zu konzentrieren. Sie werden im reifen Zustand leuchtend rot und können auf verschiedene Weise verarbeitet werden, um den darin enthaltenen Zucker zu extrahieren. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The distinctive midnight-blue caps of these mushrooms are inverted, exposing their gills to any breeze that might pass, and have dimpled edges that give them their name.=Die markanten nachtblauen Kappen dieser Pilze sind umgedreht und setzen ihre Kiemen einer Brise aus, die vorbeiziehen könnte. Sie haben Noppenkanten, die ihnen ihren Namen geben. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The dried blades of a quarry bush add a welcome zing to recipes containing otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten on their own.=Die getrockneten Klingen eines Steinbruchstrauchs verleihen Rezepten mit ansonsten milden unterirdischen Lebensmitteln eine willkommene Note, aber sie sind zu scharf, um allein gegessen zu werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +This mushroom is inedible but continues producing modest levels of light long after it's picked.=Dieser Pilz ist ungenießbar, produziert aber noch lange nach seiner Ernte bescheidene Lichtmengen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Threads of pig tail fiber.=Fäden aus Schweineschwanzfaser. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Too strong and thick to drink straight, sweet pod syrup is useful in food recipes.=Zu stark und zu dick, um gerade zu trinken, ist süßer Schotensirup in Lebensmittelrezepten nützlich. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Too sweet to be eaten directly, it makes an excellent ingredient in food recipes.=Zu süß, um direkt gegessen zu werden, ist eine hervorragende Zutat für Lebensmittelrezepte. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Whatever this fungus was in life, it is now dead.=Was auch immer dieser Pilz im Leben war, er ist jetzt tot. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When baked alone it forms an edible bread, but it combines well with other more flavorful ingredients.=Wenn es alleine gebacken wird, bildet es ein essbares Brot, das sich jedoch gut mit anderen geschmackvolleren Zutaten kombinieren lässt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When dried in an oven, sweet pods produce a granular sugary substance.=Wenn süße Schoten im Ofen getrocknet werden, entsteht eine körnige zuckerhaltige Substanz. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When milled, sweet pods produce a granular sugary substance.=Süße Schoten produzieren beim Mahlen eine körnige zuckerhaltige Substanz. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +While they can be eaten fresh, they can be monotonous fare and are perhaps better appreciated as part of a more complex prepared dish.=Während sie frisch gegessen werden können, können sie eintönig sein und werden vielleicht besser als Teil eines komplexeren zubereiteten Gerichts geschätzt. + + +### pig_tail.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flattened Pig Tail=Abgeflachter Schweineschwanz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig Tail=Schweineschwanz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig Tail Spore=Schweineschwanzspore +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig tail thread=Schweineschwanzfaden + +### plants.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cavern Fungi=Höhlenpilze +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dead Fungus=Toter Pilz + +### plump_helmet.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet=Praller Helm +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump Helmet Spawn=Praller Helmlaich + +### quarry_bush.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry Bush=Steinbruch Bush +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry Bush Leaves=Steinbruch Bush Blätter +Rock Nuts= + +### sweet_pod.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dwarven Syrup Bucket=Zwergen-Sirup-Eimer +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dwarven Syrup Source=Zwergensirupquelle +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flowing Dwarven Syrup=Fließender Zwergensirup +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet Pod=Süße Schote +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet Pod Spores=Süße Schotensporen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet Pod Sugar=Süßer Schotenzucker +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet Pods=Süße Schoten diff --git a/mods/dfcaverns/df_farming/locale/df_farming.it.tr b/mods/dfcaverns/df_farming/locale/df_farming.it.tr new file mode 100644 index 0000000..e23a0f0 --- /dev/null +++ b/mods/dfcaverns/df_farming/locale/df_farming.it.tr @@ -0,0 +1,185 @@ +# textdomain: df_farming + + +### cave_wheat.lua ### + +Cave Straw=Grano di caverna +Cave Wheat=Grano di caverna +Cave Wheat Flour=Farina di grano di caverna +Cave Wheat Seed=Seme di grano di caverna +Dwarven Bread=Pane nanico +Flattened Cave Wheat=Grano di caverna + +### cooking.lua ### + +Cave Wheat Flour Biscuit=Farina di grano di caverna +Cave Wheat Flour Bun=Farina di grano di caverna +Cave Wheat Flour Pancake=Farina di grano di caverna +Cave Wheat Seed Loaf=Seme di grano di caverna +Cave Wheat Seed Puffs=Seme di grano di caverna +Cave Wheat Seed Risotto=Seme di grano di caverna +Dimple Cup Spore Flatbread=Spora di coppa increspata +Dimple Cup Spore Roll=Spora di coppa increspata +Dimple Cup Spore Scone=Spora di coppa increspata +Dwarven Syrup Delight=Secchio di sciroppo nanico +Dwarven Syrup Jellies=Sciroppo nanico +Dwarven Syrup Taffy=Sciroppo nanico +Pig Tail Spore Casserole=Spora di coda di maiale +Pig Tail Spore Sandwich=Spora di coda di maiale +Pig Tail Spore Tofu=Spora di coda di maiale +Plump Helmet Mince=Elmo rotondo +Plump Helmet Roast=Elmo rotondo +Plump Helmet Spawn Jambalaya=Prole di elmo rotondo +Plump Helmet Spawn Soup=Prole di elmo rotondo +Plump Helmet Sprout Stew=Prole di elmo rotondo +Plump Helmet Stalk Sausage=Prole di elmo rotondo +Quarry Bush Leaf Croissant=Foglia di cespuglio di cava +Quarry Bush Leaf Spicy Bun=Foglia di cespuglio di cava +Rock Nut Bread=Noce di roccia +Rock Nut Cake=Noce di roccia +Rock Nut Cookie=Noce di roccia +Stuffed Quarry Bush Leaf=Foglia di cespuglio di cava +Sweet Pod Spore Brule=Spora di baccello dolce +Sweet Pod Spore Dumplings=Spore di baccello dolce +Sweet Pod Spore Single Crust Pie=Spore di baccello dolce +Sweet Pod Sugar Cookie=Zucchero di baccello dolce +Sweet Pod Sugar Gingerbread=Zucchero di baccello dolce +Sweet Pod Sugar Roll=Zucchero di baccello dolce + +### dimple_cup.lua ### + +Dimple Cup=Coppa increspata +Dimple Cup Spores=Spore di coppa increspata + +### doc.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A crafting item that can be woven into textiles and other similar items.=Un oggetto di artigianato che può essere tessuto in tessuti e altri oggetti simili. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A meal made from the admixture of two ingredients, it keeps well but are not a rich source of nutrients.=Un pasto composto dalla miscela di due ingredienti, si conserva bene ma non è una ricca fonte di nutrienti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A meal made from three ingredients mixed together. They're more wholesome, packing more nutrition into a single serving.=Un pasto composto da tre ingredienti mescolati insieme. Sono più sani e contengono più nutrimento in una singola porzione. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A rare breed of fungus from deep underground that produces a bushy cluster of rumpled gray 'blades'. The biological function of these blades is not known, as quarry bushes reproduce via hard-shelled nodules that grow down at the blade's base.=Una rara razza di fungo proveniente dal sottosuolo profondo che produce un folto gruppo di "lame" grigie spiegazzate. La funzione biologica di queste lame non è nota, poiché i cespugli di cava si riproducono tramite noduli a guscio duro che crescono alla base della lama. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A species of lavender mushroom ubiquitous in caves that is most notable for the soft bioluminescence it produces.=Una specie di fungo lavanda onnipresente nelle grotte che è più notevole per la morbida bioluminescenza che produce. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Bread baked from cave wheat flour is tough and durable. A useful ration for long expeditions.=Il pane cotto dalla farina di grano di grotta è duro e durevole. Un rapporto utile per lunghe spedizioni. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave wheat is literally a breed of grain-producing grass that somehow lost its ability to photosynthesize and adapted to a more fungal style of life.=Il grano delle caverne è letteralmente una razza di erba che produce grano che in qualche modo ha perso la sua capacità di fotosintetizzare e adattata a uno stile di vita più fungino. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave wheat seed ground into a powder suitable for cooking.=Semi di grano di caverna macinati in una polvere adatta alla cottura. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Crushing them in a bucket squeezes out a flavorful syrup.=Schiacciandoli in un secchio spreme uno sciroppo saporito. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dead fungus quickly decays into an unrecognizable mess. It can be used as weak fuel or terrible decor.=Il fungo morto decade rapidamente in un pasticcio irriconoscibile. Può essere usato come combustibile debole o arredamento terribile. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dimple cups can be dried, ground, and processed to extract a deep blue dye.=Le coppe fossette possono essere asciugate, macinate e lavorate per estrarre un colorante blu intenso. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Four finely minced ingredients combine into a fine, full meal.=Quattro ingredienti finemente tritati si combinano in un fine pasto completo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +It's not tasty, but it keeps you going.=Non è gustoso, ma ti fa andare avanti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Like its surface cousin, cave wheat produces grain that can be ground into a form of flour.=Come il suo cugino di superficie, il grano delle caverne produce grano che può essere macinato in una forma di farina. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig tail stalks can be processed to extract fibers useful as thread.=Gli steli della coda di maiale possono essere lavorati per estrarre fibre utili come filo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pig tails are a fibrous fungal growth that's most notable for its twisting stalks. In a mature stand of pig tails the helical stalks intertwine into a dense mesh.=Le code di maiale sono una crescita fungina fibrosa che è più notevole per i suoi gambi contorti. In un gruppo maturo di code di maiale, gli steli elicoidali si intrecciano in una fitta rete. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Plump helmets are a thick, fleshy mushroom that's edible picked straight from the ground. They form a staple diet for both lost cave explorers and the fauna that preys on them.=I caschi paffuti sono un fungo spesso e carnoso che è commestibile raccolto direttamente da terra. Costituiscono una dieta base sia per gli esploratori di caverne perduti che per la fauna che li preda. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are edible with processing.=Le foglie ei noduli di arbusti di cava (chiamati "noci di roccia") possono essere raccolti e sono commestibili con la lavorazione. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Quarry bush leaves can be used as an ingredient in foodstuffs.=Le foglie di cespuglio di cava possono essere utilizzate come ingrediente nei prodotti alimentari. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet pod sugar has a pink tint to it.=Lo zucchero di baccello dolce ha una sfumatura rosa. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet pod syrup is thick and flavorful.=Lo sciroppo di baccello dolce è denso e saporito. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sweet pods grow in rich soil, and once they reach maturity they draw that supply of nutrients up to concentrate it in their fruiting bodies. They turn bright red when ripe and can be processed in a variety of ways to extract the sugars they contain.=I baccelli dolci crescono in un terreno fertile e, una volta raggiunta la maturità, assorbono quella scorta di sostanze nutritive per concentrarla nei loro corpi fruttiferi. Diventano di un rosso brillante quando sono maturi e possono essere lavorati in vari modi per estrarre gli zuccheri che contengono. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The distinctive midnight-blue caps of these mushrooms are inverted, exposing their gills to any breeze that might pass, and have dimpled edges that give them their name.=I caratteristici cappucci blu notte di questi funghi sono invertiti, esponendo le loro branchie a qualsiasi brezza che potrebbe passare, e hanno bordi increspati che danno loro il nome. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The dried blades of a quarry bush add a welcome zing to recipes containing otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten on their own.=Le lame essiccate di un cespuglio di cava aggiungono un tocco di benvenuto alle ricette che contengono cibi sotterranei altrimenti blandi, ma sono troppo piccanti per essere mangiati da soli. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +This mushroom is inedible but continues producing modest levels of light long after it's picked.=Questo fungo non è commestibile ma continua a produrre livelli modesti di luce molto tempo dopo essere stato raccolto. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Threads of pig tail fiber.=Fili di fibra di coda di maiale. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Too strong and thick to drink straight, sweet pod syrup is useful in food recipes.=Troppo forte e denso per essere bevuto liscio, lo sciroppo di baccelli dolce è utile nelle ricette alimentari. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Too sweet to be eaten directly, it makes an excellent ingredient in food recipes.=Troppo dolce per essere consumato direttamente, è un ottimo ingrediente nelle ricette alimentari. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Whatever this fungus was in life, it is now dead.=Qualunque cosa fosse questo fungo in vita, ora è morto. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When baked alone it forms an edible bread, but it combines well with other more flavorful ingredients.=Cotto da solo forma un pane commestibile, ma si abbina bene con altri ingredienti più saporiti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When dried in an oven, sweet pods produce a granular sugary substance.=Quando essiccati in un forno, i baccelli dolci producono una sostanza zuccherina granulare. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When milled, sweet pods produce a granular sugary substance.=Quando vengono macinati, i baccelli dolci producono una sostanza zuccherina granulare. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +While they can be eaten fresh, they can be monotonous fare and are perhaps better appreciated as part of a more complex prepared dish.=Sebbene possano essere consumati freschi, possono essere piatti monotoni e forse sono meglio apprezzati come parte di un piatto preparato più complesso. + + +### pig_tail.lua ### + +Flattened Pig Tail=Coda di maiale +Pig Tail=Coda di maiale +Pig Tail Spore=Spora di coda di maiale +Pig tail thread=Filo di coda di maiale + +### plants.lua ### + +Cavern Fungi=Funghi di caverna +Dead Fungus=Fungo morto + +### plump_helmet.lua ### + +Plump Helmet=Elmo rotondo +Plump Helmet Spawn=Prole di elmo rotondo + +### quarry_bush.lua ### + +Quarry Bush=Cespuglio di cava +Quarry Bush Leaves=Foglie di cespuglio di cava +Rock Nuts=Noci di roccia + +### sweet_pod.lua ### + +Dwarven Syrup Bucket=Secchio di sciroppo nanico +Dwarven Syrup Source=Fonte di sciroppo nanico +Flowing Dwarven Syrup=Sciroppo nanico che scorre +Sweet Pod=Baccello dolce +Sweet Pod Spores=Spore di baccello dolce +Sweet Pod Sugar=Zucchero di baccello dolce +Sweet Pods=Baccelli dolci diff --git a/mods/dfcaverns/df_farming/locale/template.txt b/mods/dfcaverns/df_farming/locale/template.txt new file mode 100644 index 0000000..58a3271 --- /dev/null +++ b/mods/dfcaverns/df_farming/locale/template.txt @@ -0,0 +1,152 @@ +# textdomain: df_farming + + +### cave_wheat.lua ### + +Cave Straw= +Cave Wheat= +Cave Wheat Flour= +Cave Wheat Seed= +Dwarven Bread= +Flattened Cave Wheat= + +### cooking.lua ### + +Cave Wheat Flour Biscuit= +Cave Wheat Flour Bun= +Cave Wheat Flour Pancake= +Cave Wheat Seed Loaf= +Cave Wheat Seed Puffs= +Cave Wheat Seed Risotto= +Dimple Cup Spore Flatbread= +Dimple Cup Spore Roll= +Dimple Cup Spore Scone= +Dwarven Syrup Delight= +Dwarven Syrup Jellies= +Dwarven Syrup Taffy= +Pig Tail Spore Casserole= +Pig Tail Spore Sandwich= +Pig Tail Spore Tofu= +Plump Helmet Mince= +Plump Helmet Roast= +Plump Helmet Spawn Jambalaya= +Plump Helmet Spawn Soup= +Plump Helmet Sprout Stew= +Plump Helmet Stalk Sausage= +Quarry Bush Leaf Croissant= +Quarry Bush Leaf Spicy Bun= +Rock Nut Bread= +Rock Nut Cake= +Rock Nut Cookie= +Stuffed Quarry Bush Leaf= +Sweet Pod Spore Brule= +Sweet Pod Spore Dumplings= +Sweet Pod Spore Single Crust Pie= +Sweet Pod Sugar Cookie= +Sweet Pod Sugar Gingerbread= +Sweet Pod Sugar Roll= + +### dimple_cup.lua ### + +Dimple Cup= +Dimple Cup Spores= + +### doc.lua ### + +A crafting item that can be woven into textiles and other similar items.= + +A meal made from the admixture of two ingredients, it keeps well but are not a rich source of nutrients.= + +A meal made from three ingredients mixed together. They're more wholesome, packing more nutrition into a single serving.= + +A rare breed of fungus from deep underground that produces a bushy cluster of rumpled gray 'blades'. The biological function of these blades is not known, as quarry bushes reproduce via hard-shelled nodules that grow down at the blade's base.= + +A species of lavender mushroom ubiquitous in caves that is most notable for the soft bioluminescence it produces.= + +Bread baked from cave wheat flour is tough and durable. A useful ration for long expeditions.= + +Cave wheat is literally a breed of grain-producing grass that somehow lost its ability to photosynthesize and adapted to a more fungal style of life.= + +Cave wheat seed ground into a powder suitable for cooking.= +Crushing them in a bucket squeezes out a flavorful syrup.= + +Dead fungus quickly decays into an unrecognizable mess. It can be used as weak fuel or terrible decor.= + +Dimple cups can be dried, ground, and processed to extract a deep blue dye.= + +Four finely minced ingredients combine into a fine, full meal.= + +It's not tasty, but it keeps you going.= + +Like its surface cousin, cave wheat produces grain that can be ground into a form of flour.= + +Pig tail stalks can be processed to extract fibers useful as thread.= + +Pig tails are a fibrous fungal growth that's most notable for its twisting stalks. In a mature stand of pig tails the helical stalks intertwine into a dense mesh.= + +Plump helmets are a thick, fleshy mushroom that's edible picked straight from the ground. They form a staple diet for both lost cave explorers and the fauna that preys on them.= + +Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are edible with processing.= + +Quarry bush leaves can be used as an ingredient in foodstuffs.= + +Sweet pod sugar has a pink tint to it.= +Sweet pod syrup is thick and flavorful.= + +Sweet pods grow in rich soil, and once they reach maturity they draw that supply of nutrients up to concentrate it in their fruiting bodies. They turn bright red when ripe and can be processed in a variety of ways to extract the sugars they contain.= + +The distinctive midnight-blue caps of these mushrooms are inverted, exposing their gills to any breeze that might pass, and have dimpled edges that give them their name.= + +The dried blades of a quarry bush add a welcome zing to recipes containing otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten on their own.= + +This mushroom is inedible but continues producing modest levels of light long after it's picked.= + +Threads of pig tail fiber.= + +Too strong and thick to drink straight, sweet pod syrup is useful in food recipes.= + +Too sweet to be eaten directly, it makes an excellent ingredient in food recipes.= + +Whatever this fungus was in life, it is now dead.= + +When baked alone it forms an edible bread, but it combines well with other more flavorful ingredients.= + +When dried in an oven, sweet pods produce a granular sugary substance.= + +When milled, sweet pods produce a granular sugary substance.= + +While they can be eaten fresh, they can be monotonous fare and are perhaps better appreciated as part of a more complex prepared dish.= + + +### pig_tail.lua ### + +Flattened Pig Tail= +Pig Tail= +Pig Tail Spore= +Pig tail thread= + +### plants.lua ### + +Cavern Fungi= +Dead Fungus= + +### plump_helmet.lua ### + +Plump Helmet= +Plump Helmet Spawn= + +### quarry_bush.lua ### + +Quarry Bush= +Quarry Bush Leaves= +Rock Nuts= + +### sweet_pod.lua ### + +Dwarven Syrup Bucket= +Dwarven Syrup Source= +Flowing Dwarven Syrup= +Sweet Pod= +Sweet Pod Spores= +Sweet Pod Sugar= +Sweet Pods= diff --git a/mods/dfcaverns/df_farming/mod.conf b/mods/dfcaverns/df_farming/mod.conf new file mode 100644 index 0000000..39c296a --- /dev/null +++ b/mods/dfcaverns/df_farming/mod.conf @@ -0,0 +1,4 @@ +name = df_farming +description = Adds farmable underground plants that die in sunlight. Also includes various cooking reactions. +depends = df_dependencies +optional_depends = cottages, dynamic_liquid, doc, crafting, footprints, oil diff --git a/mods/dfcaverns/df_farming/pig_tail.lua b/mods/dfcaverns/df_farming/pig_tail.lua new file mode 100644 index 0000000..d5dcc62 --- /dev/null +++ b/mods/dfcaverns/df_farming/pig_tail.lua @@ -0,0 +1,163 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local pig_tail_grow_time = df_farming.config.plant_growth_time * df_farming.config.pig_tail_delay_multiplier / 8 + +local register_pig_tail = function(number) + local name = "df_farming:pig_tail_"..tostring(number) + local def = { + description = S("Pig Tail"), + _doc_items_longdesc = df_farming.doc.pig_tail_desc, + _doc_items_usagehelp = df_farming.doc.pig_tail_usage, + drawtype = "plantlike", + paramtype2 = "meshoptions", + place_param2 = 3, + tiles = {"dfcaverns_pig_tail_"..tostring(number)..".png"}, + inventory_image = "dfcaverns_pig_tail_"..tostring(number)..".png", + paramtype = "light", + walkable = false, + is_ground_content = false, + floodable = true, + buildable_to = true, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, fire_encouragement=60,fire_flammability=100, compostability=70, handy=1,shearsy=1,hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + 2*number/16, 8/16}, + }, + }, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, name, elapsed) + end, + + drop = { + max_items = 1, + items = { + { + items = {'df_farming:pig_tail_seed 2', 'df_farming:pig_tail_thread 3'}, + rarity = 9-number, + }, + { + items = {'df_farming:pig_tail_seed 1', 'df_farming:pig_tail_thread 2'}, + rarity = 9-number, + }, + { + items = {'df_farming:pig_tail_seed'}, + rarity = 9-number, + }, + }, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + } + + if number < 8 then + def._dfcaverns_next_stage_time = pig_tail_grow_time + def._dfcaverns_next_stage = "df_farming:pig_tail_"..tostring(number+1) + end + + minetest.register_node(name, def) +end + +for i = 1,8 do + register_pig_tail(i) +end + +local place_list = { + minetest.get_content_id("df_farming:pig_tail_1"), + minetest.get_content_id("df_farming:pig_tail_2"), + minetest.get_content_id("df_farming:pig_tail_3"), + minetest.get_content_id("df_farming:pig_tail_4"), + minetest.get_content_id("df_farming:pig_tail_5"), + minetest.get_content_id("df_farming:pig_tail_6"), + minetest.get_content_id("df_farming:pig_tail_7"), + minetest.get_content_id("df_farming:pig_tail_8"), +} +-- doesn't set the timer running, so plants placed by this method won't grow +df_farming.spawn_pig_tail_vm = function(vi, area, data, param2_data) + data[vi] = place_list[math.random(1,8)] + param2_data[vi] = 3 +end + +df_farming.register_seed( + "pig_tail_seed", + S("Pig Tail Spore"), + "dfcaverns_pig_tail_seed.png", + "df_farming:pig_tail_1", + pig_tail_grow_time, + df_farming.doc.pig_tail_desc, + df_farming.doc.pig_tail_usage) + +minetest.register_craftitem("df_farming:pig_tail_thread", { + description = S("Pig tail thread"), + _doc_items_longdesc = df_farming.doc.pig_tail_thread_desc, + _doc_items_usagehelp = df_farming.doc.pig_tail_thread_usage, + inventory_image = "dfcaverns_pig_tail_thread.png", + groups = {flammable = 1, thread = 1}, +}) + +if df_dependencies.node_name_wool_white then + minetest.register_craft({ + output = df_dependencies.node_name_wool_white, + recipe = { + {"group:thread", "group:thread"}, + {"group:thread", "group:thread"}, + } + }) +end +if df_dependencies.node_name_string then + minetest.register_craft({ + output = df_dependencies.node_name_string .. " 2", + recipe = { + {"group:thread"}, + {"group:thread"}, + } + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:pig_tail_thread", + burntime = 1, +}) + +if minetest.get_modpath("footprints") then + minetest.register_node("df_farming:pig_tail_trampled", { + description = S("Flattened Pig Tail"), + tiles = {"dfcaverns_pig_tail_flattened.png"}, + inventory_image = "dfcaverns_pig_tail_flattened.png", + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + buildable_to = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5} + }, + }, + groups = {snappy = 3, flammable = 2, attached_node = 1, handy=1, hoey=1, compostability=85, fire_encouragement=60, fire_flammability=20, fall_damage_add_percent=-30, destroy_by_lava_flow=1,dig_by_piston=1}, + drop = "", + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + }) + + footprints.register_trample_node("df_farming:pig_tail_5", { + trampled_node_name = "df_farming:pig_tail_trampled", + randomize_trampled_param2 = true, + }) + footprints.register_trample_node("df_farming:pig_tail_6", { + trampled_node_name = "df_farming:pig_tail_trampled", + randomize_trampled_param2 = true, + }) + footprints.register_trample_node("df_farming:pig_tail_7", { + trampled_node_name = "df_farming:pig_tail_trampled", + randomize_trampled_param2 = true, + }) + footprints.register_trample_node("df_farming:pig_tail_8", { + trampled_node_name = "df_farming:pig_tail_trampled", + randomize_trampled_param2 = true, + }) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/plants.lua b/mods/dfcaverns/df_farming/plants.lua new file mode 100644 index 0000000..53c89ce --- /dev/null +++ b/mods/dfcaverns/df_farming/plants.lua @@ -0,0 +1,278 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +----------------------------------------------------------------------- +-- Plants + +minetest.register_node("df_farming:dead_fungus", { + description = S("Dead Fungus"), + _doc_items_longdesc = df_farming.doc.dead_fungus_desc, + _doc_items_usagehelp = df_farming.doc.dead_fungus_usage, + drawtype = "plantlike", + tiles = {"dfcaverns_dead_fungus.png"}, + inventory_image = "dfcaverns_dead_fungus.png", + paramtype = "light", + walkable = false, + is_ground_content = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, flow_through = 1, fire_encouragement=60,fire_flammability=100,destroy_by_lava_flow=1,dig_by_piston=1, compostability=65, handy=1, hoey=1}, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:dead_fungus", + burntime = 2 +}) + +local c_dead_fungus = minetest.get_content_id("df_farming:dead_fungus") +df_farming.spawn_dead_fungus_vm = function(vi, area, data, param2_data) + data[vi] = c_dead_fungus + param2_data[vi] = 0 +end + +minetest.register_node("df_farming:cavern_fungi", { + description = S("Cavern Fungi"), + _doc_items_longdesc = df_farming.doc.cavern_fungi_desc, + _doc_items_usagehelp = df_farming.doc.cavern_fungi_usage, + drawtype = "plantlike", + tiles = {"dfcaverns_fungi.png"}, + inventory_image = "dfcaverns_fungi.png", + paramtype = "light", + walkable = false, + is_ground_content = false, + buildable_to = true, + floodable = true, + light_source = 6, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, flow_through = 1, fire_encouragement=50,fire_flammability=60,destroy_by_lava_flow=1,dig_by_piston=1, compostability=65, handy=1, hoey=1}, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:cavern_fungi", + burntime = 2 +}) + +local c_cavern_fungi = minetest.get_content_id("df_farming:cavern_fungi") +df_farming.spawn_cavern_fungi_vm = function(vi, area, data, param2_data) + data[vi] = c_cavern_fungi + param2_data[vi] = 0 +end + +----------------------------------------------------------------------------------------- + +local marginal = {[df_dependencies.node_name_dirt] = true} +local growable = {[df_dependencies.node_name_dirt_wet] = true, [df_dependencies.node_name_dirt] = true} + +df_farming.plant_timer = function(pos, plantname, elapsed) + local next_stage_time = minetest.registered_nodes[plantname]._dfcaverns_next_stage_time + if not next_stage_time then return end + + next_stage_time = next_stage_time + math.random(next_stage_time * -0.1, next_stage_time * 0.1) + local below = minetest.get_node(vector.add(pos, {x=0, y=-1, z=0})) + if marginal[below.name] then + next_stage_time = next_stage_time * 5 + end + if elapsed ~= nil then + minetest.get_node_timer(pos):set(next_stage_time, elapsed-next_stage_time) + else + minetest.get_node_timer(pos):start(next_stage_time) + end +end + +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + +local place_seed = function(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + if minetest.is_protected(pt.under, placer:get_player_name()) then + minetest.record_protection_violation(pt.under, placer:get_player_name()) + return + end + if minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.record_protection_violation(pt.above, placer:get_player_name()) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- add the node and remove 1 item from the itemstack + local newnode= {name = itemstack:get_name(), param2 = 1, param1=0} + local oldnode= minetest.get_node(pt.above) + minetest.add_node(pt.above, {name = plantname, param2 = 1}) + + local growth_permitted_function = df_farming.growth_permitted[plantname] + if not growth_permitted_function or growth_permitted_function(pt.above) then + df_farming.plant_timer(pt.above, plantname) + else + minetest.get_node_timer(pt.above):stop() -- make sure no old timers are running on this node + end + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + return itemstack +end + +df_farming.register_seed = function(name, description, image, stage_one, grow_time, desc, usage) + local def = { + description = description, + _doc_items_longdesc = desc, + _doc_items_usagehelp = usage, + tiles = {image}, + inventory_image = image, + wield_image = image, + drawtype = "signlike", + paramtype2 = "wallmounted", + groups = {seed = 1, snappy = 3, attached_node = 1, dfcaverns_cookable = 1, digtron_on_place=1,destroy_by_lava_flow=1,dig_by_piston=1, handy=1, hoey=1}, + _dfcaverns_next_stage = stage_one, + _dfcaverns_next_stage_time = grow_time, + paramtype = "light", + walkable = false, + is_ground_content = false, + floodable = true, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_place = function(itemstack, placer, pointed_thing) + return place_seed(itemstack, placer, pointed_thing, "df_farming:"..name) + end, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, "df_farming:"..name, elapsed) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + } + + minetest.register_node("df_farming:"..name, def) + minetest.register_craft({ + type = "fuel", + recipe = "df_farming:"..name, + burntime = 1 + }) +end + +df_farming.grow_underground_plant = function(pos, plant_name, elapsed) + if df_farming.kill_if_sunlit(pos) then + return + end + local node_def = minetest.registered_nodes[plant_name] + local next_stage = node_def._dfcaverns_next_stage + if next_stage then + local soil = minetest.get_node(vector.add(pos, {x=0, y=-1, z=0})).name + if growable[soil] then + local next_def = minetest.registered_nodes[next_stage] + local node = minetest.get_node(pos) + minetest.swap_node(pos, {name=next_stage, param2 = next_def.place_param2 or node.param2}) + df_farming.plant_timer(pos, next_stage, elapsed) + else + df_farming.plant_timer(pos, plant_name) -- reset timer, check again later + end + end +end + +df_farming.kill_if_sunlit = function(pos, node) + return false +end +if df_farming.config.light_kills_fungus then + local kill_if_sunlit = function(pos, node) + if not node then + node = minetest.get_node(pos) + end + local node_def = minetest.registered_nodes[node.name] + local light_sensitive_fungus_level = node_def.groups.light_sensitive_fungus + + -- This should never be the case, but I've received a report of it happening anyway in the ABM so guarding against it. + if not light_sensitive_fungus_level then return false end + + local dead_node = node_def._dfcaverns_dead_node or "df_farming:dead_fungus" + -- 11 is the value adjacent to a torch + local light_level = minetest.get_node_light(pos, 0.5) -- check at 0.5 to get how bright it would be here at noon, + -- prevents fungus from growing on the surface world by happenstance + if light_level and light_level > light_sensitive_fungus_level then + minetest.set_node(pos, {name=dead_node, param2 = node.param2}) + return true + end + return false + end + + df_farming.kill_if_sunlit = kill_if_sunlit + + minetest.register_abm({ + label = "df_farming:kill_light_sensitive_fungus", + nodenames = {"group:light_sensitive_fungus"}, + catch_up = true, + interval = 30, + chance = 5, + action = function(pos, node) + kill_if_sunlit(pos, node) + end + }) +end diff --git a/mods/dfcaverns/df_farming/plump_helmet.lua b/mods/dfcaverns/df_farming/plump_helmet.lua new file mode 100644 index 0000000..004b7f8 --- /dev/null +++ b/mods/dfcaverns/df_farming/plump_helmet.lua @@ -0,0 +1,414 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local displace_x = 0.125 +local displace_z = 0.125 + +local plump_helmet_grow_time = df_farming.config.plant_growth_time * df_farming.config.plump_helmet_delay_multiplier / 4 + +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + +local plump_helmet_on_place = function(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + if minetest.is_protected(pt.under, placer:get_player_name()) then + minetest.record_protection_violation(pt.under, placer:get_player_name()) + return + end + if minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.record_protection_violation(pt.above, placer:get_player_name()) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- add the node and remove 1 item from the itemstack + local new_param2 = math.random(0,3) + local newnode= {name = plantname, param2 = new_param2, param1=0} + local oldnode= minetest.get_node(pt.above) + minetest.add_node(pt.above, newnode) + + local growth_permitted_function = df_farming.growth_permitted["df_farming:plump_helmet_spawn"] -- use the same permitted function for all plump helmets + if not growth_permitted_function or growth_permitted_function(pt.above) then + df_farming.plant_timer(pt.above, plantname) + end + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + return itemstack +end + + +minetest.register_node("df_farming:plump_helmet_spawn", { + description = S("Plump Helmet Spawn"), + _doc_items_longdesc = df_farming.doc.plump_helmet_desc, + _doc_items_usagehelp = df_farming.doc.plump_helmet_usage, + tiles = { + "dfcaverns_plump_helmet_cap.png", + }, + groups = {snappy = 3, plant = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, digtron_on_place=1, destroy_by_lava_flow=1,dig_by_piston=1, handy=1, hoey=1}, + _dfcaverns_next_stage = "df_farming:plump_helmet_1", + _dfcaverns_next_stage_time = plump_helmet_grow_time, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + is_ground_content = false, + floodable = true, + node_box = { + type = "fixed", + fixed = { + {-0.0625 + displace_x, -0.5, -0.125 + displace_z, 0.125 + displace_x, -0.375, 0.0625 + displace_z}, + } + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_place = function(itemstack, placer, pointed_thing) + return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_spawn") + end, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_spawn", elapsed) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, +}) + +local plump_helmet_groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, digtron_on_place=1, fire_encouragement=30,fire_flammability=100,destroy_by_lava_flow=1,dig_by_piston=1,compostability=65} +local get_plump_helmet_groups = function(eatable) + local ret = {} + for key, val in pairs(plump_helmet_groups) do + ret[key]=val + end + ret.eatable = eatable + ret.food = eatable + return ret +end + +minetest.register_node("df_farming:plump_helmet_1", { + description = S("Plump Helmet"), + _doc_items_longdesc = df_farming.doc.plump_helmet_desc, + _doc_items_usagehelp = df_farming.doc.plump_helmet_usage, + tiles = { + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png^[lowpart:5:dfcaverns_plump_helmet_stem.png", + }, + groups = get_plump_helmet_groups(1), + _dfcaverns_next_stage = "df_farming:plump_helmet_2", + _dfcaverns_next_stage_time = plump_helmet_grow_time, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sounds = df_dependencies.sound_leaves(), + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + walkable = false, + floodable = true, + node_box = { + type = "fixed", + fixed = { + {-0.0625 + displace_x, -0.5, -0.125 + displace_z, 0.125 + displace_x, -0.25, 0.0625 + displace_z}, -- stalk + {-0.125 + displace_x, -0.4375, -0.1875 + displace_z, 0.1875 + displace_x, -0.3125, 0.125 + displace_z}, -- cap + } + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + + on_place = function(itemstack, placer, pointed_thing) + return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_1") + end, + + on_use = minetest.item_eat(1), + _hunger_ng = {satiates = 1}, + _mcl_saturation = 0.5, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_1", elapsed) + end, +}) + + +minetest.register_node("df_farming:plump_helmet_2", { + description = S("Plump Helmet"), + _doc_items_longdesc = df_farming.doc.plump_helmet_desc, + _doc_items_usagehelp = df_farming.doc.plump_helmet_usage, + tiles = { + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png^[lowpart:15:dfcaverns_plump_helmet_stem.png", + }, + groups = get_plump_helmet_groups(2), + _dfcaverns_next_stage = "df_farming:plump_helmet_3", + _dfcaverns_next_stage_time = plump_helmet_grow_time, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sounds = df_dependencies.sound_leaves(), + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + walkable = false, + is_ground_content = false, + floodable = true, + node_box = { + type = "fixed", + fixed = { + {-0.0625 + displace_x, -0.5, -0.125 + displace_z, 0.125 + displace_x, 0, 0.0625 + displace_z}, -- stalk + {-0.125 + displace_x, -0.3125, -0.1875 + displace_z, 0.1875 + displace_x, -0.0625, 0.125 + displace_z}, -- cap + } + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + + on_place = function(itemstack, placer, pointed_thing) + return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_2") + end, + + on_use = minetest.item_eat(2), + _hunger_ng = {satiates = 2}, + _mcl_saturation = 0.7, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_2", elapsed) + end, +}) + +minetest.register_node("df_farming:plump_helmet_3", { + description = S("Plump Helmet"), + _doc_items_longdesc = df_farming.doc.plump_helmet_desc, + _doc_items_usagehelp = df_farming.doc.plump_helmet_usage, + tiles = { + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png^[lowpart:35:dfcaverns_plump_helmet_stem.png", + }, + groups = get_plump_helmet_groups(3), + _dfcaverns_next_stage = "df_farming:plump_helmet_4", + _dfcaverns_next_stage_time = plump_helmet_grow_time, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sounds = df_dependencies.sound_leaves(), + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + walkable = false, + is_ground_content = false, + floodable = true, + node_box = { + type = "fixed", + fixed = { + {-0.125 + displace_x, -0.5, -0.1875 + displace_z, 0.1875 + displace_x, 0.25, 0.125 + displace_z}, -- stalk + {-0.1875 + displace_x, -0.125, -0.25 + displace_z, 0.25 + displace_x, 0.1875, 0.1875 + displace_z}, -- cap + } + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + + on_place = function(itemstack, placer, pointed_thing) + return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_3") + end, + + on_use = minetest.item_eat(3), + _hunger_ng = {satiates = 3}, + _mcl_saturation = 0.9, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_3", elapsed) + end, +}) + +minetest.register_node("df_farming:plump_helmet_4", { + description = S("Plump Helmet"), + _doc_items_longdesc = df_farming.doc.plump_helmet_desc, + _doc_items_usagehelp = df_farming.doc.plump_helmet_usage, + tiles = { + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png^[lowpart:40:dfcaverns_plump_helmet_stem.png", + }, + groups = get_plump_helmet_groups(4), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sounds = df_dependencies.sound_leaves(), + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + walkable = false, + is_ground_content = false, + floodable = false, -- I figure full grown plump helmets are sturdy enough to survive inundation + node_box = { + type = "fixed", + fixed = { + {-0.125 + displace_x, -0.5, -0.1875 + displace_z, 0.1875 + displace_x, 0.375, 0.125 + displace_z}, -- stalk + {-0.25 + displace_x, -0.0625, -0.3125 + displace_z, 0.3125 + displace_x, 0.25, 0.25 + displace_z}, -- cap + {-0.1875 + displace_x, 0.25, -0.25 + displace_z, 0.25 + displace_x, 0.3125, 0.1875 + displace_z}, -- cap rounding + } + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + + drop = { + max_items = 4, + items = { + { + items = {'df_farming:plump_helmet_4_picked'}, + rarity = 1, + }, + { + items = {'df_farming:plump_helmet_spawn'}, + rarity = 1, + }, + { + items = {'df_farming:plump_helmet_spawn'}, + rarity = 2, + }, + { + items = {'df_farming:plump_helmet_spawn'}, + rarity = 2, + }, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_4") + end, + + on_use = minetest.item_eat(4), + _hunger_ng = {satiates = 4}, + _mcl_saturation = 1, +}) + +local picked_groups = {} +for key, val in pairs(plump_helmet_groups) do + picked_groups[key]=val + picked_groups.eatable=4 + picked_groups.food=4 +end +picked_groups.not_in_creative_inventory = nil +-- Need a separate picked type to prevent it from giving infinite spawn by just placing and re-harvesting +minetest.register_node("df_farming:plump_helmet_4_picked", { + description = S("Plump Helmet"), + _doc_items_longdesc = df_farming.doc.plump_helmet_desc, + _doc_items_usagehelp = df_farming.doc.plump_helmet_usage, + tiles = { + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png", + "dfcaverns_plump_helmet_cap.png^[lowpart:40:dfcaverns_plump_helmet_stem.png", + }, + groups = picked_groups, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sounds = df_dependencies.sound_leaves(), + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + walkable = false, + is_ground_content = false, + floodable = false, + node_box = { + type = "fixed", + fixed = { + {-0.125 + displace_x, -0.5, -0.1875 + displace_z, 0.1875 + displace_x, 0.375, 0.125 + displace_z}, -- stalk + {-0.25 + displace_x, -0.0625, -0.3125 + displace_z, 0.3125 + displace_x, 0.25, 0.25 + displace_z}, -- cap + {-0.1875 + displace_x, 0.25, -0.25 + displace_z, 0.25 + displace_x, 0.3125, 0.1875 + displace_z}, -- cap rounding + } + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + + on_place = function(itemstack, placer, pointed_thing) + return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_4_picked") + end, + + on_use = minetest.item_eat(4), + _hunger_ng = {satiates = 4}, + _mcl_saturation = 1, +}) + +local place_list = { + minetest.get_content_id("df_farming:plump_helmet_spawn"), + minetest.get_content_id("df_farming:plump_helmet_1"), + minetest.get_content_id("df_farming:plump_helmet_2"), + minetest.get_content_id("df_farming:plump_helmet_3"), + minetest.get_content_id("df_farming:plump_helmet_4"), +} +-- doesn't set the timer running, so plants placed by this method won't grow +df_farming.spawn_plump_helmet_vm = function(vi, area, data, param2_data) + data[vi] = place_list[math.random(1,5)] + param2_data[vi] = math.random(1,4)-1 +end + +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:plump_helmet_spawn", + burntime = 1 +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:plump_helmet_1", + burntime = 1 +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:plump_helmet_2", + burntime = 2 +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:plump_helmet_3", + burntime = 3 +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:plump_helmet_4", + burntime = 4 +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:plump_helmet_4_picked", + burntime = 4 +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/quarry_bush.lua b/mods/dfcaverns/df_farming/quarry_bush.lua new file mode 100644 index 0000000..8c78d5a --- /dev/null +++ b/mods/dfcaverns/df_farming/quarry_bush.lua @@ -0,0 +1,102 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local quarry_grow_time = df_farming.config.plant_growth_time * df_farming.config.quarry_bush_delay_multiplier / 5 + +local register_quarry_bush = function(number) + local name = "df_farming:quarry_bush_"..tostring(number) + local def = { + description = S("Quarry Bush"), + _doc_items_longdesc = df_farming.doc.quarry_bush_desc, + _doc_items_usagehelp = df_farming.doc.quarry_bush_usage, + drawtype = "plantlike", + paramtype2 = "meshoptions", + place_param2 = 4, + tiles = {"dfcaverns_quarry_bush_"..tostring(number)..".png"}, + inventory_image = "dfcaverns_quarry_bush_"..tostring(number)..".png", + paramtype = "light", + walkable = false, + buildable_to = true, + is_ground_content = false, + floodable = true, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, fire_encouragement=60,fire_flammability=100, compostability=50, handy=1,shearsy=1,hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + (16/5)*number/16, 8/16}, + }, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, name, elapsed) + end, + + drop = { + max_items = 2, + items = { + { + items = {'df_farming:quarry_bush_seed 2', 'df_farming:quarry_bush_leaves 2'}, + rarity = 6-number, + }, + { + items = {'df_farming:quarry_bush_seed 1', 'df_farming:quarry_bush_leaves'}, + rarity = 6-number, + }, + { + items = {'df_farming:quarry_bush_seed'}, + rarity = 6-number, + }, + }, + }, + } + + if number < 5 then + def._dfcaverns_next_stage_time = quarry_grow_time + def._dfcaverns_next_stage = "df_farming:quarry_bush_"..tostring(number+1) + end + + minetest.register_node(name, def) +end + +for i = 1,5 do + register_quarry_bush(i) +end + +local place_list = { + minetest.get_content_id("df_farming:quarry_bush_1"), + minetest.get_content_id("df_farming:quarry_bush_2"), + minetest.get_content_id("df_farming:quarry_bush_3"), + minetest.get_content_id("df_farming:quarry_bush_4"), + minetest.get_content_id("df_farming:quarry_bush_5"), +} +-- doesn't set the timer running, so plants placed by this method won't grow +df_farming.spawn_quarry_bush_vm = function(vi, area, data, param2_data) + data[vi] = place_list[math.random(1,5)] + param2_data[vi] = 4 +end + +df_farming.register_seed( + "quarry_bush_seed", + S("Rock Nuts"), + "dfcaverns_rock_nuts.png", + "df_farming:quarry_bush_1", + quarry_grow_time, + df_farming.doc.quarry_bush_desc, + df_farming.doc.quarry_bush_usage +) + +minetest.register_craftitem("df_farming:quarry_bush_leaves", { + description = S("Quarry Bush Leaves"), + _doc_items_longdesc = df_farming.doc.quarry_bush_leaves_desc, + _doc_items_usagehelp = df_farming.doc.quarry_bush_leaves_usage, + inventory_image = "dfcaverns_quarry_bush_leaves.png", + groups = {dfcaverns_cookable = 1}, + stack_max = 99, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:quarry_bush_leaves", + burntime = 4 +}) diff --git a/mods/dfcaverns/df_farming/settingtypes.txt b/mods/dfcaverns/df_farming/settingtypes.txt new file mode 100644 index 0000000..213c576 --- /dev/null +++ b/mods/dfcaverns/df_farming/settingtypes.txt @@ -0,0 +1,8 @@ +dfcaverns_plant_growth_time (Base plant growth timer interval) int 3600 +dfcaverns_cave_wheat_delay_multiplier (cave_wheat growth delay multiplier) float 1 +dfcaverns_dimple_cup_delay_multiplier (dimple_cup growth delay multiplier) float 3 +dfcaverns_pig_tail_delay_multiplier (pig_tail growth delay multiplier) float 1 +dfcaverns_plump_helmet_delay_multiplier (plump_helmet growth delay multiplier) float 3 +dfcaverns_quarry_bush_delay_multiplier (quarry_bush growth delay multiplier) float 2 +dfcaverns_sweet_pod_delay_multiplier (sweet_pod growth delay multiplier) float 2 +dfcaverns_light_kills_fungus (Light kills fungus) bool true diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.1.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.1.ogg new file mode 100644 index 0000000..08495c0 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.1.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.2.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.2.ogg new file mode 100644 index 0000000..988a885 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.2.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.3.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.3.ogg new file mode 100644 index 0000000..49a6bc2 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.3.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.4.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.4.ogg new file mode 100644 index 0000000..06c455d Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_chomp_crunch.4.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_crisp_chew.1.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_crisp_chew.1.ogg new file mode 100644 index 0000000..095b6b9 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_crisp_chew.1.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_crisp_chew.2.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_crisp_chew.2.ogg new file mode 100644 index 0000000..ff5748d Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_crisp_chew.2.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.1.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.1.ogg new file mode 100644 index 0000000..abe0f57 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.1.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.2.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.2.ogg new file mode 100644 index 0000000..fbbbf1f Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.2.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.3.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.3.ogg new file mode 100644 index 0000000..9409d07 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_gummy_chew.3.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.1.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.1.ogg new file mode 100644 index 0000000..20c0153 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.1.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.2.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.2.ogg new file mode 100644 index 0000000..140dcef Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.2.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.3.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.3.ogg new file mode 100644 index 0000000..be3cb35 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_mushy_chew.3.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.1.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.1.ogg new file mode 100644 index 0000000..f85b83a Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.1.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.2.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.2.ogg new file mode 100644 index 0000000..52f868e Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.2.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.3.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.3.ogg new file mode 100644 index 0000000..48ed908 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.3.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.4.ogg b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.4.ogg new file mode 100644 index 0000000..bcc8cf8 Binary files /dev/null and b/mods/dfcaverns/df_farming/sounds/df_farming_soft_chew.4.ogg differ diff --git a/mods/dfcaverns/df_farming/sounds/license.txt b/mods/dfcaverns/df_farming/sounds/license.txt new file mode 100644 index 0000000..a667e3f --- /dev/null +++ b/mods/dfcaverns/df_farming/sounds/license.txt @@ -0,0 +1,5 @@ +df_farming_gummy_chew 1,2 and 3 are from https://freesound.org/people/Breviceps/sounds/447916/ by Breviceps under the CC0 public domain license +df_farming_chomp_crunch are from https://freesound.org/people/bbrocer/sounds/382650/ by bbrocer under the CC0 public domain license +df_farming_crisp_chew 1 and 2 are from https://freesound.org/people/InspectorJ/sounds/412068/ by InspectorJ under the CC-BY-SA 3.0 license +df_farming_soft_chew 1, 2, 3 and 4 are from https://freesound.org/people/miekyj/sounds/326464/ by miekyj under the CC0 public domain license +df_farming_mushy_chew 1, 2 and 3 are from https://freesound.org/people/nickyg11p/sounds/390800/ by nickyg11p under the CC0 public domain license \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/sweet_pod.lua b/mods/dfcaverns/df_farming/sweet_pod.lua new file mode 100644 index 0000000..5417217 --- /dev/null +++ b/mods/dfcaverns/df_farming/sweet_pod.lua @@ -0,0 +1,278 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local sweet_pod_grow_time = df_farming.config.plant_growth_time * df_farming.config.sweet_pod_delay_multiplier / 6 + +local syrup_sound = df_dependencies.sound_water() +if minetest.get_modpath("oil") then + syrup_sound.footstep = {name = "oil_oil_footstep", gain = 0.2} +end + +local register_sweet_pod = function(number) + local name = "df_farming:sweet_pod_"..tostring(number) + local def = { + description = S("Sweet Pod"), + _doc_items_longdesc = df_farming.doc.sweet_pod_desc, + _doc_items_usagehelp = df_farming.doc.sweet_pod_usage, + drawtype = "plantlike", + tiles = {"dfcaverns_sweet_pod_"..tostring(number)..".png"}, + inventory_image = "dfcaverns_sweet_pod_"..tostring(number)..".png", + paramtype = "light", + walkable = false, + is_ground_content = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, fire_encouragement=60,fire_flammability=100, compostability=70, handy=1,shearsy=1,hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + (16/6)*number/16, 8/16}, + }, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_timer = function(pos, elapsed) + df_farming.grow_underground_plant(pos, name, elapsed) + end, + + drop = { + max_items = 2, + items = { + { + items = {'df_farming:sweet_pod_seed 2', 'df_farming:sweet_pods 2'}, + rarity = 7-number, + }, + { + items = {'df_farming:sweet_pod_seed', 'df_farming:sweet_pods'}, + rarity = 7-number, + }, + { + items = {'df_farming:sweet_pod_seed'}, + rarity = 7-number, + }, + }, + }, + } + + if number < 6 then + def._dfcaverns_next_stage = "df_farming:sweet_pod_"..tostring(number+1) + def._dfcaverns_next_stage_time = sweet_pod_grow_time + end + + minetest.register_node(name, def) +end + +for i = 1,6 do + register_sweet_pod(i) +end + +local place_list = { + minetest.get_content_id("df_farming:sweet_pod_1"), + minetest.get_content_id("df_farming:sweet_pod_2"), + minetest.get_content_id("df_farming:sweet_pod_3"), + minetest.get_content_id("df_farming:sweet_pod_4"), + minetest.get_content_id("df_farming:sweet_pod_5"), + minetest.get_content_id("df_farming:sweet_pod_6"), +} +-- doesn't set the timer running, so plants placed by this method won't grow +df_farming.spawn_sweet_pod_vm = function(vi, area, data, param2_data) + data[vi] = place_list[math.random(1,8)] + param2_data[vi] = 0 +end + +df_farming.register_seed( + "sweet_pod_seed", + S("Sweet Pod Spores"), + "dfcaverns_sweet_pod_seed.png", + "df_farming:sweet_pod_1", + sweet_pod_grow_time, + df_farming.doc.sweet_pod_desc, + df_farming.doc.sweet_pod_usage) + +minetest.register_craftitem("df_farming:sweet_pods", { + description = S("Sweet Pods"), + _doc_items_longdesc = df_farming.doc.sweet_pod_desc, + _doc_items_usagehelp = df_farming.doc.sweet_pod_usage, + inventory_image = "dfcaverns_sweet_pods.png", + stack_max = 99, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_farming:sweet_pods", + burntime = 4 +}) + +--------------------------------------------- +-- Sugar + +minetest.register_craftitem("df_farming:sugar", { + description = S("Sweet Pod Sugar"), + _doc_items_longdesc = df_farming.doc.sweet_pod_sugar_desc, + _doc_items_usagehelp = df_farming.doc.sweet_pod_sugar_usage, + inventory_image = "dfcaverns_sugar.png", + groups = {dfcaverns_cookable = 1, sugar = 1, food_sugar = 1}, +}) + +local recipe_registered = false + +if minetest.get_modpath("cottages") then + cottages.handmill_product["df_farming:sweet_pods"] = "df_farming:sugar"; + recipe_registered = true +end + +if minetest.registered_items[df_dependencies.node_name_mortar_pestle] ~= nil then + minetest.register_craft({ + type = "shapeless", + output = "df_farming:sugar", + recipe = { + "df_farming:sweet_pods", df_dependencies.node_name_mortar_pestle + }, + replacements = {{"group:food_mortar_pestle", df_dependencies.node_name_mortar_pestle}}, + }) + recipe_registered = true +end + +if not recipe_registered then +minetest.register_craft({ + type = "cooking", + cooktime = 3, + output = "df_farming:sugar", + recipe = "df_farming:sweet_pods", +}) +end + +---------------------------------------------- +-- Syrup + +if df_dependencies.bucket_register_liquid then + minetest.register_node("df_farming:dwarven_syrup_source", { + description = S("Dwarven Syrup Source"), + _doc_items_longdesc = df_farming.doc.sweet_pod_syrup_desc, + _doc_items_usagehelp = df_farming.doc.sweet_pod_syrup_usage, + drawtype = "liquid", + tiles = { + { + name = "dfcaverns_dwarven_syrup_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "dfcaverns_dwarven_syrup_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 204, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "df_farming:dwarven_syrup_flowing", + liquid_alternative_source = "df_farming:dwarven_syrup_source", + liquid_viscosity = 7, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 204, r = 179, g = 131, b = 88}, + groups = {liquid = 1, flammable = -1, dig_by_piston=1, fire_encouragement=5}, + sounds = syrup_sound, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, + }) + + minetest.register_node("df_farming:dwarven_syrup_flowing", { + description = S("Flowing Dwarven Syrup"), + _doc_items_longdesc = df_farming.doc.sweet_pod_syrup_desc, + _doc_items_usagehelp = df_farming.doc.sweet_pod_syrup_usage, + drawtype = "flowingliquid", + tiles = {"dfcaverns_dwarven_syrup.png"}, + special_tiles = { + { + name = "dfcaverns_dwarven_syrup_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "dfcaverns_dwarven_syrup_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 204, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "df_farming:dwarven_syrup_flowing", + liquid_alternative_source = "df_farming:dwarven_syrup_source", + liquid_viscosity = 7, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 204, r = 179, g = 131, b = 88}, + groups = {liquid = 1, flammable = -1, not_in_creative_inventory = 1, dig_by_piston=1, fire_encouragement = 5}, + sounds = syrup_sound, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, + }) + + df_dependencies.bucket_register_liquid( + "df_farming:dwarven_syrup_source", + "df_farming:dwarven_syrup_flowing", + "df_farming:dwarven_syrup_bucket", + "dfcaverns_bucket_dwarven_syrup.png", + S("Dwarven Syrup Bucket") + ) + + if minetest.get_modpath("crafting") then + simplecrafting_lib.register("furnace", { + input = { + [df_dependencies.node_name_bucket_empty] = 1, + ["df_farming:sugar"] = 3, + ["simplecrafting_lib:heat"] = 5, + }, + output = "df_farming:dwarven_syrup_bucket", + }) + else + minetest.register_craft({ + type = "shapeless", + output = "df_farming:dwarven_syrup_bucket", + recipe = {df_dependencies.node_name_bucket_empty, "df_farming:sugar", "df_farming:sugar", "df_farming:sugar"}, + }) + end + + if minetest.get_modpath("dynamic_liquid") then + dynamic_liquid.liquid_abm("df_farming:dwarven_syrup_source", "df_farming:dwarven_syrup_flowing", 5) + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_bucket_dwarven_syrup.png b/mods/dfcaverns/df_farming/textures/dfcaverns_bucket_dwarven_syrup.png new file mode 100644 index 0000000..8975c42 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_bucket_dwarven_syrup.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_straw.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_straw.png new file mode 100644 index 0000000..9b97007 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_straw.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat.png new file mode 100644 index 0000000..9bcb628 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_1.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_1.png new file mode 100644 index 0000000..47dbf2a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_1.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_2.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_2.png new file mode 100644 index 0000000..165b309 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_2.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_3.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_3.png new file mode 100644 index 0000000..96adc86 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_3.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_4.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_4.png new file mode 100644 index 0000000..8fb23a0 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_4.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_5.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_5.png new file mode 100644 index 0000000..8bfe8d5 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_5.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_6.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_6.png new file mode 100644 index 0000000..0303893 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_6.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_7.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_7.png new file mode 100644 index 0000000..4d55cb0 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_7.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_8.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_8.png new file mode 100644 index 0000000..91e2b34 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_8.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_flattened.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_flattened.png new file mode 100644 index 0000000..5e5399a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_flattened.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_seed.png b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_seed.png new file mode 100644 index 0000000..99e24e4 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_cave_wheat_seed.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dead_fungus.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dead_fungus.png new file mode 100644 index 0000000..4c3596f Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dead_fungus.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_1.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_1.png new file mode 100644 index 0000000..8d35988 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_1.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_2.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_2.png new file mode 100644 index 0000000..da2d619 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_2.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_3.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_3.png new file mode 100644 index 0000000..3120ce6 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_3.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_4.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_4.png new file mode 100644 index 0000000..cc92d57 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_4.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_seed.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_seed.png new file mode 100644 index 0000000..18c9bd6 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dimple_cup_seed.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup.png new file mode 100644 index 0000000..38bd161 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup_flowing_animated.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup_flowing_animated.png new file mode 100644 index 0000000..14168ac Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup_flowing_animated.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup_source_animated.png b/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup_source_animated.png new file mode 100644 index 0000000..a47edf8 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_dwarven_syrup_source_animated.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_flour.png b/mods/dfcaverns/df_farming/textures/dfcaverns_flour.png new file mode 100644 index 0000000..17cb216 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_flour.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_fungi.png b/mods/dfcaverns/df_farming/textures/dfcaverns_fungi.png new file mode 100644 index 0000000..fde8cbf Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_fungi.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_1.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_1.png new file mode 100644 index 0000000..a331fd5 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_1.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_2.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_2.png new file mode 100644 index 0000000..2344623 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_2.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_3.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_3.png new file mode 100644 index 0000000..4357671 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_3.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_4.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_4.png new file mode 100644 index 0000000..0706ab8 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_4.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_5.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_5.png new file mode 100644 index 0000000..55e1563 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_5.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_6.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_6.png new file mode 100644 index 0000000..4f26afa Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_6.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_7.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_7.png new file mode 100644 index 0000000..b4f03d8 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_7.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_8.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_8.png new file mode 100644 index 0000000..a2b08bb Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_8.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_flattened.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_flattened.png new file mode 100644 index 0000000..c05671a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_flattened.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_seed.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_seed.png new file mode 100644 index 0000000..3d9ca22 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_seed.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_thread.png b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_thread.png new file mode 100644 index 0000000..b873aa1 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_pig_tail_thread.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_plump_helmet_cap.png b/mods/dfcaverns/df_farming/textures/dfcaverns_plump_helmet_cap.png new file mode 100644 index 0000000..f1eb482 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_plump_helmet_cap.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_plump_helmet_stem.png b/mods/dfcaverns/df_farming/textures/dfcaverns_plump_helmet_stem.png new file mode 100644 index 0000000..30512b8 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_plump_helmet_stem.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food01x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food01x16.png new file mode 100644 index 0000000..c30acdb Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food01x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food02x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food02x16.png new file mode 100644 index 0000000..dae399f Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food02x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food03x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food03x16.png new file mode 100644 index 0000000..a7bf12a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food03x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food04x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food04x16.png new file mode 100644 index 0000000..2f0f37a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food04x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food05x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food05x16.png new file mode 100644 index 0000000..3db0bd3 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food05x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food06x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food06x16.png new file mode 100644 index 0000000..e51ec1a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food06x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food07x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food07x16.png new file mode 100644 index 0000000..3d7cf2d Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food07x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food08x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food08x16.png new file mode 100644 index 0000000..1d0384e Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food08x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food09x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food09x16.png new file mode 100644 index 0000000..5360d93 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food09x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food10x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food10x16.png new file mode 100644 index 0000000..a773b8e Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food10x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food11x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food11x16.png new file mode 100644 index 0000000..42a4702 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food11x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food12x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food12x16.png new file mode 100644 index 0000000..a9ca616 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food12x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food13x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food13x16.png new file mode 100644 index 0000000..70dd545 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food13x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food14x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food14x16.png new file mode 100644 index 0000000..7601687 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food14x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food15x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food15x16.png new file mode 100644 index 0000000..197651c Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food15x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food16x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food16x16.png new file mode 100644 index 0000000..e1f5eea Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food16x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food17x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food17x16.png new file mode 100644 index 0000000..96ac7b6 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food17x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food18x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food18x16.png new file mode 100644 index 0000000..8bce7af Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food18x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food19x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food19x16.png new file mode 100644 index 0000000..82e2a6b Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food19x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food20x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food20x16.png new file mode 100644 index 0000000..ad94142 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food20x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food21x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food21x16.png new file mode 100644 index 0000000..8ce8a68 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food21x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food22x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food22x16.png new file mode 100644 index 0000000..2633108 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food22x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food23x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food23x16.png new file mode 100644 index 0000000..3fdf353 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food23x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food24x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food24x16.png new file mode 100644 index 0000000..7bd6aaf Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food24x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food25x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food25x16.png new file mode 100644 index 0000000..f4142d4 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food25x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food26x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food26x16.png new file mode 100644 index 0000000..aa75463 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food26x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food27x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food27x16.png new file mode 100644 index 0000000..be867c0 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food27x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food28x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food28x16.png new file mode 100644 index 0000000..1d6c6da Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food28x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food29x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food29x16.png new file mode 100644 index 0000000..7bcfee1 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food29x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food30x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food30x16.png new file mode 100644 index 0000000..0d48fcb Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food30x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food31x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food31x16.png new file mode 100644 index 0000000..b42119f Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food31x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food32x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food32x16.png new file mode 100644 index 0000000..04c96c8 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food32x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food33x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food33x16.png new file mode 100644 index 0000000..4f5460b Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food33x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food34x16.png b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food34x16.png new file mode 100644 index 0000000..dd7540c Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_prepared_food34x16.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_1.png b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_1.png new file mode 100644 index 0000000..bca6181 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_1.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_2.png b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_2.png new file mode 100644 index 0000000..1b06b6b Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_2.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_3.png b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_3.png new file mode 100644 index 0000000..6e5cb55 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_3.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_4.png b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_4.png new file mode 100644 index 0000000..74075f3 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_4.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_5.png b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_5.png new file mode 100644 index 0000000..a3fca58 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_5.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_leaves.png b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_leaves.png new file mode 100644 index 0000000..11b1007 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_quarry_bush_leaves.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_rock_nuts.png b/mods/dfcaverns/df_farming/textures/dfcaverns_rock_nuts.png new file mode 100644 index 0000000..89a1ce0 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_rock_nuts.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_stew.png b/mods/dfcaverns/df_farming/textures/dfcaverns_stew.png new file mode 100644 index 0000000..3d3c42e Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_stew.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sugar.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sugar.png new file mode 100644 index 0000000..19d20af Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sugar.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_1.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_1.png new file mode 100644 index 0000000..8fcd0ad Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_1.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_2.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_2.png new file mode 100644 index 0000000..3fbf7d5 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_2.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_3.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_3.png new file mode 100644 index 0000000..50d5bd4 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_3.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_4.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_4.png new file mode 100644 index 0000000..0aaebc7 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_4.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_5.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_5.png new file mode 100644 index 0000000..f153a50 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_5.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_6.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_6.png new file mode 100644 index 0000000..a648f7a Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_6.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_seed.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_seed.png new file mode 100644 index 0000000..67f77e7 Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pod_seed.png differ diff --git a/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pods.png b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pods.png new file mode 100644 index 0000000..8a7beda Binary files /dev/null and b/mods/dfcaverns/df_farming/textures/dfcaverns_sweet_pods.png differ diff --git a/mods/dfcaverns/df_farming/textures/license.txt b/mods/dfcaverns/df_farming/textures/license.txt new file mode 100644 index 0000000..6607818 --- /dev/null +++ b/mods/dfcaverns/df_farming/textures/license.txt @@ -0,0 +1,54 @@ +All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. + +dfcaverns_dwarven_syrup_source_animated - derived from default +dfcaverns_dwarven_syrup - derived from default +dfcaverns_dwarven_syrup_flowing_animated - derived from default +dfcaverns_fungi - copied from caverealms + +Farming textures are released under CC Attribution 3.0 Unported (CC BY 3.0) and list the following authors: +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 MasterGollum +Copyright (C) 2015-2016 Gambit +dfcaverns_cave_wheat - derived from farming wheat +dfcaverns_cave_straw - derived from farming straw +dfcaverns_flour - derived from farming +dfcaverns_bread - derived from farming +dfcaverns_pig_tail_thread - copied from farming +dfcaverns_sugar - derived from farming +dfcaverns_cave_wheat_seed, dfcaverns_pig_tail_seed - derived from farming wheat seed + + + +dfcaverns_prepared_food01 - https://commons.wikimedia.org/wiki/File:Croissants-2.jpg public domain 2005 by Christophe Marcheux +dfcaverns_prepared_food02 - https://commons.wikimedia.org/wiki/File:Boule_de_campagne_01.jpg CC-BY-3.0 2007 by Zantastik +dfcaverns_prepared_food03 - https://commons.wikimedia.org/wiki/File:Essene_Bread_70pct_Rye_Sproud_30pct_Spelt_cut.JPG CC-BY-SA 3.0 2010 by Fritzs +dfcaverns_prepared_food04 - https://commons.wikimedia.org/wiki/File:Essene_Bread_Spelt_Sproud_cut.JPG CC-BY-SA 3.0 2010 by Fritzs +dfcaverns_prepared_food05 - https://commons.wikimedia.org/wiki/File:Tarte_%C3%A0_la_mirabelle_-_20050831.jpeg CC-BY-SA 3.0 and GFDL 1.2 2005 by Sam Hocevar +dfcaverns_prepared_food06 - https://commons.wikimedia.org/wiki/File:Dry_fruit.jpg CC-BY-SA 2.5 2005 by André Karwath +dfcaverns_prepared_food07 - https://commons.wikimedia.org/wiki/File:Steinpilzrisotto.jpg CC-BY-SA 3.0 2006 by Rainer Zenz +dfcaverns_prepared_food08 - https://commons.wikimedia.org/wiki/File:Koernerbroetchen.jpg CC-BY-SA 3.0 2007 by Körnerbrötchen +dfcaverns_prepared_food09 - https://commons.wikimedia.org/wiki/File:Semmelkn%C3%B6del.jpg CC-BY-SA 2.5 2005 by Kobako +dfcaverns_prepared_food10 - https://commons.wikimedia.org/wiki/File:Gulasch.jpg CC-BY-SA 2.5 2006 by Kobako +dfcaverns_prepared_food11 - https://commons.wikimedia.org/wiki/File:Chleb_-_polish_bread.jpg Public Domain 2006 by R a f +dfcaverns_prepared_food12 - https://commons.wikimedia.org/wiki/File:CocinaPalentina-Pan_002.jpg CC-BY-SA 3.0 2011 by Valdavia +dfcaverns_prepared_food13 - https://commons.wikimedia.org/wiki/File:Pompei_pane.jpg CC-BY-SA 2.0 Italy 2006 by Beatrice +dfcaverns_prepared_food14 - https://commons.wikimedia.org/wiki/File:Apple_pie.png CC-BY-SA 3.0 2018 by Tiia Monto +dfcaverns_prepared_food15 - https://commons.wikimedia.org/wiki/File:Assam-Tee_SFTGFOP1.jpg CC-BY-SA 3.0 2010 by André Helbig +dfcaverns_prepared_food16 and food17 - https://commons.wikimedia.org/wiki/File:Basler_Brot_white_background.jpg CC-BY-SA 3.0 2008 by Sandstein +dfcaverns_prepared_food18 - https://commons.wikimedia.org/wiki/File:Beetroot2.jpg CC-BY-SA 4.0 International 2016 by Tiia Monto +dfcaverns_prepared_food19 - https://commons.wikimedia.org/wiki/File:Bugnes_white_background.jpg CC-BY-SA 2.5 Generic 2013 by Marie-Lan Nguyen +dfcaverns_prepared_food20 - https://commons.wikimedia.org/wiki/File:Cheeseburger_au_restaurant_Quick_%C3%A0_Coigni%C3%A8res_le_12_avril_2017_-_2.jpg CC-BY-SA 3.0 2017 by Lionel Allorge +dfcaverns_prepared_food21 - https://commons.wikimedia.org/wiki/File:Choc-Chip-Cookie.jpg Public Domain 2011 by Evan-Amos +dfcaverns_prepared_food22 - https://commons.wikimedia.org/wiki/File:Chocolate_walnut_cookie.jpg CC-BY-SA 4.0 International 2015 by Tiia Monto +dfcaverns_prepared_food23 - https://commons.wikimedia.org/wiki/File:Fogaca_Sweet_Bread.jpg Public Domain 2005 by Paula Santos +dfcaverns_prepared_food24 - https://commons.wikimedia.org/wiki/File:Bonbons_Ricola_Citron_M%C3%A9lisse_-_1.jpg CC-BY-SA 3.0 2015 by Lionel Allorge +dfcaverns_prepared_food25 and food26 - https://commons.wikimedia.org/wiki/File:Betel_nuts3.jpg CC-BY-SA 3.0 2008 by Henryk Kotowski +dfcaverns_prepared_food27 - https://commons.wikimedia.org/wiki/File:Criollo.jpg CC-BY-SA 3.0 2004 by Fyyfabian +dfcaverns_prepared_food28 - https://commons.wikimedia.org/wiki/File:Croissant-Petr_Kratochvil.jpg Public Domain 2011 by Petr Kratochvil +dfcaverns_prepared_food29 - https://commons.wikimedia.org/wiki/File:Rogalik.jpg Public Domain 2005 by Julo +dfcaverns_prepared_food30 - https://commons.wikimedia.org/wiki/File:Cod_fillet.jpg CC-BY-40 International 2018 by Tiia Monto +dfcaverns_prepared_food31 - https://commons.wikimedia.org/wiki/File:California_roll.jpg CC-BY-SA 3.0 2018 by Tiia Monto +dfcaverns_prepared_food32 - https://commons.wikimedia.org/wiki/File:Kajzerka.jpg Public Domain 2005 by Julo +dfcaverns_prepared_food33 - https://commons.wikimedia.org/wiki/File:Celery_root.jpg CC-BY-SA 3.0 2019 by Tiia Monto +dfcaverns_prepared_food34 - https://commons.wikimedia.org/wiki/File:Cherry-Pie-Whole.jpg Public Domain 2011 by Evan-Amos diff --git a/mods/dfcaverns/df_mapitems/LICENSE.txt b/mods/dfcaverns/df_mapitems/LICENSE.txt new file mode 100644 index 0000000..11ce895 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/LICENSE.txt @@ -0,0 +1,26 @@ +Dwarf Fortress is copyright 2018 by Tarn Adams. This mod uses no assets or other copyrighted materials from Dwarf Fortress. + +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/aliases.lua b/mods/dfcaverns/df_mapitems/aliases.lua new file mode 100644 index 0000000..da630fa --- /dev/null +++ b/mods/dfcaverns/df_mapitems/aliases.lua @@ -0,0 +1,44 @@ +-- These used to be defined in subterrane, but now dfcaverns handles it. +if not minetest.registered_nodes["subterrane:wet_flowstone"] then + minetest.register_alias("subterrane:dry_stal_1", "df_mapitems:dry_stal_1") + minetest.register_alias("subterrane:dry_stal_2", "df_mapitems:dry_stal_2") + minetest.register_alias("subterrane:dry_stal_3", "df_mapitems:dry_stal_3") + minetest.register_alias("subterrane:dry_stal_4", "df_mapitems:dry_stal_4") + minetest.register_alias("subterrane:wet_stal_1", "df_mapitems:wet_stal_1") + minetest.register_alias("subterrane:wet_stal_2", "df_mapitems:wet_stal_2") + minetest.register_alias("subterrane:wet_stal_3", "df_mapitems:wet_stal_3") + minetest.register_alias("subterrane:wet_stal_4", "df_mapitems:wet_stal_4") + minetest.register_alias("subterrane:wet_flowstone", "df_mapitems:wet_flowstone") + minetest.register_alias("subterrane:dry_flowstone", "df_mapitems:dry_flowstone") +end + +minetest.register_alias("dfcaverns:cave_coral_3" , "df_mapitems:cave_coral_3" ) +minetest.register_alias("dfcaverns:cave_coral_2" , "df_mapitems:cave_coral_2" ) +minetest.register_alias("dfcaverns:cave_coral_1" , "df_mapitems:cave_coral_1" ) +minetest.register_alias("dfcaverns:dry_stal_1" , "df_mapitems:dry_stal_1" ) +minetest.register_alias("dfcaverns:dry_stal_2" , "df_mapitems:dry_stal_2" ) +minetest.register_alias("dfcaverns:dry_stal_3" , "df_mapitems:dry_stal_3" ) +minetest.register_alias("dfcaverns:dry_stal_4" , "df_mapitems:dry_stal_4" ) +minetest.register_alias("dfcaverns:wet_stal_1" , "df_mapitems:wet_stal_1" ) +minetest.register_alias("dfcaverns:wet_stal_2" , "df_mapitems:wet_stal_2" ) +minetest.register_alias("dfcaverns:wet_stal_3" , "df_mapitems:wet_stal_3" ) +minetest.register_alias("dfcaverns:wet_stal_4" , "df_mapitems:wet_stal_4" ) +minetest.register_alias("dfcaverns:wet_flowstone" , "df_mapitems:wet_flowstone" ) +minetest.register_alias("dfcaverns:dry_flowstone" , "df_mapitems:dry_flowstone" ) +minetest.register_alias("dfcaverns:icicle_1" , "df_mapitems:icicle_1" ) +minetest.register_alias("dfcaverns:icicle_2" , "df_mapitems:icicle_2" ) +minetest.register_alias("dfcaverns:icicle_3" , "df_mapitems:icicle_3" ) +minetest.register_alias("dfcaverns:icicle_4" , "df_mapitems:icicle_4" ) +minetest.register_alias("dfcaverns:glow_mese" , "df_mapitems:glow_mese" ) +minetest.register_alias("dfcaverns:glow_ruby_ore" , "df_mapitems:glow_ruby_ore" ) +minetest.register_alias("dfcaverns:big_crystal" , "df_mapitems:big_crystal" ) +minetest.register_alias("dfcaverns:med_crystal" , "df_mapitems:med_crystal" ) +minetest.register_alias("dfcaverns:big_crystal_30" , "df_mapitems:big_crystal_30" ) +minetest.register_alias("dfcaverns:med_crystal_30" , "df_mapitems:med_crystal_30" ) +minetest.register_alias("dfcaverns:big_crystal_30_45" , "df_mapitems:big_crystal_30_45" ) +minetest.register_alias("dfcaverns:med_crystal_30_45" , "df_mapitems:med_crystal_30_45" ) +minetest.register_alias("dfcaverns:glow_worm" , "df_mapitems:glow_worm" ) +minetest.register_alias("dfcaverns:dirt_with_cave_moss" , "df_mapitems:dirt_with_cave_moss" ) +minetest.register_alias("dfcaverns:cobble_with_floor_fungus" , "df_mapitems:cobble_with_floor_fungus" ) +minetest.register_alias("dfcaverns:cobble_with_floor_fungus_fine", "df_mapitems:cobble_with_floor_fungus_fine") +minetest.register_alias("dfcaverns:snareweed" , "df_mapitems:snareweed" ) \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/castle_coral.lua b/mods/dfcaverns/df_mapitems/castle_coral.lua new file mode 100644 index 0000000..dc2beac --- /dev/null +++ b/mods/dfcaverns/df_mapitems/castle_coral.lua @@ -0,0 +1,98 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_mapitems:castle_coral", { + description = S("Castle Coral"), + tiles = { + "dfcaverns_castle_coral_gradient.png", + "dfcaverns_castle_coral.png", + "dfcaverns_castle_coral.png", + "dfcaverns_castle_coral.png^[multiply:#888888", + }, + _doc_items_longdesc = df_mapitems.doc.castle_coral_desc, + _doc_items_usagehelp = df_mapitems.doc.castle_coral_usage, + drawtype = "mesh", + is_ground_content = false, + light_source = 2, + mesh = "octagonal_coral.obj", + drop = "df_mapitems:castle_coral_skeleton", + paramtype = "light", + groups = {cracky=2, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, +}) + +minetest.register_node("df_mapitems:castle_coral_skeleton", { + description = S("Castle Coral Skeleton"), + _doc_items_longdesc = df_mapitems.doc.castle_coral_desc, + _doc_items_usagehelp = df_mapitems.doc.castle_coral_usage, + tiles = { + df_dependencies.texture_coral_skeleton + }, + drawtype = "mesh", + mesh = "octagonal_coral.obj", + paramtype = "light", + is_ground_content = false, + groups = {cracky = 3,pickaxey = 1, building_block = 1, coral=2, coral_block=1}, + sounds = df_dependencies.sound_stone(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, +}) + +local c_coral = minetest.get_content_id("df_mapitems:castle_coral") +local c_coral_skeleton = minetest.get_content_id("df_mapitems:castle_coral_skeleton") + +local c_stone = minetest.get_content_id(df_dependencies.node_name_stone) +local c_water = minetest.get_content_id(df_dependencies.node_name_water_source) + +df_mapitems.spawn_castle_coral = function(area, data, vi, iterations) + local run = math.random(2,4) + local index = vi + local zstride = area.zstride + local ystride = area.ystride + while run > 0 do + -- TODO should this be checking for not-water instead of stone? + if math.random() > 0.95 or data[index] == c_stone or not area:containsi(index) then return end + data[index] = c_coral + if iterations > 2 then + data[index + 1] = c_coral + data[index - 1] = c_coral + data[index + zstride] = c_coral + data[index - zstride] = c_coral + end + if iterations > 3 then + data[index + 2] = c_coral + data[index - 2] = c_coral + data[index + zstride * 2] = c_coral + data[index - zstride * 2] = c_coral + data[index + 1 + zstride] = c_coral + data[index - 1 + zstride] = c_coral + data[index + 1 - zstride] = c_coral + data[index - 1 - zstride] = c_coral + end + index = index + ystride + run = run - 1 + end + + local newiterations = iterations - 1 + if newiterations == 0 then return end + + if math.random() > 0.5 then + df_mapitems.spawn_castle_coral(area, data, index + 1 - ystride, newiterations) + df_mapitems.spawn_castle_coral(area, data, index - 1 - ystride, newiterations) + else + df_mapitems.spawn_castle_coral(area, data, index + zstride - ystride, newiterations) + df_mapitems.spawn_castle_coral(area, data, index - zstride - ystride, newiterations) + end +end + +df_mapitems.spawn_coral_pile = function(area, data, vi, radius) + local pos = area:position(vi) + for li in area:iterp(vector.add(pos, -radius), vector.add(pos, radius)) do + local adjacent = li + area.ystride + local node_type = data[li] + if math.random() < 0.2 and not mapgen_helper.buildable_to(node_type) and data[adjacent] == c_water then + data[adjacent] = c_coral_skeleton + end + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/cave_coral.lua b/mods/dfcaverns/df_mapitems/cave_coral.lua new file mode 100644 index 0000000..263ce31 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/cave_coral.lua @@ -0,0 +1,78 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local water_source = df_dependencies.node_name_water_source +local coral_skeleton = df_dependencies.node_name_coral_skeleton + +minetest.register_node("df_mapitems:cave_coral_3", { + description = S("Cave Coral"), + _doc_items_longdesc = df_mapitems.doc.cave_coral_desc, + _doc_items_usagehelp = df_mapitems.doc.cave_coral_usage, + tiles = {"dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral.png"}, + drop = coral_skeleton, + light_source = 3, + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, dfcaverns_cave_coral = 1, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), + on_timer = function(pos) + if minetest.find_node_near(pos, 1, {water_source}) == nil then + minetest.set_node(pos, {name=coral_skeleton}) + end + end, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, +}) + +minetest.register_node("df_mapitems:cave_coral_2", { + description = S("Cave Coral"), + _doc_items_longdesc = df_mapitems.doc.cave_coral_desc, + _doc_items_usagehelp = df_mapitems.doc.cave_coral_usage, + tiles = {"dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral.png"}, + drop = coral_skeleton, + light_source = 2, + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, dfcaverns_cave_coral = 1, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), + on_timer = function(pos) + if minetest.find_node_near(pos, 1, {water_source}) == nil then + minetest.set_node(pos, {name=coral_skeleton}) + end + end, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, +}) + +minetest.register_node("df_mapitems:cave_coral_1", { + description = S("Cave Coral"), + _doc_items_longdesc = df_mapitems.doc.cave_coral_desc, + _doc_items_usagehelp = df_mapitems.doc.cave_coral_usage, + tiles = {"dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral_end.png", "dfcaverns_cave_coral.png"}, + drop = coral_skeleton, + light_source = 1, + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, dfcaverns_cave_coral = 1, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), + on_timer = function(pos) + if minetest.find_node_near(pos, 1, {water_source}) == nil then + minetest.set_node(pos, {name=coral_skeleton}) + end + end, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, +}) + +local coral_names = {"df_mapitems:cave_coral_1", "df_mapitems:cave_coral_2", "df_mapitems:cave_coral_3"} +local water_node = df_dependencies.node_name_water_source +minetest.register_abm{ + label = "df_mapitems:shifting_coral", + nodenames = {"group:dfcaverns_cave_coral"}, + neighbors = {water_node}, + interval = 2, + chance = 10, + action = function(pos) + local node = minetest.get_node(pos) + minetest.swap_node(pos, {name=coral_names[math.random(1,3)], param2=node.param2}) + end, +} diff --git a/mods/dfcaverns/df_mapitems/cave_pearls.lua b/mods/dfcaverns/df_mapitems/cave_pearls.lua new file mode 100644 index 0000000..4eaa2ff --- /dev/null +++ b/mods/dfcaverns/df_mapitems/cave_pearls.lua @@ -0,0 +1,27 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_mapitems:cave_pearls", { + description = S("Cave Pearls"), + tiles = {"dfcaverns_cave_pearl.png"}, + _doc_items_longdesc = df_mapitems.doc.cave_pearls_desc, + _doc_items_usagehelp = df_mapitems.doc.cave_pearls_usage, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 2, pickaxey = 2,}, + walkable = false, + is_ground_content = false, + climbable = true, + light_source = 4, + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.375, -0.125, -0.3125, -0.125}, -- NodeBox1 + {0.125, -0.5, -0.1875, 0.3125, -0.375, 0}, -- NodeBox2 + {-0.125, -0.5, 0.25, 0.0625, -0.375, 0.4375}, -- NodeBox3 + } + }, + on_place = df_mapitems.place_against_surface, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, +}) diff --git a/mods/dfcaverns/df_mapitems/config.lua b/mods/dfcaverns/df_mapitems/config.lua new file mode 100644 index 0000000..5ebf388 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/config.lua @@ -0,0 +1,27 @@ +local CONFIG_FILE_PREFIX = "dfcaverns_" + +df_mapitems.config = {} + +local print_settingtypes = false + +local function setting(stype, name, default, description) + local value + if stype == "bool" then + value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default) + elseif stype == "string" then + value = minetest.settings:get(CONFIG_FILE_PREFIX..name) + elseif stype == "int" or stype == "float" then + value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + df_mapitems.config[name] = value + + if print_settingtypes then + minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default)) + end +end + +setting("float", "glow_worm_delay_multiplier", 10.0, "glow worm growth delay multiplier") +setting("bool", "snareweed_damage", true, "Snareweed causes damage to players") \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/crystals_mese.lua b/mods/dfcaverns/df_mapitems/crystals_mese.lua new file mode 100644 index 0000000..bfe5b8d --- /dev/null +++ b/mods/dfcaverns/df_mapitems/crystals_mese.lua @@ -0,0 +1,62 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +--glowing mese crystal blocks +minetest.register_node("df_mapitems:glow_mese", { + description = S("Flawless Mese Block"), + _doc_items_longdesc = df_mapitems.doc.glow_mese_desc, + _doc_items_usagehelp = df_mapitems.doc.glow_mese_usage, + tiles = {"dfcaverns_glow_mese.png"}, + groups = {cracky=3, pickaxey=4, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), + is_ground_content = false, + light_source = 13, + paramtype = "light", + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, +}) + +minetest.register_craft({ + output = 'df_mapitems:mese_crystal 2', + recipe = { + {'df_mapitems:glow_mese'}, + } +}) + +minetest.register_node("df_mapitems:mese_crystal", { + description = S("Flawless Mese Crystal"), + _doc_items_longdesc = df_mapitems.doc.glow_mese_desc, + _doc_items_usagehelp = df_mapitems.doc.glow_mese_usage, + tiles = {"dfcaverns_glow_mese.png"}, + groups = {cracky = 2, pickaxey=4, material_stone=1, building_block=1, enderman_takable=1}, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "underch_crystal.obj", + light_source = 12, + is_ground_content = false, + sounds = df_dependencies.sound_glass(), + use_texture_alpha = "blend", + sunlight_propagates = true, + on_place = df_mapitems.place_against_surface, + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, +}) + +minetest.register_craft({ + output = df_dependencies.node_name_mese_crystal .. ' 18', + recipe = { + {'df_mapitems:mese_crystal'}, + } +}) + +if minetest.get_modpath("radiant_damage") and radiant_damage.override_radiant_damage and radiant_damage.config.enable_mese_damage then + radiant_damage.override_radiant_damage("mese", { + emitted_by = { + ["df_mapitems:glow_mese"] = radiant_damage.config.mese_damage*12, + ["df_mapitems:mese_crystal"] = radiant_damage.config.mese_damage*9 + } + }) +end diff --git a/mods/dfcaverns/df_mapitems/crystals_ruby.lua b/mods/dfcaverns/df_mapitems/crystals_ruby.lua new file mode 100644 index 0000000..b6fec2f --- /dev/null +++ b/mods/dfcaverns/df_mapitems/crystals_ruby.lua @@ -0,0 +1,329 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_mapitems:glow_ruby_ore", { + description = S("Red Crystal Vein"), + _doc_items_longdesc = df_mapitems.doc.glow_ruby_ore_desc, + _doc_items_usagehelp = df_mapitems.doc.glow_ruby_ore_usage, + tiles = {"dfcaverns_glow_ruby_ore.png"}, + is_ground_content = false, + groups = {cracky=2, pickaxey=3, material_stone=1}, + sounds = df_dependencies.sound_glass(), + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, +}) + +minetest.register_node("df_mapitems:big_crystal", { + description = S("Giant Red Crystal"), + _doc_items_longdesc = df_mapitems.doc.big_crystal_desc, + _doc_items_usagehelp = df_mapitems.doc.big_crystal_usage, + drawtype = "mesh", + mesh = "hex_crystal_big.obj", + tiles = { + "dfcaverns_glow_ruby4x.png", + "dfcaverns_glow_ruby.png", + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + light_source = 12, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 3, 0.5}, + }, + collision_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 3, 0.5}, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_mapitems:med_crystal", { + description = S("Big Red Crystal"), + _doc_items_longdesc = df_mapitems.doc.big_crystal_desc, + _doc_items_usagehelp = df_mapitems.doc.big_crystal_usage, + drawtype = "mesh", + mesh = "hex_crystal_med.obj", + tiles = { + "dfcaverns_glow_ruby.png", + "dfcaverns_glow_ruby_quarter.png", + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + light_source = 12, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1}, + sounds = df_dependencies.sound_glass(), + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 1.25, 0.25}, + }, + collision_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 1.25, 0.25}, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + + +minetest.register_node("df_mapitems:big_crystal_30", { + description = S("Giant Red Crystal"), + _doc_items_longdesc = df_mapitems.doc.big_crystal_desc, + _doc_items_usagehelp = df_mapitems.doc.big_crystal_usage, + drawtype = "mesh", + mesh = "hex_crystal_30_big.obj", + tiles = { + "dfcaverns_glow_ruby4x.png", + "dfcaverns_glow_ruby.png", + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + light_source = 12, + drop = "df_mapitems:big_crystal", + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.625, 0.5, 0.5, 0.375}, + {-0.5, 0.5, -1.25, 0.5, 1.5, -0.25}, + {-0.5, 1.5, -1.875, 0.5, 2.5, -0.875}, + --The following is a more accurate set of collision boxes that theoretically + --allows the crystal to be climbed like stairs, but in practice the physics + --don't seem to work quite right so I'm leaving it "simple" for now. +-- {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375}, +-- {-0.5, 0.0, -0.9375, 0.5, 0.5, 0.0625}, +-- {-0.5, 0.5, -1.25, 0.5, 1.0, -0.25}, +-- {-0.5, 1.0, -1.5625, 0.5, 1.5, -0.5625}, +-- {-0.5, 1.5, -1.875, 0.5, 2.0, -0.875}, +-- {-0.25, 2.0, -1.625, 0.25, 2.5, -1.125}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.625, 0.5, 0.5, 0.375}, + {-0.5, 0.5, -1.25, 0.5, 1.5, -0.25}, + {-0.5, 1.5, -1.875, 0.5, 2.5, -0.875}, +-- {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375}, +-- {-0.5, 0.0, -0.9375, 0.5, 0.5, 0.0625}, +-- {-0.5, 0.5, -1.25, 0.5, 1.0, -0.25}, +-- {-0.5, 1.0, -1.5625, 0.5, 1.5, -0.5625}, +-- {-0.5, 1.5, -1.875, 0.5, 2.0, -0.875}, +-- {-0.25, 2.0, -1.625, 0.25, 2.5, -1.125}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_mapitems:med_crystal_30", { + description = S("Big Red Crystal"), + _doc_items_longdesc = df_mapitems.doc.big_crystal_desc, + _doc_items_usagehelp = df_mapitems.doc.big_crystal_usage, + drawtype = "mesh", + mesh = "hex_crystal_30_med.obj", + tiles = { + "dfcaverns_glow_ruby.png", + "dfcaverns_glow_ruby_quarter.png", + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + light_source = 12, + drop = "df_mapitems:med_crystal", + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1}, + sounds = df_dependencies.sound_glass(), + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.3125, 0.25, 0.0, 0.1875}, + {-0.25, 0.0, -0.625, 0.25, 0.5, -0.125}, + {-0.25, 0.5, -0.9375, 0.25, 1.0, -0.4375}, + } + }, + collision_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.3125, 0.25, 0.0, 0.1875}, + {-0.25, 0.0, -0.625, 0.25, 0.5, -0.125}, + {-0.25, 0.5, -0.9375, 0.25, 1.0, -0.4375}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_mapitems:big_crystal_30_45", { + description = S("Giant Red Crystal"), + _doc_items_longdesc = df_mapitems.doc.big_crystal_desc, + _doc_items_usagehelp = df_mapitems.doc.big_crystal_usage, + drawtype = "mesh", + mesh = "hex_crystal_30_45_big.obj", + tiles = { + "dfcaverns_glow_ruby4x.png", + "dfcaverns_glow_ruby.png", + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + light_source = 12, + drop = "df_mapitems:big_crystal", + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), + selection_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.625, 0.625, 0.5, 0.375}, + {0.0625, 0.5, -1.0625, 1.0625, 1.5, -0.0625}, + {0.5, 1.5, -1.5, 1.5, 2.5, -0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.625, 0.625, 0.5, 0.375}, + {0.0625, 0.5, -1.0625, 1.0625, 1.5, -0.0625}, + {0.5, 1.5, -1.5, 1.5, 2.5, -0.5}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + + +minetest.register_node("df_mapitems:med_crystal_30_45", { + description = S("Big Red Crystal"), + _doc_items_longdesc = df_mapitems.doc.big_crystal_desc, + _doc_items_usagehelp = df_mapitems.doc.big_crystal_usage, + drawtype = "mesh", + mesh = "hex_crystal_30_45_med.obj", + tiles = { + "dfcaverns_glow_ruby4x.png", + "dfcaverns_glow_ruby.png", + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + light_source = 12, + drop = "df_mapitems:med_crystal", + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1}, + sounds = df_dependencies.sound_glass(), + selection_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.3125, 0.0, 0.1875}, + {0.03125, 0.0, -0.53125, 0.53125, 0.5, -0.03125}, + {0.25, 0.5, -0.75, 0.75, 1.0, -0.25}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.3125, 0.0, 0.1875}, + {0.03125, 0.0, -0.53125, 0.53125, 0.5, -0.03125}, + {0.25, 0.5, -0.75, 0.75, 1.0, -0.25}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'df_mapitems:big_crystal_30', + recipe = {'df_mapitems:big_crystal'}, +}) +minetest.register_craft({ + type = "shapeless", + output = 'df_mapitems:big_crystal_30_45', + recipe = {'df_mapitems:big_crystal_30'}, +}) +minetest.register_craft({ + type = "shapeless", + output = 'df_mapitems:big_crystal', + recipe = {'df_mapitems:big_crystal_30_45'}, +}) +minetest.register_craft({ + type = "shapeless", + output = 'df_mapitems:med_crystal_30', + recipe = {'df_mapitems:med_crystal'}, +}) +minetest.register_craft({ + type = "shapeless", + output = 'df_mapitems:med_crystal_30_45', + recipe = {'df_mapitems:med_crystal_30'}, +}) +minetest.register_craft({ + type = "shapeless", + output = 'df_mapitems:med_crystal', + recipe = {'df_mapitems:med_crystal_30_45'}, +}) + +local c_stone = minetest.get_content_id(df_dependencies.node_name_stone) +local c_air = minetest.get_content_id("air") +local c_big_crystal = minetest.get_content_id("df_mapitems:big_crystal") +local c_med_crystal = minetest.get_content_id("df_mapitems:med_crystal") +local c_big_crystal_30 = minetest.get_content_id("df_mapitems:big_crystal_30") +local c_med_crystal_30 = minetest.get_content_id("df_mapitems:med_crystal_30") +local c_big_crystal_30_45 = minetest.get_content_id("df_mapitems:big_crystal_30_45") +local c_med_crystal_30_45 = minetest.get_content_id("df_mapitems:med_crystal_30_45") +local c_glow_ore = minetest.get_content_id("df_mapitems:glow_ruby_ore") + +df_mapitems.place_big_crystal = function(data, data_param2, vi, ceiling) + local orientation = math.random() + if orientation < 0.33 then + if math.random() > 0.5 then + data[vi] = c_big_crystal + else + data[vi] = c_med_crystal + end + elseif orientation < 0.66 then + if math.random() > 0.5 then + data[vi] = c_big_crystal_30 + else + data[vi] = c_med_crystal_30 + end + else + if math.random() > 0.5 then + data[vi] = c_big_crystal_30_45 + else + data[vi] = c_med_crystal_30_45 + end + end + if ceiling then + data_param2[vi] = math.random(20,23) + else + data_param2[vi] = math.random(0,3) + end + +end + +df_mapitems.place_big_crystal_cluster = function(area, data, data_param2, vi, radius, ceiling) + local y + if ceiling then y = -1 else y = 1 end + local pos = area:position(vi) + for li in area:iterp(vector.add(pos, -radius), vector.add(pos, radius)) do + local adjacent = li + y*area.ystride + if math.random() > 0.5 and data[li] == c_stone and data[adjacent] == c_air then + df_mapitems.place_big_crystal(data, data_param2, adjacent, ceiling) + data[li] = c_glow_ore + end + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/crystals_salt.lua b/mods/dfcaverns/df_mapitems/crystals_salt.lua new file mode 100644 index 0000000..51a0599 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/crystals_salt.lua @@ -0,0 +1,36 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_mapitems:salt_crystal", { + description = S("Luminous Salt Crystal"), + _doc_items_longdesc = df_mapitems.doc.salt_desc, + _doc_items_usagehelp = df_mapitems.doc.salt_usage, + tiles = {"dfcaverns_salt_crystal.png"}, + groups = {cracky = 2, pickaxey = 1, shovely=1, material_stone=1}, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "underch_crystal.obj", + light_source = 6, + sounds = df_dependencies.sound_glass(), + use_texture_alpha = "blend", + sunlight_propagates = true, + is_ground_content = false, + on_place = df_mapitems.place_against_surface, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) + +minetest.register_node("df_mapitems:salty_cobble", { + description = S("Salty Cobble"), + _doc_items_longdesc = df_mapitems.doc.salty_cobble_desc, + _doc_items_usagehelp = df_mapitems.doc.salty_cobble_desc, + tiles = {df_dependencies.texture_cobble .. "^dfcaverns_salty.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, pickaxey = 1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, + is_ground_content = false, + light_source = 2, + drop = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone(), + _mcl_blast_resistance = 6, + _mcl_hardness = 2, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/doc.lua b/mods/dfcaverns/df_mapitems/doc.lua new file mode 100644 index 0000000..359e090 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/doc.lua @@ -0,0 +1,69 @@ +df_mapitems.doc = {} + +if not minetest.get_modpath("doc") then + return +end + +local S = minetest.get_translator(minetest.get_current_modname()) + +df_mapitems.doc.cave_moss_desc = S("Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground.") +df_mapitems.doc.cave_moss_usage = S("Cave moss has no known uses aside from the faint glow it emits. It dies when exposed to bright light sources such as the Sun.") +df_mapitems.doc.floor_fungus_desc = S("Floor fungus produces a thin, slick film that spreads through the cracks of broken rock. Its ability to subsist on the tiniest traces of nutrients means it's found in relatively harsh underground environments.") +df_mapitems.doc.floor_fungus_usage = S("Floor fungus has no known uses. It can penetrate deeply into cobblestone constructions if an infestation gets hold, but it is difficult to transport and is inhibited by light so it hasn't spread beyond the deep caverns.") + +df_mapitems.doc.sand_scum_desc = S("Sand scum is a crust of algae that sometimes accumulates on wet sand deep underground, somehow managing to eke out a meager living from the phosphorescent light emitted by other organisms.") +df_mapitems.doc.sand_scum_usage = S("Sand scum is useless. You can get sand out of it, at least.") + +df_mapitems.doc.pebble_fungus_desc = S("Soil that is rich enough to support gigantic mushrooms can support innumerable smaller ones as well. Pebble fungus is a prolific form of mushroom that covers the soil in small spheroidal fruiting bodies.") +df_mapitems.doc.pebble_fungus_usage = S("Pebble fungus grows in soil that is rich enough for farming.") + +df_mapitems.doc.stillworm_desc = S("Stillworm is not actually a kind of worm, but a sort of fungus that looks uncannily like pale, motionless earthworms intertwined with the soil.") +df_mapitems.doc.stillworm_usage = S("Stillworm grows in soil that is rich enough for farming.") + +df_mapitems.doc.rock_rot_desc = S("A highly aggressive form of lichen that eats into solid rock, turning its upper surfaces rough and a little spongy.") +df_mapitems.doc.rock_rot_usage = S("Organic material accumulates in the enlarged pores of rock rot, but not enough to be considered \"soil\" in the usable sense.") + +df_mapitems.doc.spongestone_desc = S("Spongestone is the result of advanced rock rot in its ultimate form. The stone has become so riddled with pores and cavities that it's no longer really stone.") +df_mapitems.doc.spongestone_usage = S("Although a strong mineral matrix remains, spongestone has enough organic content that it can be used as soil for farming.") + + +df_mapitems.doc.hoar_moss_desc = S("Hoar moss is a strange glowing crust that sometimes forms on the surface of water flowing over ice.") +df_mapitems.doc.hoar_moss_usage = S("Hoar moss has no known use aside from providing a faint source of light.") + +df_mapitems.doc.glow_worms_desc = S("Glistening strings of silk hang from the ceilings of some of the larger caverns, lit by the millions of tiny bioluminescent worms that spun them. Glow worms prey on the insects they lure and entangle with their faux starry sky - and sometimes the occasional bat or other larger flying beast.") +df_mapitems.doc.glow_worms_usage = S("Glow worms can be harvested and used as a source of light but they die when exposed to light significantly brighter than themselves or when immersed in water. A colony of glow worms hung in a hospitable environment will undergo a modest amount of growth, allowing it to be divided and propagated.") + +df_mapitems.doc.snareweed_desc = S("A nasty kelp-like plant that grows in patches on the floor of the Sunless Sea. Its reflective patches draw in the unwary and then its prickly barbs catch and hold small creatures.") +df_mapitems.doc.snareweed_usage = S("Snareweed has no practical use, its fibers disintegrate when they dry.") + +df_mapitems.doc.cave_coral_desc = S("A rare form of coral found only deep underground in the Sunless Sea, cave coral grows hanging from the ceilings of flooded caverns.") +df_mapitems.doc.cave_coral_usage = S("Aside from their aesthetic beauty, cave corals can be harvested for simple building materials.") + +df_mapitems.doc.flowstone_desc = S("Flowstone is a carbonate-rich rock formation deposited by flowing water. It consists of minerals that the water dissolved earlier as it widens cracks and fissures into caves.") +df_mapitems.doc.flowstone_usage = S("Aside from the aesthetic beauty of its formations flowstone has no special properties or uses.") +df_mapitems.doc.dripstone_desc = S("The iconic stalactites and stalagmites found in caverns are composed of flowstone (or 'dripstone' in the case of these formations). Moist dripstone is still undergoing growth, whereas dry dripstone is found in 'dead' caverns once the source of water that created them ceases.") +df_mapitems.doc.dripstone_usage = S("Although stalagmites are blunter than the stalactites above them, they can cause extra damage to the unwary caver who falls on them.") +df_mapitems.doc.icicle_desc = S("Ice formed by water dripping slowly into a cold environment, icicles tend to be exceptionally pure and clear.") +df_mapitems.doc.icicle_usage = S("Falling onto an icicle is particularly damaging.") + + +df_mapitems.doc.glow_mese_desc = S("Deep in the infernal conditions of the magma sea, over the course of millions of years, mese crystals grow into flawless blocks that glow bright with strange energies.") +df_mapitems.doc.glow_mese_usage = S("These blocks can be broken down into a large number of mese crystals, but cannot be artificially reassembled.") + +df_mapitems.doc.glow_ruby_ore_desc = S("Large, dry caverns deep underground are well suited to aeons-long processes that concentrate crystalline substances in their walls. This rock is riddled with veins of the stuff.") +df_mapitems.doc.glow_ruby_ore_usage = S("Aside from its aesthetic value this rock has no particular use.") + +df_mapitems.doc.big_crystal_desc = S("Monolithic crystals of this size form only over extremely long periods deep underground, in large long-lived cavities that allow them room to grow. Water and the life it hosts tend to disrupt the formation process of these crystals so they're only found in dry environments.") +df_mapitems.doc.big_crystal_usage = S("Aside from its aesthetic value this crystal has no particular use.") + +df_mapitems.doc.cave_pearls_desc = S("These nodules are actually calcified bacterial colonies.") +df_mapitems.doc.cave_pearls_usage = S("Aside from their soft glow and beauty, cave pearls have no practical use. Except perhaps as handholds for climbing.") + +df_mapitems.doc.castle_coral_desc = S("Deep under the surface of the Sunless Sea are the rare and beautiful Castle Corals, so named due to their resemblance to small undersea castles.") +df_mapitems.doc.castle_coral_usage = S("Castle Coral has little practical use aside from perhaps as a distinctive-looking building material.") + +df_mapitems.doc.salt_desc = S("A crystal of salt grown from water that percolated through the depths of the earth, picking up all manner of minerals as it went.") +df_mapitems.doc.salt_usage = S("Traces of Mese must have been dissolved by the water as this crystal has an inherent glow to it. Not enough Mese to be useful as a reagent, unfortunately.") + +df_mapitems.doc.salty_cobble_desc = S("Much water has seeped through the cracks in this rock and then quickly evaporated, leaving a crust of salt laced throughout.") +df_mapitems.doc.salty_cobble_usage = S("Attemping to mine this rock knocks the salt crust away, leaving only base stone.") \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/flowstone.lua b/mods/dfcaverns/df_mapitems/flowstone.lua new file mode 100644 index 0000000..d622697 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/flowstone.lua @@ -0,0 +1,78 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +----------------------------------------------- + +df_mapitems.dry_stalagmite_ids = subterrane.register_stalagmite_nodes("df_mapitems:dry_stal", { + description = S("Dry Dripstone"), + _doc_items_longdesc = df_mapitems.doc.dripstone_desc, + _doc_items_usagehelp = df_mapitems.doc.dripstone_usage, + tiles = { + df_dependencies.texture_stone .. "^[brighten", + }, + groups = {cracky = 3, stone = 2, pickaxey=1, building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone(), + is_ground_content = false, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +minetest.register_node("df_mapitems:dry_flowstone", { + description = S("Dry Flowstone"), + _doc_items_longdesc = df_mapitems.doc.flowstone_desc, + _doc_items_usagehelp = df_mapitems.doc.flowstone_usage, + tiles = {df_dependencies.texture_stone .. "^[brighten"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, + is_ground_content = false, + drop = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone(), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +----------------------------------------------- + +df_mapitems.wet_stalagmite_ids = subterrane.register_stalagmite_nodes("df_mapitems:wet_stal", { + description = S("Wet Dripstone"), + _doc_items_longdesc = df_mapitems.doc.dripstone_desc, + _doc_items_usagehelp = df_mapitems.doc.dripstone_usage, + tiles = { + df_dependencies.texture_stone .. "^[brighten^dfcaverns_dripstone_streaks.png", + }, + groups = {cracky = 3, stone = 2, subterrane_wet_dripstone = 1, pickaxey=1, building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone(), + is_ground_content = false, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}, "df_mapitems:dry_stal") + + +minetest.register_node("df_mapitems:wet_flowstone", { + description = S("Wet Flowstone"), + _doc_items_longdesc = df_mapitems.doc.flowstone_desc, + _doc_items_usagehelp = df_mapitems.doc.flowstone_usage, + tiles = {df_dependencies.texture_stone .. "^[brighten^dfcaverns_dripstone_streaks.png"}, + groups = {cracky = 3, stone = 1, subterrane_wet_dripstone = 1, lava_heatable = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = "df_mapitems:dry_flowstone", + is_ground_content = false, + drop = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone(), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +----------------------------------------------- + +df_mapitems.icicle_ids = subterrane.register_stalagmite_nodes("df_mapitems:icicle", { + description = S("Icicle"), + _doc_items_longdesc = df_mapitems.doc.icicle_desc, + _doc_items_usagehelp = df_mapitems.doc.icicle_usage, + tiles = { + df_dependencies.texture_ice, + }, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3, pickaxey=1, building_block=1, handy=1, slippery=3, building_block=1, ice=1}, + sounds = df_dependencies.sound_glass(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + diff --git a/mods/dfcaverns/df_mapitems/glow_worms.lua b/mods/dfcaverns/df_mapitems/glow_worms.lua new file mode 100644 index 0000000..3b28501 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/glow_worms.lua @@ -0,0 +1,81 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local growth_multiplier = 1 +if minetest.get_modpath("df_farming") then + growth_multiplier = df_farming.config.plant_growth_time +end + +minetest.register_node("df_mapitems:glow_worm", { + description = S("Glow Worms"), + _doc_items_longdesc = df_mapitems.doc.glow_worms_desc, + _doc_items_usagehelp = df_mapitems.doc.glow_worms_usage, + tiles = { + { + name = "dfcaverns_glow_worm_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 4.0, + }, + }, + }, + inventory_image = "dfcaverns_glow_worm.png", + wield_image = "dfcaverns_glow_worm.png", + is_ground_content = false, + groups = {oddly_breakable_by_hand=3, light_sensitive_fungus = 12, shearsy=1, swordy=1, destroy_by_lava_flow=1}, + _dfcaverns_dead_node = "air", + light_source = 9, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + floodable = true, + visual_scale = 1.0, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + after_place_node = function(pos, placer) + if df_mapitems.config.glow_worm_delay_multiplier > 0 then + minetest.get_node_timer(pos):start(math.random( + df_mapitems.config.glow_worm_delay_multiplier * growth_multiplier * 0.75, + df_mapitems.config.glow_worm_delay_multiplier * growth_multiplier * 1.25)) + end + end, + on_timer = function(pos, elapsed) + local below = {x=pos.x, y=pos.y-1, z=pos.z} + if minetest.get_node(below).name == "air" then + minetest.set_node(below, {name="df_mapitems:glow_worm"}) + if math.random() > 0.5 then + minetest.get_node_timer(below):start(math.random( + df_mapitems.config.glow_worm_delay_multiplier * growth_multiplier * 0.75, + df_mapitems.config.glow_worm_delay_multiplier * growth_multiplier * 1.25)) + end + end + end, +}) + +local c_air = minetest.get_content_id("air") +local c_worm = minetest.get_content_id("df_mapitems:glow_worm") + +df_mapitems.glow_worm_ceiling = function(area, data, vi) + local ystride = area.ystride + local bi = vi - ystride + if data[vi] == c_air and data[bi] == c_air then + data[vi] = c_worm + data[bi] = c_worm + if math.random(2) == 1 then + bi = bi - ystride + if data[bi] == c_air then + data[bi] = c_worm + if math.random(2) == 1 then + bi = bi - ystride + if data[bi] == c_air then + data[bi] = c_worm + end + end + end + end + end +end + + diff --git a/mods/dfcaverns/df_mapitems/ground_cover.lua b/mods/dfcaverns/df_mapitems/ground_cover.lua new file mode 100644 index 0000000..531d8de --- /dev/null +++ b/mods/dfcaverns/df_mapitems/ground_cover.lua @@ -0,0 +1,310 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + + +local function soil_type_spread(label, node_to_spread, target_node) + minetest.register_abm{ + label = label, + nodenames = {target_node}, + neighbors = {node_to_spread}, + interval = 60, + chance = 15, + catch_up = true, + action = function(pos) + local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] + if above_def and (above_def.buildable_to == true or above_def.walkable == false) then + minetest.swap_node(pos, {name=node_to_spread}) + end + end, + } +end + +local farming_soil = df_dependencies.node_name_dirt_furrowed +local farming_soil_wet = df_dependencies.node_name_dirt_wet + +-------------------------------------------------- +-- Cave moss + +-- cyan/dark cyan + +local dirt_texture = df_dependencies.texture_dirt +local sand_texture = df_dependencies.texture_sand + +local dirt_node = df_dependencies.node_name_dirt +local sand_node = df_dependencies.node_name_sand +local stone_node = df_dependencies.node_name_stone +local cobble_node = df_dependencies.node_name_cobble + +minetest.register_node("df_mapitems:dirt_with_cave_moss", { + description = S("Dirt with Cave Moss"), + _doc_items_longdesc = df_mapitems.doc.cave_moss_desc, + _doc_items_usagehelp = df_mapitems.doc.cave_moss_usage, + tiles = {dirt_texture .. "^dfcaverns_cave_moss.png", dirt_texture, + {name = dirt_texture .. "^(dfcaverns_cave_moss.png^[mask:dfcaverns_ground_cover_side_mask.png)", + tileable_vertical = false}}, + drop = dirt_node, + is_ground_content = false, + light_source = 2, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1,dirt=2, soil_sapling=2, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1, compostability=30, opaque=1}, + sounds = df_dependencies.sound_dirt({footstep = {name = df_dependencies.soundfile_grass_footstep, gain = 0.25},}), + soil = { + base = "df_mapitems:dirt_with_cave_moss", + dry = farming_soil, + wet = farming_soil_wet + }, + _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, +}) + +soil_type_spread("df_mapitems:cave_moss_spread", "df_mapitems:dirt_with_cave_moss", dirt_node) + +--------------------------------------------------------------- +-- Sand scum + +minetest.register_node("df_mapitems:sand_scum", { + description = S("Sand Scum"), + _doc_items_longdesc = df_mapitems.doc.sand_scum_desc, + _doc_items_usagehelp = df_mapitems.doc.sand_scum_usage, + tiles = {"dfcaverns_ground_cover_sand_scum.png", sand_texture, + {name = sand_texture .. "^(dfcaverns_ground_cover_sand_scum.png^[mask:dfcaverns_ground_cover_side_mask.png)", + tileable_vertical = false}}, + drop = sand_node, + is_ground_content = false, + light_source = 2, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1, falling_node=1, sand=1, soil_sugarcane=1, enderman_takable=1, building_block=1, material_sand=1, opaque=1}, + sounds = df_dependencies.sound_sand({footstep = {name = "dfcaverns_squish", gain = 0.25},}), + _dfcaverns_dead_node = sand_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +soil_type_spread("df_mapitems:sand_scum_spread", "df_mapitems:sand_scum", sand_node) + +--------------------------------------------------------------- +-- Pebble fungus + +minetest.register_node("df_mapitems:dirt_with_pebble_fungus", { + description = S("Dirt with Pebble Fungus"), + _doc_items_longdesc = df_mapitems.doc.pebble_fungus_desc, + _doc_items_usagehelp = df_mapitems.doc.pebble_fungus_usage, + tiles = {"dfcaverns_ground_cover_pebble_fungus.png", dirt_texture, + {name = dirt_texture .. "^(dfcaverns_ground_cover_pebble_fungus.png^[mask:dfcaverns_ground_cover_side_mask.png)", + tileable_vertical = false}}, + drop = dirt_node, + is_ground_content = false, + light_source = 2, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1,dirt=2, soil_sapling=2, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1, compostability=30, opaque=1}, + sounds = df_dependencies.sound_dirt(), + soil = { + base = "df_mapitems:dirt_with_pebble_fungus", + dry = farming_soil, + wet = farming_soil_wet + }, + _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, +}) + +soil_type_spread("df_mapitems:pebble_fungus_spread", "df_mapitems:dirt_with_pebble_fungus", dirt_node) + +--------------------------------------------------------------- +-- Stillworm + +minetest.register_node("df_mapitems:dirt_with_stillworm", { + description = S("Dirt with Stillworm"), + _doc_items_longdesc = df_mapitems.doc.stillworm_desc, + _doc_items_usagehelp = df_mapitems.doc.stillworm_usage, + tiles = {dirt_texture .. "^dfcaverns_ground_cover_stillworm.png", dirt_texture, + {name = dirt_texture .. "^(dfcaverns_ground_cover_stillworm.png^[mask:dfcaverns_ground_cover_side_mask.png)", + tileable_vertical = false}}, + drop = dirt_node, + is_ground_content = false, + light_source = 2, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1,dirt=2, soil_sapling=2, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1, compostability=30, opaque=1}, + sounds = df_dependencies.sound_dirt({footstep = {name = df_dependencies.soundfile_grass_footstep, gain = 0.25},}), + soil = { + base = "df_mapitems:dirt_with_stillworm", + dry = farming_soil, + wet = farming_soil_wet + }, + _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, +}) + +soil_type_spread("df_mapitems:stillworm_spread", "df_mapitems:dirt_with_stillworm", dirt_node) + +--------------------------------------------------------------- +-- Spongestone / Rock rot + +minetest.register_node("df_mapitems:spongestone", { + description = S("Spongestone"), + _doc_items_longdesc = df_mapitems.doc.sponge_stone_desc, + _doc_items_usagehelp = df_mapitems.doc.sponge_stone_usage, + tiles = {"dfcaverns_ground_cover_sponge_stone.png"}, + drop = dirt_node, + is_ground_content = false, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, shovely=1,dirt=2, enderman_takable=1, building_block=1, compostability=10, opaque=1}, + sounds = df_dependencies.sound_dirt(), + soil = { + base = "df_mapitems:spongestone", + dry = farming_soil, + wet = farming_soil_wet + }, + _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, +}) + +minetest.register_node("df_mapitems:rock_rot", { + description = S("Rock Rot"), + _doc_items_longdesc = df_mapitems.doc.rock_rot_desc, + _doc_items_usagehelp = df_mapitems.doc.rock_rot_usage, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_ground_cover_rock_rot.png", df_dependencies.texture_stone, + {name = df_dependencies.texture_stone .. "^(dfcaverns_ground_cover_rock_rot.png^[mask:dfcaverns_ground_cover_side_mask.png)", + tileable_vertical = false}}, + drop = df_dependencies.node_name_cobble, + is_ground_content = false, + light_source = 2, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, shovely=1,dirt=2, enderman_takable=1, building_block=1, compostability=5, opaque=1}, + sounds = df_dependencies.sound_dirt(), + _dfcaverns_dead_node = stone_node, + _mcl_blast_resistance = 3, + _mcl_hardness = 1, +}) + +soil_type_spread("df_mapitems:rock_rot_spread", "df_mapitems:rock_rot", stone_node) +soil_type_spread("df_mapitems:spongestone_spread", "df_mapitems:spongestone", "df_mapitems:rock_rot") + +-------------------------------------------------- +-- floor fungus + +-- white/yellow + +minetest.register_node("df_mapitems:cobble_with_floor_fungus", { + description = S("Cobblestone with Floor Fungus"), + _doc_items_longdesc = df_mapitems.doc.floor_fungus_desc, + _doc_items_usagehelp = df_mapitems.doc.floor_fungus_usage, + tiles = {df_dependencies.texture_cobble .. "^dfcaverns_floor_fungus.png"}, + drop = cobble_node, + paramtype = "light", + is_ground_content = false, + groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8, df_caverns_floor_fungus = 1, pickaxey=1, building_block=1, material_stone=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone({footstep = {name = "dfcaverns_squish", gain = 0.25},}), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, +}) + +minetest.register_node("df_mapitems:cobble_with_floor_fungus_fine", { + description = S("Cobblestone with Floor Fungus"), + _doc_items_longdesc = df_mapitems.doc.floor_fungus_desc, + _doc_items_usagehelp = df_mapitems.doc.floor_fungus_usage, + tiles = {df_dependencies.texture_cobble .. "^dfcaverns_floor_fungus_fine.png"}, + drop = cobble_node, + is_ground_content = false, + paramtype = "light", + groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8, df_caverns_floor_fungus = 1, pickaxey=1, building_block=1, material_stone=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone({footstep = {name = "dfcaverns_squish", gain = 0.25},}), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="df_mapitems:cobble_with_floor_fungus"}) + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, +}) + +minetest.register_abm{ + label = "df_mapitems:floor_fungus_spread", + nodenames = {cobble_node}, + neighbors = {"group:df_caverns_floor_fungus"}, + interval = 60, + chance = 10, + catch_up = true, + action = function(pos) + local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] + if above_def and (above_def.buildable_to == true or above_def.walkable == false) then + minetest.swap_node(pos, {name="df_mapitems:cobble_with_floor_fungus_fine"}) + if math.random() > 0.5 then + minetest.get_node_timer(pos):start(math.random(1000, 10000)) + end + end + end, +} + +------------------------------------------------------ +-- Hoar moss + +minetest.register_node("df_mapitems:ice_with_hoar_moss", { + description = S("Ice with Hoar Moss"), + _doc_items_longdesc = df_mapitems.doc.hoar_moss_desc, + _doc_items_usagehelp = df_mapitems.doc.hoar_moss_usage, + tiles = {df_dependencies.texture_ice .. "^dfcaverns_hoar_moss.png"}, + drop = df_dependencies.node_name_ice, + paramtype = "light", + light_source = 2, + is_ground_content = false, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 2, light_sensitive_fungus = 8, handy=1,pickaxey=1, building_block=1, ice=1, opaque=1}, + sounds = df_dependencies.sound_glass(), + _dfcaverns_dead_node = df_dependencies.node_name_ice, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + + +---------------------------------------------------------------- +-- Footprint-capable nodes + +if minetest.get_modpath("footprints") then + local HARDPACK_PROBABILITY = tonumber(minetest.settings:get("footprints_hardpack_probability")) or 0.9 -- Chance walked dirt/grass is worn and compacted to footprints:trail. + local HARDPACK_COUNT = tonumber(minetest.settings:get("footprints_hardpack_count")) or 10 -- Number of times the above chance needs to be passed for soil to compact. + + footprints.register_trample_node("df_mapitems:dirt_with_cave_moss", { + trampled_node_def_override = {description = S("Dirt with Cave Moss and Footprint"),}, + hard_pack_node_name = "footprints:trail", + footprint_opacity = 128, + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT, + }) + + footprints.register_trample_node("df_mapitems:sand_scum", { + trampled_node_def_override = {description = S("Sand Scum with Footprint"),}, + hard_pack_node_name = df_dependencies.node_name_sand, + footprint_opacity = 128, + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT * 0.5, + }) + + footprints.register_trample_node("df_mapitems:spongestone", { + trampled_node_def_override = {description = S("Spongestone with Footprint"),}, + hard_pack_node_name = "footprints:trail", + footprint_opacity = 128, + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT * 2, + }) + + footprints.register_trample_node("df_mapitems:dirt_with_pebble_fungus", { + trampled_node_def_override = {description = S("Dirt with Pebble Fungus and Footprint"),}, + hard_pack_node_name = "footprints:trail", + footprint_opacity = 128, + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT, + }) + + footprints.register_trample_node("df_mapitems:dirt_with_stillworm", { + trampled_node_def_override = {description = S("Dirt with Stillworm and Footprint"),}, + hard_pack_node_name = "footprints:trail", + footprint_opacity = 192, + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT, + }) +end diff --git a/mods/dfcaverns/df_mapitems/init.lua b/mods/dfcaverns/df_mapitems/init.lua new file mode 100644 index 0000000..b2db915 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/init.lua @@ -0,0 +1,24 @@ +df_mapitems = {} + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +--load companion lua files +dofile(modpath.."/config.lua") +dofile(modpath.."/doc.lua") +dofile(modpath.."/aliases.lua") +dofile(modpath.."/util.lua") + +dofile(modpath.."/ground_cover.lua") +dofile(modpath.."/glow_worms.lua") +dofile(modpath.."/flowstone.lua") +dofile(modpath.."/snareweed.lua") +dofile(modpath.."/cave_coral.lua") + +dofile(modpath.."/crystals_mese.lua") +dofile(modpath.."/crystals_ruby.lua") +dofile(modpath.."/crystals_salt.lua") + +dofile(modpath.."/veinstone.lua") +dofile(modpath.."/cave_pearls.lua") +dofile(modpath.."/castle_coral.lua") \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/locale/df_mapitems.de.tr b/mods/dfcaverns/df_mapitems/locale/df_mapitems.de.tr new file mode 100644 index 0000000..116503f --- /dev/null +++ b/mods/dfcaverns/df_mapitems/locale/df_mapitems.de.tr @@ -0,0 +1,221 @@ +# textdomain: df_mapitems + + +### castle_coral.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Castle Coral=Schlosskoralle +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Castle Coral Skeleton=Schlosskorallenskelett + +### cave_coral.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Coral=Höhlenkoralle + +### cave_pearls.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Pearls=Höhlenperlen + +### crystals_mese.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flawless Mese Block=Makelloser Mese Block +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flawless Mese Crystal=Makelloser Mese-Kristall + +### crystals_ruby.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Big Red Crystal=Großer roter Kristall +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Red Crystal=Riesiger roter Kristall +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Red Crystal Vein=Rote Kristallader + +### crystals_salt.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Luminous Salt Crystal=Leuchtender Salzkristall +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Salty Cobble=Salziges Kopfsteinpflaster + +### doc.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A crystal of salt grown from water that percolated through the depths of the earth, picking up all manner of minerals as it went.=Ein Salzkristall aus Wasser, das durch die Tiefen der Erde sickerte und dabei alle möglichen Mineralien aufnahm. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A highly aggressive form of lichen that eats into solid rock, turning its upper surfaces rough and a little spongy.=Eine sehr aggressive Form von Flechten, die sich in festes Gestein frisst und ihre oberen Oberflächen rau und ein wenig schwammig macht. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A nasty kelp-like plant that grows in patches on the floor of the Sunless Sea. Its reflective patches draw in the unwary and then its prickly barbs catch and hold small creatures.=Eine böse Seetang-ähnliche Pflanze, die in Flecken auf dem Boden des sonnenlosen Meeres wächst. Seine reflektierenden Flecken ziehen Unachtsame an und dann fangen und halten seine stacheligen Widerhaken kleine Kreaturen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A rare form of coral found only deep underground in the Sunless Sea, cave coral grows hanging from the ceilings of flooded caverns.=Eine seltene Form von Korallen, die nur tief unter der Erde im sonnenlosen Meer zu finden ist. Höhlenkorallen wachsen an den Decken überfluteter Höhlen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Although a strong mineral matrix remains, spongestone has enough organic content that it can be used as soil for farming.=Obwohl eine starke Mineralmatrix verbleibt, hat Schwammstein einen ausreichenden organischen Gehalt, um als Boden für die Landwirtschaft verwendet zu werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Although stalagmites are blunter than the stalactites above them, they can cause extra damage to the unwary caver who falls on them.=Obwohl Stalagmiten stumpfer sind als die Stalaktiten über ihnen, können sie dem unachtsamen Höhlenforscher, der auf sie fällt, zusätzlichen Schaden zufügen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from its aesthetic value this crystal has no particular use.=Abgesehen von seinem ästhetischen Wert hat dieser Kristall keine besondere Verwendung. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from its aesthetic value this rock has no particular use.=Abgesehen von seinem ästhetischen Wert hat dieser Stein keine besondere Verwendung. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from the aesthetic beauty of its formations flowstone has no special properties or uses.=Abgesehen von der ästhetischen Schönheit seiner Formationen hat Flowstone keine besonderen Eigenschaften oder Verwendungen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from their aesthetic beauty, cave corals can be harvested for simple building materials.=Neben ihrer ästhetischen Schönheit können Höhlenkorallen für einfache Baumaterialien geerntet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from their soft glow and beauty, cave pearls have no practical use. Except perhaps as handholds for climbing.=Abgesehen von ihrem weichen Glanz und ihrer Schönheit haben Höhlenperlen keinen praktischen Nutzen. Außer vielleicht als Haltegriffe zum Klettern. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Attemping to mine this rock knocks the salt crust away, leaving only base stone.=Der Versuch, diesen Stein abzubauen, stößt die Salzkruste weg und hinterlässt nur Grundstein. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Castle Coral has little practical use aside from perhaps as a distinctive-looking building material.=Castle Coral hat wenig praktischen Nutzen, außer vielleicht als unverwechselbar aussehendes Baumaterial. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave moss has no known uses aside from the faint glow it emits. It dies when exposed to bright light sources such as the Sun.=Höhlenmoos hat keine bekannten Verwendungszwecke, abgesehen von dem schwachen Schein, den es ausstrahlt. Es stirbt, wenn es hellen Lichtquellen wie der Sonne ausgesetzt wird. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground.=Höhlenmoos ist technisch gesehen eine Form von Schimmel, aber glücklicherweise eine relativ harmlose Form aufgrund seiner Allgegenwart. Seine Fasern bilden eine zähe, aber federnde Matte über der Oberfläche eines organisch reichen Bodens, der sich tief unter der Erde ansammelt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Deep in the infernal conditions of the magma sea, over the course of millions of years, mese crystals grow into flawless blocks that glow bright with strange energies.=Tief in den höllischen Bedingungen des Magma-Meeres wachsen diese Kristalle im Laufe von Millionen von Jahren zu makellosen Blöcken, die vor seltsamen Energien hell leuchten. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Deep under the surface of the Sunless Sea are the rare and beautiful Castle Corals, so named due to their resemblance to small undersea castles.=Tief unter der Oberfläche des sonnenlosen Meeres befinden sich die seltenen und wunderschönen Burgkorallen, die aufgrund ihrer Ähnlichkeit mit kleinen Unterwasserschlössern so benannt wurden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Falling onto an icicle is particularly damaging.=Das Fallen auf einen Eiszapfen ist besonders schädlich. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Floor fungus has no known uses. It can penetrate deeply into cobblestone constructions if an infestation gets hold, but it is difficult to transport and is inhibited by light so it hasn't spread beyond the deep caverns.=Bodenpilz hat keine bekannten Verwendungen. Es kann tief in Kopfsteinpflaster eindringen, wenn sich ein Befall festsetzt, ist jedoch schwer zu transportieren und wird durch Licht gehemmt, sodass es sich nicht über die tiefen Höhlen hinaus ausbreitet. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Floor fungus produces a thin, slick film that spreads through the cracks of broken rock. Its ability to subsist on the tiniest traces of nutrients means it's found in relatively harsh underground environments.=Bodenpilz erzeugt einen dünnen, glatten Film, der sich durch die Risse von gebrochenem Gestein ausbreitet. Aufgrund seiner Fähigkeit, sich von kleinsten Nährstoffspuren zu ernähren, ist es in relativ rauen unterirdischen Umgebungen anzutreffen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flowstone is a carbonate-rich rock formation deposited by flowing water. It consists of minerals that the water dissolved earlier as it widens cracks and fissures into caves.=Flowstone ist eine karbonatreiche Gesteinsformation, die sich durch fließendes Wasser ablagert. Es besteht aus Mineralien, die das Wasser früher aufgelöst hat, als es Risse und Risse in Höhlen weitete. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glistening strings of silk hang from the ceilings of some of the larger caverns, lit by the millions of tiny bioluminescent worms that spun them. Glow worms prey on the insects they lure and entangle with their faux starry sky - and sometimes the occasional bat or other larger flying beast.=Von den Decken einiger der größeren Höhlen hängen glitzernde Seidenfäden, die von den Millionen winziger biolumineszierender Würmer beleuchtet werden, die sie gesponnen haben. Glühwürmchen jagen den Insekten nach, die sie locken und mit ihrem künstlichen Sternenhimmel verwickeln - und manchmal auch gelegentlich Fledermäuse oder andere größere fliegende Tiere. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glow worms can be harvested and used as a source of light but they die when exposed to light significantly brighter than themselves or when immersed in water. A colony of glow worms hung in a hospitable environment will undergo a modest amount of growth, allowing it to be divided and propagated.=Glühwürmchen können geerntet und als Lichtquelle verwendet werden. Sie sterben jedoch ab, wenn sie Licht ausgesetzt werden, das deutlich heller ist als sie selbst oder wenn sie in Wasser getaucht sind. Eine Kolonie von Glühwürmchen, die in einer gastfreundlichen Umgebung aufgehängt ist, wird ein bescheidenes Wachstum erfahren, so dass sie geteilt und vermehrt werden kann. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Hoar moss has no known use aside from providing a faint source of light.=Hoarmoos hat keine bekannte Verwendung, abgesehen von der Bereitstellung einer schwachen Lichtquelle. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Hoar moss is a strange glowing crust that sometimes forms on the surface of water flowing over ice.=Raureif ist eine seltsam leuchtende Kruste, die sich manchmal auf der Oberfläche von Wasser bildet, das über Eis fließt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice formed by water dripping slowly into a cold environment, icicles tend to be exceptionally pure and clear.=Eis, das durch Wasser gebildet wird, das langsam in eine kalte Umgebung tropft. Eiszapfen sind in der Regel außergewöhnlich rein und klar. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Large, dry caverns deep underground are well suited to aeons-long processes that concentrate crystalline substances in their walls. This rock is riddled with veins of the stuff.=Große, trockene Kavernen tief unter der Erde eignen sich gut für Äonen lange Prozesse, bei denen kristalline Substanzen in ihren Wänden konzentriert werden. Dieser Felsen ist voller Adern. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Monolithic crystals of this size form only over extremely long periods deep underground, in large long-lived cavities that allow them room to grow. Water and the life it hosts tend to disrupt the formation process of these crystals so they're only found in dry environments.=Monolithische Kristalle dieser Größe bilden sich nur über extrem lange Zeiträume tief unter der Erde in großen, langlebigen Hohlräumen, in denen sie wachsen können. Wasser und das Leben, das es beherbergt, neigen dazu, den Bildungsprozess dieser Kristalle zu stören, sodass sie nur in trockenen Umgebungen vorkommen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Much water has seeped through the cracks in this rock and then quickly evaporated, leaving a crust of salt laced throughout.=Viel Wasser ist durch die Risse in diesem Felsen gesickert und dann schnell verdunstet, wobei eine Salzkruste zurückbleibt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Organic material accumulates in the enlarged pores of rock rot, but not enough to be considered "soil" in the usable sense.=Organisches Material reichert sich in den vergrößerten Poren der Gesteinsfäule an, reicht jedoch nicht aus, um im verwendbaren Sinne als "Boden" betrachtet zu werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pebble fungus grows in soil that is rich enough for farming.=Kieselpilz wächst in Böden, die reich genug für die Landwirtschaft sind. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand scum is a crust of algae that sometimes accumulates on wet sand deep underground, somehow managing to eke out a meager living from the phosphorescent light emitted by other organisms.=Sandschaum ist eine Algenkruste, die sich manchmal tief im Untergrund auf nassem Sand ansammelt und es irgendwie schafft, einen mageren Lebensunterhalt mit dem phosphoreszierenden Licht anderer Organismen zu verdienen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand scum is useless. You can get sand out of it, at least.=Sandschaum ist nutzlos. Zumindest kann man Sand herausholen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Snareweed has no practical use, its fibers disintegrate when they dry.=Snareweed hat keinen praktischen Nutzen, seine Fasern zerfallen beim Trocknen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Soil that is rich enough to support gigantic mushrooms can support innumerable smaller ones as well. Pebble fungus is a prolific form of mushroom that covers the soil in small spheroidal fruiting bodies.=Böden, die reich genug sind, um gigantische Pilze zu unterstützen, können auch unzählige kleinere Pilze unterstützen. Kieselpilz ist eine fruchtbare Form von Pilzen, die den Boden in kleinen kugelförmigen Fruchtkörpern bedeckt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spongestone is the result of advanced rock rot in its ultimate form. The stone has become so riddled with pores and cavities that it's no longer really stone.=Schwammstein ist das Ergebnis der fortgeschrittenen Steinfäule in ihrer ultimativen Form. Der Stein ist so voller Poren und Hohlräume, dass er nicht mehr wirklich Stein ist. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Stillworm grows in soil that is rich enough for farming.=Stillworm wächst auf Böden, die reich genug für die Landwirtschaft sind. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Stillworm is not actually a kind of worm, but a sort of fungus that looks uncannily like pale, motionless earthworms intertwined with the soil.=Stillworm ist eigentlich keine Art Wurm, sondern eine Art Pilz, der unheimlich aussieht wie blasse, bewegungslose Regenwürmer, die mit dem Boden verflochten sind. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The iconic stalactites and stalagmites found in caverns are composed of flowstone (or 'dripstone' in the case of these formations). Moist dripstone is still undergoing growth, whereas dry dripstone is found in 'dead' caverns once the source of water that created them ceases.=Die in Kavernen gefundenen ikonischen Stalaktiten und Stalagmiten bestehen aus Flussstein (oder bei diesen Formationen „Tropfstein“). Feuchter Tropfstein wächst immer noch, während trockener Tropfstein in „toten“ Höhlen gefunden wird, sobald die Wasserquelle, aus der sie entstanden sind, aufhört. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These blocks can be broken down into a large number of mese crystals, but cannot be artificially reassembled.=Diese Blöcke können in eine große Anzahl dieser Kristalle zerlegt, aber nicht künstlich wieder zusammengesetzt werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These nodules are actually calcified bacterial colonies.=Diese Knötchen sind tatsächlich verkalkte Bakterienkolonien. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Traces of Mese must have been dissolved by the water as this crystal has an inherent glow to it. Not enough Mese to be useful as a reagent, unfortunately.=Spuren von Mese müssen vom Wasser aufgelöst worden sein, da dieser Kristall einen inhärenten Glanz hat. Leider nicht genug, um als Reagenz nützlich zu sein. + + +### flowstone.lua ### + +Dry Dripstone=Trockener Tropfstein +Dry Flowstone=Trockener Fließstein +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Icicle=Eiszapfen +Wet Dripstone=Nasser Tropfstein +Wet Flowstone=Nasser Fließstein + +### glow_worms.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glow Worms=Glühwürmchen + +### ground_cover.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cobblestone with Floor Fungus=Kopfsteinpflaster mit Bodenpilz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Cave Moss=Dreck mit Höhlenmoos +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Cave Moss and Footprint=Schmutz mit Höhlenmoos und Fußabdruck +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Pebble Fungus=Schmutz mit Kieselpilz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Pebble Fungus and Footprint=Schmutz mit Kieselpilz und Fußabdruck +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Stillworm=Dreck mit Stillworm +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Stillworm and Footprint=Schmutz mit Stillworm und Footprint +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice with Hoar Moss=Eis mit Hoar Moss +Rock Rot= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand Scum=Sandschaum +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand Scum with Footprint=Sandschaum mit Fußabdruck +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spongestone=Schwammstein +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spongestone with Footprint=Schwammstein mit Fußabdruck + +### snareweed.lua ### + +Snareweed= + +### veinstone.lua ### + +Veinstone= diff --git a/mods/dfcaverns/df_mapitems/locale/df_mapitems.it.tr b/mods/dfcaverns/df_mapitems/locale/df_mapitems.it.tr new file mode 100644 index 0000000..995dd1f --- /dev/null +++ b/mods/dfcaverns/df_mapitems/locale/df_mapitems.it.tr @@ -0,0 +1,219 @@ +# textdomain: df_mapitems + + +### castle_coral.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Castle Coral=Castello di Coral +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Castle Coral Skeleton=Scheletro di corallo del castello + +### cave_coral.lua ### + +Cave Coral=Grano di caverna + +### cave_pearls.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave Pearls=Perle di caverna + +### crystals_mese.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flawless Mese Block=Impeccabile Mese Block +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flawless Mese Crystal=Cristallo di Mese impeccabile + +### crystals_ruby.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Big Red Crystal=Grande cristallo rosso +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Red Crystal=Cristallo rosso gigante +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Red Crystal Vein=Vena di cristallo rossa + +### crystals_salt.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Luminous Salt Crystal=Cristallo di sale luminoso +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Salty Cobble=Ciottoli salati + +### doc.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A crystal of salt grown from water that percolated through the depths of the earth, picking up all manner of minerals as it went.=Un cristallo di sale cresciuto dall'acqua che filtrava attraverso le profondità della terra, raccogliendo ogni sorta di minerali mentre procedeva. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A highly aggressive form of lichen that eats into solid rock, turning its upper surfaces rough and a little spongy.=Una forma molto aggressiva di lichene che mangia la roccia solida, rendendo le sue superfici superiori ruvide e un po 'spugnose. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A nasty kelp-like plant that grows in patches on the floor of the Sunless Sea. Its reflective patches draw in the unwary and then its prickly barbs catch and hold small creatures.=Una brutta pianta simile ad alghe che cresce a chiazze sul fondo del Mare senza sole. Le sue macchie riflettenti attirano gli incauti e poi le sue punte spinose catturano e trattengono piccole creature. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A rare form of coral found only deep underground in the Sunless Sea, cave coral grows hanging from the ceilings of flooded caverns.=Una rara forma di corallo che si trova solo nel sottosuolo del Mare senza sole, il corallo delle caverne cresce appeso ai soffitti delle caverne allagate. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Although a strong mineral matrix remains, spongestone has enough organic content that it can be used as soil for farming.=Sebbene rimanga una forte matrice minerale, la spongestone ha un contenuto organico sufficiente da poter essere utilizzata come terreno per l'agricoltura. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Although stalagmites are blunter than the stalactites above them, they can cause extra damage to the unwary caver who falls on them.=Sebbene le stalagmiti siano più smussate delle stalattiti sopra di loro, possono causare danni extra allo speleologo incauto che cade su di loro. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from its aesthetic value this crystal has no particular use.=A parte il suo valore estetico questo cristallo non ha particolari utilizzi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from its aesthetic value this rock has no particular use.=A parte il suo valore estetico questa roccia non ha particolari utilizzi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from the aesthetic beauty of its formations flowstone has no special properties or uses.=A parte la bellezza estetica delle sue formazioni, il flowstone non ha proprietà o usi particolari. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from their aesthetic beauty, cave corals can be harvested for simple building materials.=A parte la loro bellezza estetica, i coralli delle caverne possono essere raccolti per semplici materiali da costruzione. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from their soft glow and beauty, cave pearls have no practical use. Except perhaps as handholds for climbing.=A parte il loro bagliore tenue e la loro bellezza, le perle delle caverne non hanno alcun uso pratico. Tranne forse come appigli per arrampicarsi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Attemping to mine this rock knocks the salt crust away, leaving only base stone.=Il tentativo di estrarre questa roccia spazza via la crosta di sale, lasciando solo la pietra di base. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Castle Coral has little practical use aside from perhaps as a distinctive-looking building material.=Castle Coral ha poco uso pratico a parte forse come materiale da costruzione dall'aspetto distintivo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave moss has no known uses aside from the faint glow it emits. It dies when exposed to bright light sources such as the Sun.=Il muschio delle caverne non ha usi conosciuti a parte il debole bagliore che emette. Muore se esposto a sorgenti luminose intense come il sole. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground.=Il muschio delle caverne è tecnicamente una forma di muffa, ma fortunatamente relativamente benigna data la sua ubiquità. Le sue fibre formano un tappeto resistente ma elastico sulla superficie di qualsiasi terreno ricco di sostanze organiche che si accumula in profondità nel sottosuolo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Deep in the infernal conditions of the magma sea, over the course of millions of years, mese crystals grow into flawless blocks that glow bright with strange energies.=Nelle profondità delle condizioni infernali del mare di magma, nel corso di milioni di anni, i cristalli di mese crescono in blocchi impeccabili che brillano luminosi di strane energie. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Deep under the surface of the Sunless Sea are the rare and beautiful Castle Corals, so named due to their resemblance to small undersea castles.=In profondità sotto la superficie del Mare senza sole si trovano i rari e bellissimi Castle Corals, così chiamati per la loro somiglianza con i piccoli castelli sottomarini. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Falling onto an icicle is particularly damaging.=Cadere su un ghiacciolo è particolarmente dannoso. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Floor fungus has no known uses. It can penetrate deeply into cobblestone constructions if an infestation gets hold, but it is difficult to transport and is inhibited by light so it hasn't spread beyond the deep caverns.=Il fungo del pavimento non ha usi conosciuti. Può penetrare in profondità nelle costruzioni di ciottoli se un'infestazione si impadronisce, ma è difficile da trasportare ed è inibito dalla luce, quindi non si è diffuso oltre le profonde caverne. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Floor fungus produces a thin, slick film that spreads through the cracks of broken rock. Its ability to subsist on the tiniest traces of nutrients means it's found in relatively harsh underground environments.=Il fungo del pavimento produce una pellicola sottile e liscia che si diffonde attraverso le fessure della roccia frantumata. La sua capacità di sopravvivere alle più piccole tracce di sostanze nutritive significa che si trova in ambienti sotterranei relativamente difficili. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flowstone is a carbonate-rich rock formation deposited by flowing water. It consists of minerals that the water dissolved earlier as it widens cracks and fissures into caves.=Flowstone è una formazione rocciosa ricca di carbonati depositata dall'acqua corrente. È costituito da minerali che l'acqua ha sciolto in precedenza mentre allarga crepe e fessure in grotte. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glistening strings of silk hang from the ceilings of some of the larger caverns, lit by the millions of tiny bioluminescent worms that spun them. Glow worms prey on the insects they lure and entangle with their faux starry sky - and sometimes the occasional bat or other larger flying beast.=Luccicanti fili di seta pendono dai soffitti di alcune delle caverne più grandi, illuminati dai milioni di minuscoli vermi bioluminescenti che li fanno girare. I vermi luminosi predano gli insetti che attirano e intrappolano con il loro finto cielo stellato, e talvolta il pipistrello occasionale o altre bestie volanti più grandi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glow worms can be harvested and used as a source of light but they die when exposed to light significantly brighter than themselves or when immersed in water. A colony of glow worms hung in a hospitable environment will undergo a modest amount of growth, allowing it to be divided and propagated.=I lombrichi possono essere raccolti e usati come fonte di luce, ma muoiono se esposti a una luce significativamente più brillante di loro o quando vengono immersi nell'acqua. Una colonia di lucciole appese in un ambiente ospitale subirà una modesta crescita, che ne consentirà la divisione e la propagazione. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Hoar moss has no known use aside from providing a faint source of light.=Il muschio di Hoar non ha alcun uso noto a parte fornire una debole fonte di luce. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Hoar moss is a strange glowing crust that sometimes forms on the surface of water flowing over ice.=Il muschio è una strana crosta luminosa che a volte si forma sulla superficie dell'acqua che scorre sul ghiaccio. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice formed by water dripping slowly into a cold environment, icicles tend to be exceptionally pure and clear.=Ghiaccio formato dall'acqua che gocciola lentamente in un ambiente freddo, i ghiaccioli tendono ad essere eccezionalmente puri e limpidi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Large, dry caverns deep underground are well suited to aeons-long processes that concentrate crystalline substances in their walls. This rock is riddled with veins of the stuff.=Grandi caverne asciutte nel sottosuolo ben si adattano a processi lunghi eoni che concentrano sostanze cristalline nelle loro pareti. Questa roccia è crivellata di vene del materiale. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Monolithic crystals of this size form only over extremely long periods deep underground, in large long-lived cavities that allow them room to grow. Water and the life it hosts tend to disrupt the formation process of these crystals so they're only found in dry environments.=Cristalli monolitici di queste dimensioni si formano solo per periodi estremamente lunghi nel sottosuolo, in grandi cavità longeve che consentono loro di crescere. L'acqua e la vita che ospita tendono a interrompere il processo di formazione di questi cristalli, quindi si trovano solo in ambienti asciutti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Much water has seeped through the cracks in this rock and then quickly evaporated, leaving a crust of salt laced throughout.=Molta acqua è filtrata attraverso le fessure di questa roccia e poi è evaporata rapidamente, lasciando una crosta di sale allacciata. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Organic material accumulates in the enlarged pores of rock rot, but not enough to be considered "soil" in the usable sense.=Il materiale organico si accumula nei pori dilatati della putrefazione della roccia, ma non abbastanza per essere considerato "suolo" nel senso utilizzabile. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pebble fungus grows in soil that is rich enough for farming.=Il fungo di ghiaia cresce in un terreno abbastanza ricco per l'agricoltura. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand scum is a crust of algae that sometimes accumulates on wet sand deep underground, somehow managing to eke out a meager living from the phosphorescent light emitted by other organisms.=La schiuma di sabbia è una crosta di alghe che a volte si accumula sulla sabbia bagnata in profondità nel sottosuolo, riuscendo in qualche modo a sopravvivere a una misera vita dalla luce fosforescente emessa da altri organismi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand scum is useless. You can get sand out of it, at least.=La schiuma di sabbia è inutile. Almeno puoi tirar fuori la sabbia. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Snareweed has no practical use, its fibers disintegrate when they dry.=Snareweed non ha alcun uso pratico, le sue fibre si disintegrano quando si asciugano. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Soil that is rich enough to support gigantic mushrooms can support innumerable smaller ones as well. Pebble fungus is a prolific form of mushroom that covers the soil in small spheroidal fruiting bodies.=Un terreno abbastanza ricco da supportare funghi giganteschi può supportare anche innumerevoli funghi più piccoli. Il fungo di ghiaia è una forma prolifica di fungo che copre il terreno in piccoli corpi fruttiferi sferoidali. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spongestone is the result of advanced rock rot in its ultimate form. The stone has become so riddled with pores and cavities that it's no longer really stone.=Spongestone è il risultato del marciume roccioso avanzato nella sua forma definitiva. La pietra è diventata così piena di pori e cavità che non è più veramente pietra. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Stillworm grows in soil that is rich enough for farming.=Il verme selvatico cresce in un terreno abbastanza ricco per l'agricoltura. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Stillworm is not actually a kind of worm, but a sort of fungus that looks uncannily like pale, motionless earthworms intertwined with the soil.=Il verme morto non è in realtà una specie di verme, ma una specie di fungo che assomiglia stranamente a lombrichi pallidi e immobili intrecciati con il terreno. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The iconic stalactites and stalagmites found in caverns are composed of flowstone (or 'dripstone' in the case of these formations). Moist dripstone is still undergoing growth, whereas dry dripstone is found in 'dead' caverns once the source of water that created them ceases.=Le iconiche stalattiti e stalagmiti trovate nelle caverne sono composte da pietrisco (o "gocciolatoio" nel caso di queste formazioni). La pietra gocciolante umida è ancora in fase di crescita, mentre la pietra gocciolante secca si trova nelle caverne "morte" una volta che la fonte d'acqua che le ha create cessa. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These blocks can be broken down into a large number of mese crystals, but cannot be artificially reassembled.=Questi blocchi possono essere scomposti in un gran numero di cristalli mese, ma non possono essere riassemblati artificialmente. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These nodules are actually calcified bacterial colonies.=Questi noduli sono in realtà colonie batteriche calcificate. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Traces of Mese must have been dissolved by the water as this crystal has an inherent glow to it. Not enough Mese to be useful as a reagent, unfortunately.=Tracce di Mese devono essere state sciolte dall'acqua poiché questo cristallo ha un bagliore intrinseco. Sfortunatamente, non abbastanza Mese per essere utile come reagente. + + +### flowstone.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dry Dripstone=Pietra gocciolante secca +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dry Flowstone=Flowstone secco +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Icicle=Ghiacciolo +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Wet Dripstone=Dripstone bagnato +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Wet Flowstone=Flowstone bagnato + +### glow_worms.lua ### + +Glow Worms=Vermi luminosi + +### ground_cover.lua ### + +Cobblestone with Floor Fungus=Ciottoli con funghi del terreno +Dirt with Cave Moss=Terra con muschio di caverna +Dirt with Cave Moss and Footprint=Terra con muschio di caverna +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Pebble Fungus=Sporcizia con funghi di ghiaia +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Pebble Fungus and Footprint=Sporcizia con funghi di ghiaia e impronta +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Stillworm=Sporcizia con Stillworm +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Stillworm and Footprint=Sporcizia con Stillworm e Footprint +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice with Hoar Moss=Ghiaccio con Hoar Moss +Rock Rot= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand Scum=Feccia di sabbia +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Sand Scum with Footprint=Feccia di sabbia con impronta +Spongestone= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spongestone with Footprint=Pietra spugnosa con impronta + +### snareweed.lua ### + +Snareweed= + +### veinstone.lua ### + +Veinstone= diff --git a/mods/dfcaverns/df_mapitems/locale/template.txt b/mods/dfcaverns/df_mapitems/locale/template.txt new file mode 100644 index 0000000..777b043 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/locale/template.txt @@ -0,0 +1,154 @@ +# textdomain: df_mapitems + + +### castle_coral.lua ### + +Castle Coral= +Castle Coral Skeleton= + +### cave_coral.lua ### + +Cave Coral= + +### cave_pearls.lua ### + +Cave Pearls= + +### crystals_mese.lua ### + +Flawless Mese Block= +Flawless Mese Crystal= + +### crystals_ruby.lua ### + +Big Red Crystal= +Giant Red Crystal= +Red Crystal Vein= + +### crystals_salt.lua ### + +Luminous Salt Crystal= +Salty Cobble= + +### doc.lua ### + +A crystal of salt grown from water that percolated through the depths of the earth, picking up all manner of minerals as it went.= + +A highly aggressive form of lichen that eats into solid rock, turning its upper surfaces rough and a little spongy.= + +A nasty kelp-like plant that grows in patches on the floor of the Sunless Sea. Its reflective patches draw in the unwary and then its prickly barbs catch and hold small creatures.= + +A rare form of coral found only deep underground in the Sunless Sea, cave coral grows hanging from the ceilings of flooded caverns.= + +Although a strong mineral matrix remains, spongestone has enough organic content that it can be used as soil for farming.= + +Although stalagmites are blunter than the stalactites above them, they can cause extra damage to the unwary caver who falls on them.= + +Aside from its aesthetic value this crystal has no particular use.= + +Aside from its aesthetic value this rock has no particular use.= + +Aside from the aesthetic beauty of its formations flowstone has no special properties or uses.= + +Aside from their aesthetic beauty, cave corals can be harvested for simple building materials.= + +Aside from their soft glow and beauty, cave pearls have no practical use. Except perhaps as handholds for climbing.= + +Attemping to mine this rock knocks the salt crust away, leaving only base stone.= + +Castle Coral has little practical use aside from perhaps as a distinctive-looking building material.= + +Cave moss has no known uses aside from the faint glow it emits. It dies when exposed to bright light sources such as the Sun.= + +Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground.= + +Deep in the infernal conditions of the magma sea, over the course of millions of years, mese crystals grow into flawless blocks that glow bright with strange energies.= + +Deep under the surface of the Sunless Sea are the rare and beautiful Castle Corals, so named due to their resemblance to small undersea castles.= + +Falling onto an icicle is particularly damaging.= + +Floor fungus has no known uses. It can penetrate deeply into cobblestone constructions if an infestation gets hold, but it is difficult to transport and is inhibited by light so it hasn't spread beyond the deep caverns.= + +Floor fungus produces a thin, slick film that spreads through the cracks of broken rock. Its ability to subsist on the tiniest traces of nutrients means it's found in relatively harsh underground environments.= + +Flowstone is a carbonate-rich rock formation deposited by flowing water. It consists of minerals that the water dissolved earlier as it widens cracks and fissures into caves.= + +Glistening strings of silk hang from the ceilings of some of the larger caverns, lit by the millions of tiny bioluminescent worms that spun them. Glow worms prey on the insects they lure and entangle with their faux starry sky - and sometimes the occasional bat or other larger flying beast.= + +Glow worms can be harvested and used as a source of light but they die when exposed to light significantly brighter than themselves or when immersed in water. A colony of glow worms hung in a hospitable environment will undergo a modest amount of growth, allowing it to be divided and propagated.= + +Hoar moss has no known use aside from providing a faint source of light.= + +Hoar moss is a strange glowing crust that sometimes forms on the surface of water flowing over ice.= + +Ice formed by water dripping slowly into a cold environment, icicles tend to be exceptionally pure and clear.= + +Large, dry caverns deep underground are well suited to aeons-long processes that concentrate crystalline substances in their walls. This rock is riddled with veins of the stuff.= + +Monolithic crystals of this size form only over extremely long periods deep underground, in large long-lived cavities that allow them room to grow. Water and the life it hosts tend to disrupt the formation process of these crystals so they're only found in dry environments.= + +Much water has seeped through the cracks in this rock and then quickly evaporated, leaving a crust of salt laced throughout.= + +Organic material accumulates in the enlarged pores of rock rot, but not enough to be considered "soil" in the usable sense.= + +Pebble fungus grows in soil that is rich enough for farming.= + +Sand scum is a crust of algae that sometimes accumulates on wet sand deep underground, somehow managing to eke out a meager living from the phosphorescent light emitted by other organisms.= + +Sand scum is useless. You can get sand out of it, at least.= + +Snareweed has no practical use, its fibers disintegrate when they dry.= + +Soil that is rich enough to support gigantic mushrooms can support innumerable smaller ones as well. Pebble fungus is a prolific form of mushroom that covers the soil in small spheroidal fruiting bodies.= + +Spongestone is the result of advanced rock rot in its ultimate form. The stone has become so riddled with pores and cavities that it's no longer really stone.= + +Stillworm grows in soil that is rich enough for farming.= + +Stillworm is not actually a kind of worm, but a sort of fungus that looks uncannily like pale, motionless earthworms intertwined with the soil.= + +The iconic stalactites and stalagmites found in caverns are composed of flowstone (or 'dripstone' in the case of these formations). Moist dripstone is still undergoing growth, whereas dry dripstone is found in 'dead' caverns once the source of water that created them ceases.= + +These blocks can be broken down into a large number of mese crystals, but cannot be artificially reassembled.= + +These nodules are actually calcified bacterial colonies.= + +Traces of Mese must have been dissolved by the water as this crystal has an inherent glow to it. Not enough Mese to be useful as a reagent, unfortunately.= + + +### flowstone.lua ### + +Dry Dripstone= +Dry Flowstone= +Icicle= +Wet Dripstone= +Wet Flowstone= + +### glow_worms.lua ### + +Glow Worms= + +### ground_cover.lua ### + +Cobblestone with Floor Fungus= +Dirt with Cave Moss= +Dirt with Cave Moss and Footprint= +Dirt with Pebble Fungus= +Dirt with Pebble Fungus and Footprint= +Dirt with Stillworm= +Dirt with Stillworm and Footprint= +Ice with Hoar Moss= +Rock Rot= +Sand Scum= +Sand Scum with Footprint= +Spongestone= +Spongestone with Footprint= + +### snareweed.lua ### + +Snareweed= + +### veinstone.lua ### + +Veinstone= diff --git a/mods/dfcaverns/df_mapitems/mod.conf b/mods/dfcaverns/df_mapitems/mod.conf new file mode 100644 index 0000000..bb146bb --- /dev/null +++ b/mods/dfcaverns/df_mapitems/mod.conf @@ -0,0 +1,4 @@ +name = df_mapitems +description = Various node types used by the dfcaverns mapgen mod. Includes cave coral, flowstone, glowing crystals, glow worms, moss and fungi ground cover, and snare weed. +depends = df_dependencies, subterrane +optional_depends = df_farming, doc, radiant_damage, footprints \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_big.mtl b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_big.mtl new file mode 100644 index 0000000..89f4b07 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_big.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'hex crystal 30.blend' +# Material Count: 2 + +newmtl End_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Side_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.371605 0.494084 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_big.obj b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_big.obj new file mode 100644 index 0000000..5bbb47d --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_big.obj @@ -0,0 +1,114 @@ +# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30.blend' +# www.blender.org +mtllib hex_crystal_30_45.mtl +o Cylinder +v 0.135341 -0.831516 0.135341 +v -1.192872 2.421927 -1.192872 +v -0.353661 -0.499737 0.353446 +v -1.410977 2.090148 -0.703870 +v -0.442049 -0.716243 -0.088496 +v -1.499365 1.873641 -1.145812 +v -0.088496 -0.716243 -0.442049 +v -1.145812 1.873641 -1.499365 +v 0.353446 -0.499737 -0.353661 +v -0.703870 2.090148 -1.410977 +v 0.441834 -0.283230 0.088281 +v -0.615482 2.306654 -0.969035 +v 0.088281 -0.283230 0.441834 +v -0.969035 2.306654 -0.615482 +vt 0.4999 0.0000 +vt 0.4999 1.0000 +vt 0.3332 1.0000 +vt 0.3332 0.0000 +vt 0.1665 1.0000 +vt 0.1665 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 -0.0000 +vt 1.0000 1.0000 +vt 0.8333 1.0000 +vt 0.8333 -0.0000 +vt 0.6666 1.0000 +vt 0.6666 -0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.5000 0.5000 +vt 0.9313 0.7490 +vt 0.5000 0.9980 +vt 0.5000 0.5000 +vt 0.5000 0.0020 +vt 0.9313 0.2510 +vt 0.0687 0.7490 +vt 0.0687 0.2510 +vt 0.0687 0.2510 +vt 0.0687 0.7490 +vt 0.5000 0.0020 +vt 0.5000 0.9980 +vt 0.9313 0.2510 +vt 0.9313 0.7490 +vn -0.9186 -0.2500 0.3062 +vn -0.6124 -0.5000 -0.6124 +vn 0.3062 -0.2500 -0.9186 +vn 0.9186 0.2500 -0.3062 +vn 0.6124 0.5000 0.6124 +vn -0.3062 0.2500 0.9186 +vn -0.3536 0.8660 -0.3536 +vn 0.3990 0.4733 -0.7854 +vn 0.7854 -0.4733 -0.3990 +vn -0.3439 -0.8143 0.4677 +vn -0.8735 0.4830 -0.0619 +vn -0.1410 -0.9799 -0.1410 +vn -0.6706 0.3173 -0.6706 +vn 0.4677 -0.8143 -0.3439 +vn -0.0619 0.4830 -0.8735 +vn 0.8735 -0.4830 0.0619 +vn 0.3439 0.8143 -0.4677 +vn 0.6706 -0.3173 0.6706 +vn 0.1410 0.9799 0.1410 +vn 0.0619 -0.4830 0.8735 +vn -0.4677 0.8143 0.3439 +g Cylinder_Cylinder_Side_Mat +usemtl Side_Mat +s off +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 5/4/2 6/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 10/7/3 9/8/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 11/12/5 12/11/5 14/13/5 13/14/5 +f 13/14/6 14/13/6 4/2/6 3/1/6 +f 10/15/7 8/16/7 12/17/7 +f 12/17/8 8/16/8 2/18/8 +f 2/18/1 8/16/1 14/19/1 +f 14/19/7 8/16/7 6/20/7 +f 14/19/9 6/20/9 2/18/9 +f 11/21/9 1/22/9 7/23/9 +f 7/23/1 1/22/1 13/24/1 +f 13/24/8 1/22/8 5/25/8 +f 9/8/7 7/23/7 11/21/7 +f 11/21/7 7/23/7 13/24/7 +f 13/24/7 7/23/7 5/25/7 +f 13/24/7 5/25/7 3/26/7 +g Cylinder_Cylinder_End_Mat +usemtl End_Mat +f 1/27/10 3/28/10 5/29/10 +f 2/30/11 6/31/11 4/32/11 +f 1/27/12 5/29/12 7/33/12 +f 2/30/13 8/34/13 6/31/13 +f 1/27/14 7/33/14 9/35/14 +f 2/30/15 10/36/15 8/34/15 +f 1/27/16 9/35/16 11/37/16 +f 2/30/17 12/38/17 10/36/17 +f 1/27/18 11/37/18 13/39/18 +f 2/30/19 14/40/19 12/38/19 +f 1/27/20 13/39/20 3/28/20 +f 2/30/21 4/32/21 14/40/21 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_med.mtl b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_med.mtl new file mode 100644 index 0000000..c68593e --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_med.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'hex crystal 30 45.blend' +# Material Count: 2 + +newmtl End_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Side_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.371605 0.494084 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_med.obj b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_med.obj new file mode 100644 index 0000000..6d750e6 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_45_med.obj @@ -0,0 +1,114 @@ +# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30 45.blend' +# www.blender.org +mtllib hex_crystal_30_45_med.mtl +o Cylinder +v 0.067670 -0.665758 0.067670 +v -0.596436 0.960964 -0.596436 +v -0.176830 -0.499868 0.176723 +v -0.705489 0.795074 -0.351935 +v -0.221025 -0.608121 -0.044248 +v -0.749683 0.686821 -0.572906 +v -0.044248 -0.608121 -0.221025 +v -0.572906 0.686821 -0.749683 +v 0.176723 -0.499868 -0.176830 +v -0.351935 0.795074 -0.705489 +v 0.220917 -0.391615 0.044140 +v -0.307741 0.903327 -0.484518 +v 0.044140 -0.391615 0.220917 +v -0.484518 0.903327 -0.307741 +vt 0.4999 0.0000 +vt 0.4999 1.0000 +vt 0.3332 1.0000 +vt 0.3332 0.0000 +vt 0.1665 1.0000 +vt 0.1665 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 -0.0000 +vt 1.0000 1.0000 +vt 0.8333 1.0000 +vt 0.8333 -0.0000 +vt 0.6666 1.0000 +vt 0.6666 -0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.5000 0.5000 +vt 0.9313 0.7490 +vt 0.5000 0.9980 +vt 0.5000 0.5000 +vt 0.5000 0.0020 +vt 0.9313 0.2510 +vt 0.0687 0.7490 +vt 0.0687 0.2510 +vt 0.0687 0.2510 +vt 0.0687 0.7490 +vt 0.5000 0.0020 +vt 0.5000 0.9980 +vt 0.9313 0.2510 +vt 0.9313 0.7490 +vn -0.9186 -0.2500 0.3062 +vn -0.6124 -0.5000 -0.6124 +vn 0.3062 -0.2500 -0.9186 +vn 0.9186 0.2500 -0.3062 +vn 0.6124 0.5000 0.6124 +vn -0.3062 0.2500 0.9186 +vn -0.3536 0.8660 -0.3536 +vn 0.3990 0.4733 -0.7854 +vn 0.7854 -0.4733 -0.3990 +vn -0.3439 -0.8143 0.4677 +vn -0.8735 0.4830 -0.0619 +vn -0.1410 -0.9799 -0.1410 +vn -0.6706 0.3173 -0.6706 +vn 0.4677 -0.8143 -0.3439 +vn -0.0619 0.4830 -0.8735 +vn 0.8735 -0.4830 0.0619 +vn 0.3439 0.8143 -0.4677 +vn 0.6706 -0.3173 0.6706 +vn 0.1410 0.9799 0.1410 +vn 0.0619 -0.4830 0.8735 +vn -0.4677 0.8143 0.3439 +g Cylinder_Cylinder_Side_Mat +usemtl Side_Mat +s off +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 5/4/2 6/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 10/7/3 9/8/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 11/12/5 12/11/5 14/13/5 13/14/5 +f 13/14/6 14/13/6 4/2/6 3/1/6 +f 10/15/7 8/16/7 12/17/7 +f 12/17/8 8/16/8 2/18/8 +f 2/18/1 8/16/1 14/19/1 +f 14/19/7 8/16/7 6/20/7 +f 14/19/9 6/20/9 2/18/9 +f 11/21/9 1/22/9 7/23/9 +f 7/23/1 1/22/1 13/24/1 +f 13/24/8 1/22/8 5/25/8 +f 9/8/7 7/23/7 11/21/7 +f 11/21/7 7/23/7 13/24/7 +f 13/24/7 7/23/7 5/25/7 +f 13/24/7 5/25/7 3/26/7 +g Cylinder_Cylinder_End_Mat +usemtl End_Mat +f 1/27/10 3/28/10 5/29/10 +f 2/30/11 6/31/11 4/32/11 +f 1/27/12 5/29/12 7/33/12 +f 2/30/13 8/34/13 6/31/13 +f 1/27/14 7/33/14 9/35/14 +f 2/30/15 10/36/15 8/34/15 +f 1/27/16 9/35/16 11/37/16 +f 2/30/17 12/38/17 10/36/17 +f 1/27/18 11/37/18 13/39/18 +f 2/30/19 14/40/19 12/38/19 +f 1/27/20 13/39/20 3/28/20 +f 2/30/21 4/32/21 14/40/21 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_big.mtl b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_big.mtl new file mode 100644 index 0000000..89f4b07 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_big.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'hex crystal 30.blend' +# Material Count: 2 + +newmtl End_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Side_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.371605 0.494084 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_big.obj b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_big.obj new file mode 100644 index 0000000..738a528 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_big.obj @@ -0,0 +1,114 @@ +# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30.blend' +# www.blender.org +mtllib hex_crystal_30.mtl +o Cylinder +v -0.000000 -0.831516 0.191401 +v 0.000000 2.421927 -1.686976 +v -0.500000 -0.499737 -0.000152 +v -0.500000 2.090148 -1.495423 +v -0.250000 -0.716243 -0.375152 +v -0.250000 1.873641 -1.870423 +v 0.250000 -0.716243 -0.375152 +v 0.250000 1.873641 -1.870423 +v 0.500000 -0.499737 -0.000152 +v 0.500000 2.090148 -1.495423 +v 0.250000 -0.283230 0.374848 +v 0.250000 2.306654 -1.120423 +v -0.250000 -0.283230 0.374848 +v -0.250000 2.306654 -1.120423 +vt 0.4999 0.0000 +vt 0.4999 1.0000 +vt 0.3332 1.0000 +vt 0.3332 0.0000 +vt 0.1665 1.0000 +vt 0.1665 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 -0.0000 +vt 1.0000 1.0000 +vt 0.8333 1.0000 +vt 0.8333 -0.0000 +vt 0.6666 1.0000 +vt 0.6666 -0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.5000 0.5000 +vt 0.9313 0.7490 +vt 0.5000 0.9980 +vt 0.5000 0.5000 +vt 0.5000 0.0020 +vt 0.9313 0.2510 +vt 0.0687 0.7490 +vt 0.0687 0.2510 +vt 0.0687 0.2510 +vt 0.0687 0.7490 +vt 0.5000 0.0020 +vt 0.5000 0.9980 +vt 0.9313 0.2510 +vt 0.9313 0.7490 +vn -0.8660 -0.2500 -0.4330 +vn 0.0000 -0.5000 -0.8660 +vn 0.8660 -0.2500 -0.4330 +vn 0.8660 0.2500 0.4330 +vn 0.0000 0.5000 0.8660 +vn -0.8660 0.2500 0.4330 +vn 0.0000 0.8660 -0.5000 +vn 0.8375 0.4733 -0.2732 +vn 0.8375 -0.4733 0.2732 +vn -0.5739 -0.8143 0.0875 +vn -0.5739 0.4830 -0.6614 +vn 0.0000 -0.9799 -0.1994 +vn -0.0000 0.3173 -0.9483 +vn 0.5739 -0.8143 0.0875 +vn 0.5739 0.4830 -0.6614 +vn 0.5739 -0.4830 0.6614 +vn 0.5739 0.8143 -0.0875 +vn 0.0000 -0.3173 0.9483 +vn 0.0000 0.9799 0.1994 +vn -0.5739 -0.4830 0.6614 +vn -0.5739 0.8143 -0.0875 +g Cylinder_Cylinder_Side_Mat +usemtl Side_Mat +s off +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 5/4/2 6/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 10/7/3 9/8/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 11/12/5 12/11/5 14/13/5 13/14/5 +f 13/14/6 14/13/6 4/2/6 3/1/6 +f 10/15/7 8/16/7 12/17/7 +f 12/17/8 8/16/8 2/18/8 +f 2/18/1 8/16/1 14/19/1 +f 14/19/7 8/16/7 6/20/7 +f 14/19/9 6/20/9 2/18/9 +f 11/21/9 1/22/9 7/23/9 +f 7/23/1 1/22/1 13/24/1 +f 13/24/8 1/22/8 5/25/8 +f 9/8/7 7/23/7 11/21/7 +f 11/21/7 7/23/7 13/24/7 +f 13/24/7 7/23/7 5/25/7 +f 13/24/7 5/25/7 3/26/7 +g Cylinder_Cylinder_End_Mat +usemtl End_Mat +f 1/27/10 3/28/10 5/29/10 +f 2/30/11 6/31/11 4/32/11 +f 1/27/12 5/29/12 7/33/12 +f 2/30/13 8/34/13 6/31/13 +f 1/27/14 7/33/14 9/35/14 +f 2/30/15 10/36/15 8/34/15 +f 1/27/16 9/35/16 11/37/16 +f 2/30/17 12/38/17 10/36/17 +f 1/27/18 11/37/18 13/39/18 +f 2/30/19 14/40/19 12/38/19 +f 1/27/20 13/39/20 3/28/20 +f 2/30/21 4/32/21 14/40/21 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_med.mtl b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_med.mtl new file mode 100644 index 0000000..89f4b07 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_med.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'hex crystal 30.blend' +# Material Count: 2 + +newmtl End_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Side_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.371605 0.494084 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_30_med.obj b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_med.obj new file mode 100644 index 0000000..8909981 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_30_med.obj @@ -0,0 +1,114 @@ +# Blender v2.77 (sub 0) OBJ File: 'hex crystal 30.blend' +# www.blender.org +mtllib hex_crystal_30_med.mtl +o Cylinder +v -0.000000 -0.665758 0.095701 +v 0.000000 0.960964 -0.843488 +v -0.250000 -0.499868 -0.000076 +v -0.250000 0.795074 -0.747711 +v -0.125000 -0.608121 -0.187576 +v -0.125000 0.686821 -0.935211 +v 0.125000 -0.608121 -0.187576 +v 0.125000 0.686821 -0.935212 +v 0.250000 -0.499868 -0.000076 +v 0.250000 0.795074 -0.747711 +v 0.125000 -0.391615 0.187424 +v 0.125000 0.903327 -0.560211 +v -0.125000 -0.391615 0.187424 +v -0.125000 0.903327 -0.560211 +vt 0.4999 0.0000 +vt 0.4999 1.0000 +vt 0.3332 1.0000 +vt 0.3332 0.0000 +vt 0.1665 1.0000 +vt 0.1665 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 -0.0000 +vt 1.0000 1.0000 +vt 0.8333 1.0000 +vt 0.8333 -0.0000 +vt 0.6666 1.0000 +vt 0.6666 -0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.5000 0.5000 +vt 0.9313 0.7490 +vt 0.5000 0.9980 +vt 0.5000 0.5000 +vt 0.5000 0.0020 +vt 0.9313 0.2510 +vt 0.0687 0.7490 +vt 0.0687 0.2510 +vt 0.0687 0.2510 +vt 0.0687 0.7490 +vt 0.5000 0.0020 +vt 0.5000 0.9980 +vt 0.9313 0.2510 +vt 0.9313 0.7490 +vn -0.8660 -0.2500 -0.4330 +vn 0.0000 -0.5000 -0.8660 +vn 0.8660 -0.2500 -0.4330 +vn 0.8660 0.2500 0.4330 +vn 0.0000 0.5000 0.8660 +vn -0.8660 0.2500 0.4330 +vn 0.0000 0.8660 -0.5000 +vn 0.8375 0.4733 -0.2732 +vn 0.8375 -0.4733 0.2732 +vn -0.5739 -0.8143 0.0875 +vn -0.5739 0.4830 -0.6614 +vn 0.0000 -0.9799 -0.1994 +vn -0.0000 0.3173 -0.9483 +vn 0.5739 -0.8143 0.0875 +vn 0.5739 0.4830 -0.6614 +vn 0.5739 -0.4830 0.6614 +vn 0.5739 0.8143 -0.0875 +vn 0.0000 -0.3173 0.9483 +vn 0.0000 0.9799 0.1994 +vn -0.5739 -0.4830 0.6614 +vn -0.5739 0.8143 -0.0875 +g Cylinder_Cylinder_Side_Mat +usemtl Side_Mat +s off +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 5/4/2 6/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 10/7/3 9/8/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 11/12/5 12/11/5 14/13/5 13/14/5 +f 13/14/6 14/13/6 4/2/6 3/1/6 +f 10/15/7 8/16/7 12/17/7 +f 12/17/8 8/16/8 2/18/8 +f 2/18/1 8/16/1 14/19/1 +f 14/19/7 8/16/7 6/20/7 +f 14/19/9 6/20/9 2/18/9 +f 11/21/9 1/22/9 7/23/9 +f 7/23/1 1/22/1 13/24/1 +f 13/24/8 1/22/8 5/25/8 +f 9/8/7 7/23/7 11/21/7 +f 11/21/7 7/23/7 13/24/7 +f 13/24/7 7/23/7 5/25/7 +f 13/24/7 5/25/7 3/26/7 +g Cylinder_Cylinder_End_Mat +usemtl End_Mat +f 1/27/10 3/28/10 5/29/10 +f 2/30/11 6/31/11 4/32/11 +f 1/27/12 5/29/12 7/33/12 +f 2/30/13 8/34/13 6/31/13 +f 1/27/14 7/33/14 9/35/14 +f 2/30/15 10/36/15 8/34/15 +f 1/27/16 9/35/16 11/37/16 +f 2/30/17 12/38/17 10/36/17 +f 1/27/18 11/37/18 13/39/18 +f 2/30/19 14/40/19 12/38/19 +f 1/27/20 13/39/20 3/28/20 +f 2/30/21 4/32/21 14/40/21 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_big.mtl b/mods/dfcaverns/df_mapitems/models/hex_crystal_big.mtl new file mode 100644 index 0000000..0d3fc0a --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_big.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'hex crystal.blend' +# Material Count: 2 + +newmtl End_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Side_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.371605 0.494084 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_big.obj b/mods/dfcaverns/df_mapitems/models/hex_crystal_big.obj new file mode 100644 index 0000000..4f1f501 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_big.obj @@ -0,0 +1,114 @@ +# Blender v2.77 (sub 0) OBJ File: 'hex crystal.blend' +# www.blender.org +mtllib hex_crystal.mtl +o Cylinder +v 0.000000 -0.882802 0.000000 +v 0.000000 2.873951 0.000000 +v 0.000000 -0.499696 -0.500000 +v 0.000000 2.490845 -0.500000 +v 0.433013 -0.499696 -0.250000 +v 0.433013 2.490845 -0.250000 +v 0.433013 -0.499696 0.250000 +v 0.433013 2.490845 0.250000 +v -0.000000 -0.499696 0.500000 +v -0.000000 2.490845 0.500000 +v -0.433013 -0.499696 0.250000 +v -0.433013 2.490845 0.250000 +v -0.433013 -0.499696 -0.250000 +v -0.433013 2.490845 -0.250000 +vt 0.4999 0.0000 +vt 0.4999 1.0000 +vt 0.3332 1.0000 +vt 0.3332 0.0000 +vt 0.1665 1.0000 +vt 0.1665 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 -0.0000 +vt 1.0000 1.0000 +vt 0.8333 1.0000 +vt 0.8333 -0.0000 +vt 0.6666 1.0000 +vt 0.6666 -0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.5000 0.5000 +vt 0.9313 0.7490 +vt 0.5000 0.9980 +vt 0.5000 0.5000 +vt 0.5000 0.0020 +vt 0.9313 0.2510 +vt 0.0687 0.7490 +vt 0.0687 0.2510 +vt 0.0687 0.2510 +vt 0.0687 0.7490 +vt 0.5000 0.0020 +vt 0.5000 0.9980 +vt 0.9313 0.2510 +vt 0.9313 0.7490 +vn 0.5000 0.0000 -0.8660 +vn 1.0000 0.0000 0.0000 +vn 0.5000 0.0000 0.8660 +vn -0.5000 0.0000 0.8660 +vn -1.0000 0.0000 0.0000 +vn -0.5000 0.0000 -0.8660 +vn 0.0000 1.0000 0.0000 +vn -0.0000 0.5465 0.8375 +vn 0.0000 -0.5465 0.8375 +vn 0.3313 -0.7489 -0.5739 +vn 0.3313 0.7489 -0.5739 +vn 0.6626 -0.7489 0.0000 +vn 0.6626 0.7489 0.0000 +vn 0.3313 -0.7489 0.5739 +vn 0.3313 0.7489 0.5739 +vn -0.3313 -0.7489 0.5739 +vn -0.3313 0.7489 0.5739 +vn -0.6626 -0.7489 0.0000 +vn -0.6626 0.7489 0.0000 +vn -0.3313 -0.7489 -0.5739 +vn -0.3313 0.7489 -0.5739 +g Cylinder_Cylinder_Side_Mat +usemtl Side_Mat +s off +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 5/4/2 6/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 10/7/3 9/8/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 11/12/5 12/11/5 14/13/5 13/14/5 +f 13/14/6 14/13/6 4/2/6 3/1/6 +f 10/15/7 8/16/7 12/17/7 +f 12/17/8 8/16/8 2/18/8 +f 2/18/1 8/16/1 14/19/1 +f 14/19/7 8/16/7 6/20/7 +f 14/19/9 6/20/9 2/18/9 +f 11/21/9 1/22/9 7/23/9 +f 7/23/1 1/22/1 13/24/1 +f 13/24/8 1/22/8 5/25/8 +f 9/8/7 7/23/7 11/21/7 +f 11/21/7 7/23/7 13/24/7 +f 13/24/7 7/23/7 5/25/7 +f 13/24/7 5/25/7 3/26/7 +g Cylinder_Cylinder_End_Mat +usemtl End_Mat +f 1/27/10 3/28/10 5/29/10 +f 2/30/11 6/31/11 4/32/11 +f 1/27/12 5/29/12 7/33/12 +f 2/30/13 8/34/13 6/31/13 +f 1/27/14 7/33/14 9/35/14 +f 2/30/15 10/36/15 8/34/15 +f 1/27/16 9/35/16 11/37/16 +f 2/30/17 12/38/17 10/36/17 +f 1/27/18 11/37/18 13/39/18 +f 2/30/19 14/40/19 12/38/19 +f 1/27/20 13/39/20 3/28/20 +f 2/30/21 4/32/21 14/40/21 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_med.mtl b/mods/dfcaverns/df_mapitems/models/hex_crystal_med.mtl new file mode 100644 index 0000000..0d3fc0a --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_med.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'hex crystal.blend' +# Material Count: 2 + +newmtl End_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Side_Mat +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.371605 0.494084 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/hex_crystal_med.obj b/mods/dfcaverns/df_mapitems/models/hex_crystal_med.obj new file mode 100644 index 0000000..c9991a0 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/hex_crystal_med.obj @@ -0,0 +1,114 @@ +# Blender v2.77 (sub 0) OBJ File: 'hex crystal.blend' +# www.blender.org +mtllib hex_crystal_med.mtl +o Cylinder +v 0.000000 -0.691401 0.000000 +v 0.000000 1.186976 0.000000 +v 0.000000 -0.499848 -0.250000 +v 0.000000 0.995423 -0.250000 +v 0.216506 -0.499848 -0.125000 +v 0.216506 0.995423 -0.125000 +v 0.216506 -0.499848 0.125000 +v 0.216506 0.995423 0.125000 +v -0.000000 -0.499848 0.250000 +v -0.000000 0.995423 0.250000 +v -0.216506 -0.499848 0.125000 +v -0.216506 0.995423 0.125000 +v -0.216506 -0.499848 -0.125000 +v -0.216506 0.995423 -0.125000 +vt 0.4999 0.0000 +vt 0.4999 1.0000 +vt 0.3332 1.0000 +vt 0.3332 0.0000 +vt 0.1665 1.0000 +vt 0.1665 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 -0.0000 +vt 1.0000 1.0000 +vt 0.8333 1.0000 +vt 0.8333 -0.0000 +vt 0.6666 1.0000 +vt 0.6666 -0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.5000 0.5000 +vt 0.9313 0.7490 +vt 0.5000 0.9980 +vt 0.5000 0.5000 +vt 0.5000 0.0020 +vt 0.9313 0.2510 +vt 0.0687 0.7490 +vt 0.0687 0.2510 +vt 0.0687 0.2510 +vt 0.0687 0.7490 +vt 0.5000 0.0020 +vt 0.5000 0.9980 +vt 0.9313 0.2510 +vt 0.9313 0.7490 +vn 0.5000 0.0000 -0.8660 +vn 1.0000 0.0000 0.0000 +vn 0.5000 0.0000 0.8660 +vn -0.5000 0.0000 0.8660 +vn -1.0000 0.0000 0.0000 +vn -0.5000 0.0000 -0.8660 +vn 0.0000 1.0000 0.0000 +vn -0.0000 0.5465 0.8375 +vn 0.0000 -0.5465 0.8375 +vn 0.3313 -0.7489 -0.5739 +vn 0.3313 0.7489 -0.5739 +vn 0.6626 -0.7489 0.0000 +vn 0.6626 0.7489 0.0000 +vn 0.3313 -0.7489 0.5739 +vn 0.3313 0.7489 0.5739 +vn -0.3313 -0.7489 0.5739 +vn -0.3313 0.7489 0.5739 +vn -0.6626 -0.7489 0.0000 +vn -0.6626 0.7489 0.0000 +vn -0.3313 -0.7489 -0.5739 +vn -0.3313 0.7489 -0.5739 +g Cylinder_Cylinder_Side_Mat +usemtl Side_Mat +s off +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 5/4/2 6/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 10/7/3 9/8/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 11/12/5 12/11/5 14/13/5 13/14/5 +f 13/14/6 14/13/6 4/2/6 3/1/6 +f 10/15/7 8/16/7 12/17/7 +f 12/17/8 8/16/8 2/18/8 +f 2/18/1 8/16/1 14/19/1 +f 14/19/7 8/16/7 6/20/7 +f 14/19/9 6/20/9 2/18/9 +f 11/21/9 1/22/9 7/23/9 +f 7/23/1 1/22/1 13/24/1 +f 13/24/8 1/22/8 5/25/8 +f 9/8/7 7/23/7 11/21/7 +f 11/21/7 7/23/7 13/24/7 +f 13/24/7 7/23/7 5/25/7 +f 13/24/7 5/25/7 3/26/7 +g Cylinder_Cylinder_End_Mat +usemtl End_Mat +f 1/27/10 3/28/10 5/29/10 +f 2/30/11 6/31/11 4/32/11 +f 1/27/12 5/29/12 7/33/12 +f 2/30/13 8/34/13 6/31/13 +f 1/27/14 7/33/14 9/35/14 +f 2/30/15 10/36/15 8/34/15 +f 1/27/16 9/35/16 11/37/16 +f 2/30/17 12/38/17 10/36/17 +f 1/27/18 11/37/18 13/39/18 +f 2/30/19 14/40/19 12/38/19 +f 1/27/20 13/39/20 3/28/20 +f 2/30/21 4/32/21 14/40/21 diff --git a/mods/dfcaverns/df_mapitems/models/license.txt b/mods/dfcaverns/df_mapitems/models/license.txt new file mode 100644 index 0000000..99cd1e6 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/license.txt @@ -0,0 +1,3 @@ +All hex crystal models and the octagonal_coral model were created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. + +underch_crystal is from the [underch] (Underground Challenge) mod by Hume2 (https://gitlab.com/h2mm/underch) under the WTFPL license, relicened here to the MIT license \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/models/octagonal_coral.obj b/mods/dfcaverns/df_mapitems/models/octagonal_coral.obj new file mode 100644 index 0000000..b25bf74 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/octagonal_coral.obj @@ -0,0 +1,181 @@ +# Blender v2.79 (sub 0) OBJ File: 'octagonal_coral.blend' +# www.blender.org +g Cylinder.003_Cylinder.004 +v -0.120061 0.505000 -0.289852 +v 0.120061 0.505000 -0.289852 +v 0.289852 0.505000 -0.120061 +v 0.289852 0.505000 0.120061 +v 0.120060 0.505000 0.289852 +v -0.120061 0.505000 0.289852 +v -0.289852 0.505000 0.120061 +v -0.289852 0.505000 -0.120060 +v -0.120061 -0.250000 -0.289852 +v 0.120061 -0.250000 -0.289852 +v 0.289852 -0.250000 -0.120061 +v 0.289852 -0.250000 0.120061 +v 0.120060 -0.250000 0.289852 +v -0.120061 -0.250000 0.289852 +v -0.289852 -0.250000 0.120061 +v -0.289852 -0.250000 -0.120060 +vt 0.500000 1.000024 +vt 0.250000 1.000024 +vt 0.250000 -0.000024 +vt 0.500000 -0.000024 +vt 0.750000 1.000024 +vt 0.500000 1.000024 +vt 0.500000 -0.000024 +vt 0.750000 -0.000024 +vt 0.750000 1.000024 +vt 0.500000 1.000024 +vt 0.500000 -0.000024 +vt 0.750000 -0.000024 +vt 0.750000 1.000024 +vt 0.500000 1.000024 +vt 0.500000 -0.000024 +vt 0.750000 -0.000024 +vt 0.250000 1.000024 +vt 0.250000 -0.000024 +vt 0.750000 1.000024 +vt 0.750000 -0.000024 +vt 0.250000 1.000024 +vt 0.250000 -0.000024 +vt 0.250000 1.000024 +vt 0.250000 -0.000024 +s off +f 3/1 2/2 10/3 11/4 +f 8/5 7/6 15/7 16/8 +f 6/9 5/10 13/11 14/12 +f 2/13 1/14 9/15 10/16 +f 5/10 4/17 12/18 13/11 +f 4/19 3/1 11/4 12/20 +f 1/14 8/21 16/22 9/15 +f 7/6 6/23 14/24 15/7 +g Cylinder.002_Cylinder.003 +v -0.120061 0.505000 -0.289852 +v -0.292831 -0.505000 -0.706955 +v -0.292831 0.505000 -0.706955 +v 0.292830 -0.505000 -0.706955 +v 0.292830 0.505000 -0.706955 +v 0.706955 -0.505000 -0.292831 +v 0.706955 0.505000 -0.292831 +v 0.706955 -0.505000 0.292830 +v 0.706955 0.505000 0.292830 +v 0.292830 -0.505000 0.706955 +v 0.292830 0.505000 0.706955 +v -0.292831 -0.505000 0.706955 +v -0.292831 0.505000 0.706955 +v -0.706955 -0.505000 0.292831 +v -0.706955 0.505000 0.292831 +v -0.706955 -0.505000 -0.292830 +v -0.706955 0.505000 -0.292830 +v 0.120061 0.505000 -0.289852 +v 0.289852 0.505000 -0.120061 +v 0.289852 0.505000 0.120061 +v 0.120060 0.505000 0.289852 +v -0.120061 0.505000 0.289852 +v -0.289852 0.505000 0.120061 +v -0.289852 0.505000 -0.120060 +vt -0.207066 0.792876 +vt -0.207066 0.207124 +vt 0.210103 0.379921 +vt 0.210103 0.620079 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.207066 0.207124 +vt 1.207066 0.792876 +vt 0.789897 0.620079 +vt 0.789897 0.379921 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 -0.000000 +vt 0.792876 1.207066 +vt 0.207124 1.207066 +vt 0.379921 0.789897 +vt 0.620079 0.789897 +vt -0.000000 1.000000 +vt -0.000000 0.000000 +vt 0.207124 -0.207066 +vt 0.379921 0.210103 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.792876 -0.207066 +vt 0.620079 0.210103 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.000000 +vt -0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +s off +f 33/25 31/26 39/27 40/28 +f 18/29 19/30 21/31 20/32 +f 25/33 23/34 35/35 36/36 +f 20/37 21/38 23/39 22/40 +f 21/41 19/42 17/43 34/44 +f 22/40 23/39 25/45 24/46 +f 31/26 29/47 38/48 39/27 +f 24/49 25/50 27/51 26/52 +f 23/34 21/41 34/44 35/35 +f 26/52 27/51 29/53 28/54 +f 29/47 27/55 37/56 38/48 +f 28/57 29/58 31/59 30/60 +f 30/60 31/59 33/61 32/62 +f 27/55 25/33 36/36 37/56 +f 32/63 33/64 19/30 18/29 +f 19/42 33/25 40/28 17/43 +g Cylinder.001_Cylinder.002 +v 0.000000 -0.505000 0.000000 +v -0.292831 -0.505000 -0.706955 +v 0.292830 -0.505000 -0.706955 +v 0.706955 -0.505000 -0.292831 +v 0.706955 -0.505000 0.292830 +v 0.292830 -0.505000 0.706955 +v -0.292831 -0.505000 0.706955 +v -0.706955 -0.505000 0.292831 +v -0.706955 -0.505000 -0.292830 +vt 0.500000 0.500000 +vt 0.207147 1.207009 +vt 0.792853 1.207009 +vt 1.207009 0.792853 +vt 1.207009 0.207147 +vt 0.792853 -0.207009 +vt 0.207147 -0.207009 +vt -0.207009 0.207147 +vt -0.207009 0.792853 +s off +f 41/65 42/66 43/67 +f 41/65 43/67 44/68 +f 41/65 44/68 45/69 +f 41/65 45/69 46/70 +f 41/65 46/70 47/71 +f 41/65 47/71 48/72 +f 41/65 48/72 49/73 +f 41/65 49/73 42/66 +g Cylinder +v -0.120061 -0.250000 -0.289852 +v 0.120061 -0.250000 -0.289852 +v 0.289852 -0.250000 -0.120061 +v 0.289852 -0.250000 0.120061 +v 0.120060 -0.250000 0.289852 +v -0.120061 -0.250000 0.289852 +v -0.289852 -0.250000 0.120061 +v -0.289852 -0.250000 -0.120060 +vt 0.707087 0.999951 +vt 0.292913 0.999951 +vt 0.000049 0.707087 +vt 0.000049 0.292913 +vt 0.292913 0.000049 +vt 0.707087 0.000049 +vt 0.999951 0.292913 +vt 0.999951 0.707087 +s off +f 51/74 50/75 57/76 56/77 55/78 54/79 53/80 52/81 diff --git a/mods/dfcaverns/df_mapitems/models/underch_crystal.mtl b/mods/dfcaverns/df_mapitems/models/underch_crystal.mtl new file mode 100644 index 0000000..e0ac433 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/underch_crystal.mtl @@ -0,0 +1,32 @@ +# Blender MTL File: 'crystal.blend' +# Material Count: 3 + +newmtl Material +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Material.001 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Material.002 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_mapitems/models/underch_crystal.obj b/mods/dfcaverns/df_mapitems/models/underch_crystal.obj new file mode 100644 index 0000000..732c0c6 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/models/underch_crystal.obj @@ -0,0 +1,107 @@ +# Blender v2.76 (sub 0) OBJ File: 'crystal.blend' +# www.blender.org +mtllib underch_crystal.mtl +o Cube.001 +v 0.172286 -0.548977 -0.222058 +v 0.165892 -0.528919 0.010751 +v -0.065309 -0.563236 0.007358 +v -0.058916 -0.583294 -0.225451 +v 0.179327 0.201377 -0.503659 +v 0.171710 0.225272 -0.226315 +v -0.103720 0.184391 -0.230357 +v -0.096103 0.160496 -0.507701 +v 0.007959 0.394590 -0.413866 +v -0.238829 -0.557870 -0.066808 +v -0.011182 -0.528529 -0.111069 +v 0.036394 -0.554673 0.116299 +v -0.191253 -0.584014 0.160560 +v -0.549483 0.180196 -0.033148 +v -0.278287 0.215150 -0.085875 +v -0.221610 0.184005 0.184988 +v -0.492806 0.149051 0.237716 +v -0.434139 0.382762 0.109765 +v 0.032617 -0.584181 0.104827 +v -0.156722 -0.543012 -0.025937 +v -0.021474 -0.523372 -0.215584 +v 0.167865 -0.564541 -0.084819 +v 0.215590 0.116995 0.447251 +v -0.009969 0.166039 0.291472 +v 0.151151 0.189436 0.065547 +v 0.376709 0.140392 0.221326 +v 0.226702 0.351514 0.307113 +vt 0.500000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 -0.000000 +vt 0.500000 -0.000000 +vt 0.750000 0.750000 +vt 1.000000 0.750000 +vt 0.875000 1.000000 +vt 1.000000 -0.000000 +vt 0.750000 0.000000 +vt 0.500000 0.750000 +vt 0.250000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 -0.000000 +vt 0.125000 1.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.000000 0.250000 +vt 0.750000 0.250000 +vn 0.100900 -0.985800 -0.134500 +vn -0.225200 0.644000 -0.731100 +vn -0.186600 -0.033700 -0.981900 +vn 0.928000 0.338600 -0.155300 +vn 0.193700 -0.023500 0.980800 +vn -0.909500 -0.389400 0.145500 +vn -0.906600 0.353700 0.230400 +vn 0.113100 0.455200 0.883200 +vn 0.693400 0.717800 -0.062600 +vn 0.145000 -0.985400 0.088900 +vn 0.738800 0.672800 -0.037700 +vn 0.999600 0.000900 0.027400 +vn -0.058500 0.299800 0.952200 +vn -0.998000 -0.058400 -0.022400 +vn 0.065800 -0.351100 -0.934000 +vn -0.044200 0.388600 -0.920400 +vn -0.902700 0.425900 -0.061500 +vn -0.112500 0.686700 0.718200 +vn -0.095900 -0.980800 -0.169900 +vn -0.426000 0.478900 0.767600 +vn -0.586400 -0.226800 0.777700 +vn -0.769200 0.386900 -0.508500 +vn 0.584800 0.171100 -0.792900 +vn 0.753200 -0.436800 0.491900 +vn 0.759600 0.306700 0.573500 +vn 0.534200 0.615200 -0.579800 +vn -0.569200 0.754000 -0.327900 +usemtl Material.001 +s off +f 10/1/1 11/2/1 12/3/1 13/4/1 +f 15/5/2 14/6/2 18/7/2 +f 10/8/3 14/6/3 15/5/3 11/9/3 +f 11/9/4 15/5/4 16/10/4 12/4/4 +f 12/4/5 16/10/5 17/11/5 13/3/5 +f 14/12/6 10/13/6 13/3/6 17/11/6 +f 14/12/7 17/11/7 18/14/7 +f 17/11/8 16/10/8 18/15/8 +f 16/10/9 15/5/9 18/16/9 +usemtl Material +f 1/17/10 2/13/10 3/3/10 4/2/10 +f 6/10/11 5/5/11 9/16/11 +f 1/9/12 5/5/12 6/10/12 2/4/12 +f 2/4/13 6/10/13 7/11/13 3/3/13 +f 3/3/14 7/11/14 8/12/14 4/13/14 +f 5/5/15 1/9/15 4/8/15 8/6/15 +f 5/5/16 8/6/16 9/7/16 +f 8/12/17 7/11/17 9/14/17 +f 7/11/18 6/10/18 9/15/18 +usemtl Material.002 +f 19/4/19 20/9/19 21/18/19 22/1/19 +f 24/5/20 23/6/20 27/7/20 +f 19/8/21 23/6/21 24/5/21 20/9/21 +f 20/9/22 24/5/22 25/10/22 21/4/22 +f 21/4/23 25/10/23 26/11/23 22/3/23 +f 23/12/24 19/13/24 22/3/24 26/11/24 +f 23/12/25 26/11/25 27/14/25 +f 26/11/26 25/10/26 27/15/26 +f 25/10/27 24/5/27 27/16/27 diff --git a/mods/dfcaverns/df_mapitems/settingtypes.txt b/mods/dfcaverns/df_mapitems/settingtypes.txt new file mode 100644 index 0000000..29326e2 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/settingtypes.txt @@ -0,0 +1,5 @@ +#To disable glow worm growth, set this to 0. +dfcaverns_glow_worm_delay_multiplier (glow worm growth delay multiplier) float 10 +dfcaverns_snareweed_damage (Snareweed causes damage to player) bool true +dfcaverns_invulnerable_slade (Slade cannot be damaged) bool true +dfcaverns_destructive_pit_plasma (Pit plasma destroys adjacent nodes) bool false \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/snareweed.lua b/mods/dfcaverns/df_mapitems/snareweed.lua new file mode 100644 index 0000000..1b8dc22 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/snareweed.lua @@ -0,0 +1,75 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_mapitems:snareweed", { + description = S("Snareweed"), + _doc_items_longdesc = df_mapitems.doc.snareweed_desc, + _doc_items_usagehelp = df_mapitems.doc.snareweed_usage, + tiles = {df_dependencies.texture_dirt .. "^dfcaverns_snareweed_roots.png", df_dependencies.texture_dirt}, + drawtype="plantlike_rooted", + paramtype2 = "leveled", + special_tiles = {{name = "dfcaverns_snareweed.png", tileable_vertical = true}}, + is_ground_content = false, + drop = df_dependencies.node_name_dirt, + light_source = 6, + groups = {crumbly = 3, soil = 1, handy=1,shovely=1, dirt=1,}, + sounds = df_dependencies.sound_dirt(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, +}) + +if df_mapitems.config.snareweed_damage then + local timer = 0 + + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer >= 1 then + timer = timer - 1 + for _, player in pairs(minetest.get_connected_players()) do + local player_pos = player:get_pos() -- node player's feet are in this location. + local rounded_pos = vector.round(player_pos) + local nearby_nodes = minetest.find_nodes_in_area(vector.add(rounded_pos, {x=0, y= -8, z=0}), rounded_pos, {"df_mapitems:snareweed"}) + for _, node_pos in ipairs(nearby_nodes) do + local node = minetest.get_node(node_pos) + local distance = player_pos.y - node_pos.y + if distance <= node.param2/16 then + minetest.log("action", player:get_player_name() .. " takes 2 damage from snareweed at " .. minetest.pos_to_string(node_pos)) + player:set_hp(player:get_hp() - 2) + break + end + end + end + end + end) +end + + +local c_water = minetest.get_content_id(df_dependencies.node_name_water_source) +local c_dirt = minetest.get_content_id(df_dependencies.node_name_dirt) +local c_stone = minetest.get_content_id(df_dependencies.node_name_stone) +local c_snareweed = minetest.get_content_id("df_mapitems:snareweed") + +df_mapitems.place_snareweed = function(area, data, bi, param2_data) + local max_height = 0 + local index = bi + area.ystride + while area:containsi(index) and data[index] == c_water and max_height <= 8*16 do + index = index + area.ystride + max_height = max_height + 16 + end + if max_height > 0 then + data[bi] = c_snareweed + param2_data[bi] = math.min(math.random(3*16, 8*16), max_height) + else + data[bi] = c_dirt + end +end + +df_mapitems.place_snareweed_patch = function(area, data, bi, param2_data, radius) + local pos = area:position(bi) + for li in area:iterp(vector.add(pos, -radius), vector.add(pos, radius)) do + local adjacent = li + area.ystride + local node_type = data[li] + if math.random() < 0.1 and (node_type == c_stone or node_type == c_dirt) and data[adjacent] == c_water then + df_mapitems.place_snareweed(area, data, li, param2_data) + end + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/sounds/dfcaverns_slow_heartbeat.ogg b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_slow_heartbeat.ogg new file mode 100644 index 0000000..bb89890 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_slow_heartbeat.ogg differ diff --git a/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.1.ogg b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.1.ogg new file mode 100644 index 0000000..a43ccc4 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.1.ogg differ diff --git a/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.2.ogg b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.2.ogg new file mode 100644 index 0000000..b2a315a Binary files /dev/null and b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.2.ogg differ diff --git a/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.3.ogg b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.3.ogg new file mode 100644 index 0000000..6e0935f Binary files /dev/null and b/mods/dfcaverns/df_mapitems/sounds/dfcaverns_squish.3.ogg differ diff --git a/mods/dfcaverns/df_mapitems/sounds/license.txt b/mods/dfcaverns/df_mapitems/sounds/license.txt new file mode 100644 index 0000000..1e3ef90 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/sounds/license.txt @@ -0,0 +1,5 @@ +dfcaverns_squish.1.ogg - from https://freesound.org/people/DrMinky/sounds/167074/ by DrMinky under Creative Commons BY 3.0 +dfcaverns_squish.2.ogg - from https://freesound.org/people/DrMinky/sounds/167075/ by DrMinky under Creative Commons BY 3.0 +dfcaverns_squish.3.ogg - from https://freesound.org/people/DrMinky/sounds/167073/ by DrMinky under Creative Commons BY 3.0 + +slow heartbeat - https://freesound.org/people/daandraait/sounds/249716/ under CC0 \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_castle_coral.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_castle_coral.png new file mode 100644 index 0000000..76328d5 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_castle_coral.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_castle_coral_gradient.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_castle_coral_gradient.png new file mode 100644 index 0000000..a12ec9e Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_castle_coral_gradient.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_coral.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_coral.png new file mode 100644 index 0000000..2601ff7 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_coral.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_coral_end.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_coral_end.png new file mode 100644 index 0000000..64c4506 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_coral_end.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_moss.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_moss.png new file mode 100644 index 0000000..37c18d9 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_moss.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_pearl.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_pearl.png new file mode 100644 index 0000000..b300ea3 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_cave_pearl.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_dripstone_streaks.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_dripstone_streaks.png new file mode 100644 index 0000000..13b8fd4 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_dripstone_streaks.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_floor_fungus.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_floor_fungus.png new file mode 100644 index 0000000..0706d4b Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_floor_fungus.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_floor_fungus_fine.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_floor_fungus_fine.png new file mode 100644 index 0000000..9f71aa2 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_floor_fungus_fine.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_mese.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_mese.png new file mode 100644 index 0000000..1c1fb5c Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_mese.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby.png new file mode 100644 index 0000000..8d99e95 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby4x.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby4x.png new file mode 100644 index 0000000..2caab0b Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby4x.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby_ore.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby_ore.png new file mode 100644 index 0000000..5b08269 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby_ore.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby_quarter.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby_quarter.png new file mode 100644 index 0000000..23eae8f Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_ruby_quarter.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_worm.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_worm.png new file mode 100644 index 0000000..5db1a50 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_worm.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_worm_animated.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_worm_animated.png new file mode 100644 index 0000000..48470d7 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_glow_worm_animated.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_pebble_fungus.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_pebble_fungus.png new file mode 100644 index 0000000..ca73cb0 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_pebble_fungus.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_rock_rot.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_rock_rot.png new file mode 100644 index 0000000..eaf0515 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_rock_rot.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_sand_scum.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_sand_scum.png new file mode 100644 index 0000000..ef57b74 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_sand_scum.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_side_mask.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_side_mask.png new file mode 100644 index 0000000..71f16a5 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_side_mask.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_sponge_stone.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_sponge_stone.png new file mode 100644 index 0000000..c57882b Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_sponge_stone.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_stillworm.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_stillworm.png new file mode 100644 index 0000000..a1c19ef Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_ground_cover_stillworm.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_hoar_moss.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_hoar_moss.png new file mode 100644 index 0000000..b57d39c Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_hoar_moss.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_salt_crystal.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_salt_crystal.png new file mode 100644 index 0000000..44bd37c Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_salt_crystal.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_salty.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_salty.png new file mode 100644 index 0000000..ff7162e Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_salty.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_snareweed.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_snareweed.png new file mode 100644 index 0000000..206d8b7 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_snareweed.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_snareweed_roots.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_snareweed_roots.png new file mode 100644 index 0000000..7f08215 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_snareweed_roots.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/dfcaverns_veins.png b/mods/dfcaverns/df_mapitems/textures/dfcaverns_veins.png new file mode 100644 index 0000000..86173e6 Binary files /dev/null and b/mods/dfcaverns/df_mapitems/textures/dfcaverns_veins.png differ diff --git a/mods/dfcaverns/df_mapitems/textures/license.txt b/mods/dfcaverns/df_mapitems/textures/license.txt new file mode 100644 index 0000000..b77b0e1 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/textures/license.txt @@ -0,0 +1,9 @@ +All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. + +dfcaverns_glow_worm - copied from caverealms +dfcaverns_glow_worm_animated - glow worm texture overlaid with rippling animation derived from default mod's water texture +dfcaverns_glow_mese - from caverealms glow_mese +dfcaverns_glow_ruby, dfcaverns_glow_ruby4x, dfcaverns_glow_ruby_quarter - from caverealms glow_ruby +dfcaverns_glow_ruby_ore - from caverealms glow_ruby_ore +dfcaverns_salt_crystal - from caverealms +dfcaverns_salty - from caverealms with modified alpha channel \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/util.lua b/mods/dfcaverns/df_mapitems/util.lua new file mode 100644 index 0000000..a4723d3 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/util.lua @@ -0,0 +1,132 @@ +-- Used by cave pearls and crystal clusters +-- These methods simulate "wallmounted" nodes using regular facedir, randomizing the rotation around the wallmounted direction. +-- Useful for naturalistic objects you want to have look irregular + +df_mapitems.place_against_surface = function(itemstack, placer, pointed_thing) + -- check if pointing at a node + if not pointed_thing then + return itemstack + end + if pointed_thing.type ~= "node" then + return itemstack + end + + local under_pos = pointed_thing.under + local above_pos = pointed_thing.above + + local under_node = minetest.get_node(under_pos) + local above_node = minetest.get_node(above_pos) + + if minetest.is_protected(above_pos, placer:get_player_name()) then + minetest.record_protection_violation(above_pos, placer:get_player_name()) + return + end + + local under_name = under_node.name + local above_name = above_node.name + local under_def = minetest.registered_nodes[under_name] + local above_def = minetest.registered_nodes[above_name] + + -- return if any of the nodes is not registered + if not under_def or not above_def then + return itemstack + end + -- check if you can replace the node above the pointed node + if not above_def.buildable_to then + return itemstack + end + + local dir = vector.subtract(under_pos, above_pos) + local param2 + if dir.x > 0 then + --facing +x: 16, 17, 18, 19, + param2 = 15 + math.random(1,4) + elseif dir.x < 0 then + --facing -x: 12, 13, 14, 15 + param2 = 11 + math.random(1,4) + elseif dir.z > 0 then + --facing +z: 8, 9, 10, 11 + param2 = 7 + math.random(1,4) + elseif dir.z < 0 then + --facing -z: 4, 5, 6, 7 + param2 = 3 + math.random(1,4) + elseif dir.y > 0 then + --facing -y: 20, 21, 22, 23 (ceiling) + param2 = 19 + math.random(1,4) + else + --facing +y: 0, 1, 2, 3 (floor) + param2 = math.random(1,4) - 1 + end + -- add the node and remove 1 item from the itemstack + minetest.add_node(above_pos, {name = itemstack:get_name(), param2 = param2}) + if not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + return itemstack +end + +-- Mapgen version of the above + +local add_to_table = function(dest, source) + for _, val in ipairs(source) do + table.insert(dest, val) + end +end + +local valid_nodes = {} -- cache values +local is_valid_mounting_node = function(c_node) + if valid_nodes[c_node] ~= nil then + return valid_nodes[c_node] + end + local def = minetest.registered_nodes[minetest.get_name_from_content_id(c_node)] + if def ~= nil + and (def.drawtype == "normal" or def.drawtype == nil) + and not def.buildable_to + and not (def.groups and def.groups.falling_node) then + valid_nodes[c_node] = true + return true + end + valid_nodes[c_node] = false + return false +end + +--facing +x: 16, 17, 18, 19, +--facing -x: 12, 13, 14, 15 +--facing +z: 8, 9, 10, 11 +--facing -z: 4, 5, 6, 7 +--facing -y: 20, 21, 22, 23, (ceiling) +--facing +y: 0, 1, 2, 3 + +local get_valid_facedirs_vm = function(vi, area, data) + local dirs = {} + local ystride = area.ystride + local zstride = area.zstride + if is_valid_mounting_node(data[vi+1]) then + add_to_table(dirs, {16, 17, 18, 19}) + end + if is_valid_mounting_node(data[vi-1]) then + add_to_table(dirs, {12, 13, 14, 15}) + end + if is_valid_mounting_node(data[vi-ystride]) then + add_to_table(dirs, {0, 1, 2, 3}) + end + if is_valid_mounting_node(data[vi+ystride]) then + add_to_table(dirs, {20, 21, 22, 23}) + end + if is_valid_mounting_node(data[vi+zstride]) then + add_to_table(dirs, {8, 9, 10, 11}) + end + if is_valid_mounting_node(data[vi-zstride]) then + add_to_table(dirs, {4, 5, 6, 7}) + end + return dirs +end + +df_mapitems.place_against_surface_vm = function(c_node, vi, area, data, data_param2) + local facedirs = get_valid_facedirs_vm(vi, area, data) + local count = #facedirs + if count > 0 then + data[vi] = c_node + data_param2[vi] = facedirs[math.random(1, count)] + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_mapitems/veinstone.lua b/mods/dfcaverns/df_mapitems/veinstone.lua new file mode 100644 index 0000000..4df71f9 --- /dev/null +++ b/mods/dfcaverns/df_mapitems/veinstone.lua @@ -0,0 +1,81 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- overridden to trigger an achievement, without making achievements a dependency of this mod +df_mapitems.on_veinstone_punched = function() +end + +minetest.register_node("df_mapitems:veinstone", { + description = S("Veinstone"), + _doc_items_longdesc = df_mapitems.doc.veinstone_desc, + _doc_items_usagehelp = df_mapitems.doc.veinstone_usage, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_veins.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, + is_ground_content = false, + light_source = 2, + drop = "df_mapitems:veinstone", + sounds = df_dependencies.sound_stone(), + on_punch = function(pos, node, puncher, pointed_thing) + minetest.node_punch(pos, node, puncher, pointed_thing) + minetest.swap_node(pos, {name="df_mapitems:veinstone_pulse"}) + minetest.get_node_timer(pos):start(2) + minetest.sound_play({name="dfcaverns_slow_heartbeat", gain=0.5}, {pos = pos}) + df_mapitems.on_veinstone_punched(pos, node, puncher, pointed_thing) + end, + _mcl_blast_resistance = 10, + _mcl_hardness = 3, +}) + +minetest.register_node("df_mapitems:veinstone_pulse", { + description = S("Veinstone"), + _doc_items_longdesc = df_mapitems.doc.veinstone_desc, + _doc_items_usagehelp = df_mapitems.doc.veinstone_usage, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_veins.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, not_in_creative_inventory = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, + is_ground_content = false, + light_source = 8, + drop = "df_mapitems:veinstone", + sounds = df_dependencies.sound_stone(), + on_timer = function(pos, elapsed) + local positions, count = minetest.find_nodes_in_area(vector.add(pos,1), vector.subtract(pos,1), "df_mapitems:veinstone") + if count["df_mapitems:veinstone"] == 0 then + positions, count = minetest.find_nodes_in_area(vector.add(pos,2), vector.subtract(pos,2), "df_mapitems:veinstone") + end + if count["df_mapitems:veinstone"] == 0 then + positions = {[1] = minetest.find_node_near(pos, 3, "df_mapitems:veinstone")} + end + if positions[1] == nil then + positions = {[1] = minetest.find_node_near(pos, 4, "df_mapitems:veinstone")} + end + if (positions[1] ~= nil) then + minetest.sound_play({name="dfcaverns_slow_heartbeat", gain=0.5}, {pos = pos}) + end + for _, neighbor_pos in pairs(positions) do + minetest.swap_node(neighbor_pos, {name="df_mapitems:veinstone_pulse"}) + minetest.get_node_timer(neighbor_pos):start(2) + end + minetest.swap_node(pos, {name="df_mapitems:veinstone_refractory"}) + minetest.get_node_timer(pos):start(12) + end, + _mcl_blast_resistance = 10, + _mcl_hardness = 3, +}) + +minetest.register_node("df_mapitems:veinstone_refractory", { + description = S("Veinstone"), + _doc_items_longdesc = df_mapitems.doc.veinstone_desc, + _doc_items_usagehelp = df_mapitems.doc.veinstone_usage, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_veins.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, not_in_creative_inventory = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, + is_ground_content = false, + light_source = 1, + drop = "df_mapitems:veinstone", + sounds = df_dependencies.sound_stone(), + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="df_mapitems:veinstone"}) + end, + _mcl_blast_resistance = 10, + _mcl_hardness = 3, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/ceiling_fungus.lua b/mods/dfcaverns/df_primordial_items/ceiling_fungus.lua new file mode 100644 index 0000000..4b590e2 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/ceiling_fungus.lua @@ -0,0 +1,117 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +--------------------------------------------------------------------------------------- +-- Glownode and stalk + +minetest.register_node("df_primordial_items:glownode", { + description = S("Primordial Fungal Lantern"), + _doc_items_longdesc = df_primordial_items.doc.glownode_desc, + _doc_items_usagehelp = df_primordial_items.doc.glownode_usage, + drawtype = "glasslike", + tiles = {"dfcaverns_mush_glownode.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy=1, glass=1, building_block=1, material_glass=1}, + sounds = df_dependencies.sound_glass(), + light_source = minetest.LIGHT_MAX, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, +}) + +minetest.register_node("df_primordial_items:glownode_stalk", { + description = S("Primordial Fungal Lantern Stalk"), + _doc_items_longdesc = df_primordial_items.doc.glownode_stalk_desc, + _doc_items_usagehelp = df_primordial_items.doc.glownode_stalk_usage, + tiles = {"dfcaverns_mush_stalk_top.png", "dfcaverns_mush_stalk_top.png", "dfcaverns_mush_stalk_side.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1,building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_primordial_items:glow_orb_hanging", { + description = S("Primordial Fungal Orb"), + _doc_items_longdesc = df_primordial_items.doc.glow_orb_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_orb_usage, + tiles = {"dfcaverns_mush_orb_vert.png"}, + inventory_image = "dfcaverns_mush_orb_vert.png", + wield_image = "dfcaverns_mush_orb_vert.png", + groups = {snappy = 3, flammable = 1, attached_node = 1, plant = 1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + paramtype = "light", + paramtype2 = "degrotate", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + light_source = 6, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +local c_stalk = minetest.get_content_id("df_primordial_items:glownode_stalk") +local c_node = minetest.get_content_id("df_primordial_items:glownode") +local c_air = minetest.get_content_id("air") + +df_primordial_items.spawn_ceiling_spire_vm = function(vi, area, data) + local spire_height = math.random(1,10) + + local ystride = area.ystride + local zstride = area.zstride + + for i = 0, spire_height do + if data[vi-i*ystride] == c_air then + data[vi-i*ystride] = c_stalk + end + end + local bottom = vi - (spire_height +1) * ystride + if data[bottom] == c_air then + data[bottom] = c_node + end + + if spire_height > 4 then -- thicken it all up + for i = 0, math.floor(spire_height/2) do + local current_vi = vi-i*ystride + if data[current_vi+1] == c_air then + data[current_vi+1] = c_stalk + end + if data[current_vi-1] == c_air then + data[current_vi-1] = c_stalk + end + if data[current_vi+zstride] == c_air then + data[current_vi+zstride] = c_stalk + end + if data[current_vi-zstride] == c_air then + data[current_vi-zstride] = c_stalk + end + end + + if spire_height > 7 then + bottom = bottom-ystride + if data[bottom] == c_air then + data[bottom] = c_node + end + if data[bottom-ystride] == c_air then + data[bottom-ystride] = c_node + end + if data[bottom+1] == c_air then + data[bottom+1] = c_node + end + if data[bottom-1] == c_air then + data[bottom-1] = c_node + end + if data[bottom+zstride] == c_air then + data[bottom+zstride] = c_node + end + if data[bottom-zstride] == c_air then + data[bottom-zstride] = c_node + end + end + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/doc.lua b/mods/dfcaverns/df_primordial_items/doc.lua new file mode 100644 index 0000000..1877816 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/doc.lua @@ -0,0 +1,80 @@ +if not minetest.get_modpath("doc") then + return +end + +local S = minetest.get_translator(minetest.get_current_modname()) + +df_primordial_items.doc.big_mushroom_desc = S("Compared to the behemoths found elsewhere in the deep places of the world, the giant mushrooms of the primordial jungles are on the smaller side - often overwhelmed by the green plants that grow in the mysterious light below. Still, they can become substantial resources.") +df_primordial_items.doc.big_mushroom_usage = S("The soft flesh of these large mushrooms is much less woody than other giant mushrooms, making it ill-suited to structural use. This makes it rather more nutritious, however.") + +df_primordial_items.doc.dirt_with_jungle_grass_desc = S("The soil of the primordial jungle is rife with strange life at every scale.") +df_primordial_items.doc.dirt_with_jungle_grass_usage = S("When left uncultivated primordial jungle soil will sprout all manner of strange wild plants.") +df_primordial_items.doc.dirt_with_mycelium_desc = S("Fungal fibers have infiltrated the ground in a spongy mass, making the soil half mineral and half living matter.") +df_primordial_items.doc.dirt_with_mycelium_usage = S("When left uncultivated mycelial soil will sprout all manner of strange wild fungi.") + +df_primordial_items.doc.fern_desc = S("The dark-leaved ferns of the primordial jungle harken back to an earlier era of life in the world.") +--df_primordial_items.doc.fern_usage = +df_primordial_items.doc.grass_desc = S("These fibrous plants that grow in the deep appear similar to grass at a glance, but they are more closely related to horsetails - a form of vegetation from before the advent of modern plant forms. Ironically, pale cave wheat is more kin to surface grass than this is.") +--df_primordial_items.doc.grass_usage = + +df_primordial_items.doc.ivy_desc = S("Tangled weaves of ivy hang from the ceiling where there are wide enough gaps between the bright sources of light.") +df_primordial_items.doc.ivy_usage = S("Ivy is climbable, if it hangs close enough to the ground it can serve as a path between floor and ceiling.") +df_primordial_items.doc.roots_desc = S("Somewhere above an enormous plant has wedged its roots down through the rock and emerged from the ceiling of another cavern.") +df_primordial_items.doc.roots_usage = S("These hanging roots are climbable.") + +df_primordial_items.doc.fungal_grass_desc = S("Questing fibers of fungal mycelium sometimes erupt from the soil and reach upward, driven by chemical cues to seek out nourishment above. They look a lot like white grass, at a glance.") +--df_primordial_items.doc.fungal_grass_usage = + +df_primordial_items.doc.tree_desc = S("The large woody plants of the primordial jungle are similar in appearance to the jungle trees of the surface, but are a result of convergent evolution from ancient cycad plants toward a common form.") +df_primordial_items.doc.tree_usage = S("Like wood of the surface world, primordial jungle trees can be chopped and carved as building material or as fuel.") +df_primordial_items.doc.tree_glowing_desc = S("The cracks in the bark of some primordial jungle trees become host to phosphorescent veins of symbiotic fungus.") +df_primordial_items.doc.tree_glowing_usage = S("The glowing bark fungus doesn't extend into the wood of the trunk, resulting in surprisingly mundane building material when hewn.") +--df_primordial_items.doc.leaves_desc = +--df_primordial_items.doc.leaves_usage = +df_primordial_items.doc.glowing_leaves_desc = S("Some fronds of primordial jungle trees also become host to the phosphorescent fungus that creeps through cracks in the bark.") +--df_primordial_items.doc.glowing_leaves_usage = + +df_primordial_items.doc.giant_fern_desc = S("The still air of these ancient caverns have allowed ferns to grow to prodigious sizes, where storms and rain would normally tear their weaker fronds off on the surface of the world.") +df_primordial_items.doc.giant_fern_usage = S("When a fern grows to such sizes its stem becomes dense enough to be used as a form of wood.") + +df_primordial_items.doc.giant_hyphae_desc = S("Fungus in its purest form, these gigantic rope-like hyphae creep over the surface of soil and burrow in to feed wherever nutrients are sensed.") +df_primordial_items.doc.giant_hyphae_usage = S("Much like a rope, hyphae have fibers inside that can be unraveled and used for a variety of crafts.") +df_primordial_items.doc.mycelial_fibers_desc = S("Fibers extracted from gigantic fungal hyphae.") +--df_primordial_items.doc.mycelial_fibers_usage = +df_primordial_items.doc.mycelial_thread_desc = df_primordial_items.doc.mycelial_fibers_desc +--df_primordial_items.doc.mycelial_thread_usage = + +df_primordial_items.doc.giant_mushroom_desc = S("The grandest of the great mushroom species can be found in the deepest primordial caverns. Their broad caps have hanging gills.") +df_primordial_items.doc.giant_mushroom_usage = S("Much like the giant mushrooms of higher cavern layers, these can be carved into woody material for use as fuel or for building things. The grain of these primordial mushrooms is knurled.") +--df_primordial_items.doc.gills_desc = +--df_primordial_items.doc.gills_usage = + +--df_primordial_items.doc.glow_orb_desc = +--df_primordial_items.doc.glow_orb_usage = +--df_primordial_items.doc.glow_plant_desc = +--df_primordial_items.doc.glow_plant_usage = +--df_primordial_items.doc.glow_pod_desc = +--df_primordial_items.doc.glow_pod_usage = + +-- The giant hanging fungal structures from the ceiling +--df_primordial_items.doc.glownode_desc = +--df_primordial_items.doc.glownode_usage = +--df_primordial_items.doc.glownode_stalk_desc = +--df_primordial_items.doc.glownode_stalk_usage = + +df_primordial_items.doc.packed_roots_desc = S("The steady light and unchanging growing conditions of the primordial caverns have led to great mountainous masses of plant material growing in particularly fertile spots, hardly identifiable as individual organisms.") +df_primordial_items.doc.packed_roots_usage = S("The gnarled interwoven root-like foundations of this plant material is not useful as building material, but can serve as a fuel source.") +df_primordial_items.doc.plant_matter_desc = df_primordial_items.doc.packed_roots_desc +df_primordial_items.doc.plant_matter_usage = df_primordial_items.doc.packed_roots_usage + +--df_primordial_items.doc.small_mushroom_desc = +--df_primordial_items.doc.small_mushroom_usage = +-- +--df_primordial_items.doc.thorn_desc = +--df_primordial_items.doc.thorn_usage = + +df_primordial_items.doc.primordial_fruit_desc = S("This strange fruit from the depths has absorbed healthful energies.") +df_primordial_items.doc.primordial_fruit_usage = S("Eating this fruit will improve your vitality.") + +df_primordial_items.doc.glowtato_desc = S("A strangely glowing starchy nodule from a plant that grew deeper than any plant has a right to.") +df_primordial_items.doc.glowtato_usage = S("Much energy is contained in this tuber. It tastes surprisingly good, too. You could cook with it but any change in its pure state would only reduce its value.") diff --git a/mods/dfcaverns/df_primordial_items/edibles.lua b/mods/dfcaverns/df_primordial_items/edibles.lua new file mode 100644 index 0000000..d6ca05d --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/edibles.lua @@ -0,0 +1,25 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_craftitem("df_primordial_items:primordial_fruit", { + description = S("Primordial Fruit"), + _doc_items_longdesc = df_primordial_items.doc.primordial_fruit_desc, + _doc_items_usagehelp = df_primordial_items.doc.primordial_fruit_usage, + inventory_image = "dfcaverns_primordial_fruit.png", + groups = {food = 8, eatable=8, plant=1}, + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + on_use = minetest.item_eat(8), + _hunger_ng = {heals = 8}, + _mcl_saturation = 12, +}) + +minetest.register_craftitem("df_primordial_items:glowtato", { + description = S("Glowtato"), + _doc_items_longdesc = df_primordial_items.doc.glowtato_desc, + _doc_items_usagehelp = df_primordial_items.doc.glowtato_usage, + inventory_image = "dfcaverns_glowtato.png", + sound = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}, + groups = {food = 8, dfcaverns_cookable = 1, eatable=8, plant=1}, + on_use = minetest.item_eat(8), + _hunger_ng = {satiates = 8}, + _mcl_saturation = 8, +}) diff --git a/mods/dfcaverns/df_primordial_items/fungal_nodes.lua b/mods/dfcaverns/df_primordial_items/fungal_nodes.lua new file mode 100644 index 0000000..6cda843 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/fungal_nodes.lua @@ -0,0 +1,174 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +----------------------------------------------------------------------------------------------- +-- Plants + +-- Grass + +minetest.register_node("df_primordial_items:fungal_grass_1", { + description = S("Primordial Fungal Grass"), + _doc_items_longdesc = df_primordial_items.doc.fungal_grass_desc, + _doc_items_usagehelp = df_primordial_items.doc.fungal_grass_usage, + tiles = {"dfcaverns_mush_grass_01.png"}, + inventory_image = "dfcaverns_mush_grass_01.png", + wield_image = "dfcaverns_mush_grass_01.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:fungal_grass_2", { + description = S("Primordial Fungal Grass"), + _doc_items_longdesc = df_primordial_items.doc.fungal_grass_desc, + _doc_items_usagehelp = df_primordial_items.doc.fungal_grass_usage, + tiles = {"dfcaverns_mush_grass_02.png"}, + inventory_image = "dfcaverns_mush_grass_02.png", + wield_image = "dfcaverns_mush_grass_02.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + place_param2 = 3, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +-- Glowing + +minetest.register_node("df_primordial_items:glow_orb", { + description = S("Primordial Fungal Orb"), + _doc_items_longdesc = df_primordial_items.doc.glow_orb_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_orb_usage, + tiles = {"dfcaverns_mush_orb.png"}, + inventory_image = "dfcaverns_mush_orb.png", + wield_image = "dfcaverns_mush_orb.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + light_source = 9, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:glow_orb_stalks", { + description = S("Primordial Fungal Orb"), + _doc_items_longdesc = df_primordial_items.doc.glow_orb_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_orb_usage, + tiles = {"dfcaverns_mush_stalks.png"}, + inventory_image = "dfcaverns_mush_stalks.png", + wield_image = "dfcaverns_mush_stalks.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + light_source = 6, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:glow_pods", { + description = S("Primordial Fungal Pod"), + _doc_items_longdesc = df_primordial_items.doc.glow_pod_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_pod_usage, + tiles = {"dfcaverns_mush_pods.png"}, + inventory_image = "dfcaverns_mush_pods.png", + wield_image = "dfcaverns_mush_pods.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + paramtype = "light", + drawtype = "plantlike", + drop = { + max_items = 2, + items = { + { + rarity = 3, + items = {"df_primordial_items:primordial_fruit"}, + }, + { + rarity = 3, + items = {"df_primordial_items:primordial_fruit"}, + }, + }, + }, + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + light_source = 6, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +------------------------------------------------------------------------------------ +-- Dirt + +minetest.register_node("df_primordial_items:dirt_with_mycelium", { + description = S("Dirt with Primordial Mycelium"), + _doc_items_longdesc = df_primordial_items.doc.dirt_with_mycelium_desc, + _doc_items_usagehelp = df_primordial_items.doc.dirt_with_mycelium_usage, + tiles = {"dfcaverns_mush_soil.png"}, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 13, handy=1,shovely=1, dirt=2, building_block=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_dirt, + is_ground_content = false, + paramtype = "light", + drop = df_dependencies.node_name_dirt, + sounds = df_dependencies.sound_dirt(), + light_source = 3, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, +}) + +minetest.register_abm{ + label = "df_primordial_items:dirt_with_mycelium_spread", + nodenames = {df_dependencies.node_name_dirt}, + neighbors = {"df_primordial_items:dirt_with_mycelium"}, + interval = 60, + chance = 50, + catch_up = true, + action = function(pos) + minetest.swap_node(pos, {name="df_primordial_items:dirt_with_mycelium"}) + end, +} + +if minetest.get_modpath("footprints") then + local HARDPACK_PROBABILITY = minetest.settings:get("footprints_hardpack_probability") or 0.9 -- Chance walked dirt/grass is worn and compacted to footprints:trail. + local HARDPACK_COUNT = minetest.settings:get("footprints_hardpack_count") or 10 -- Number of times the above chance needs to be passed for soil to compact. + + footprints.register_trample_node("df_primordial_items:dirt_with_mycelium", { + trampled_node_def_override = {description = S("Dirt with Primordial Mycelium and Footprint"),}, + footprint_opacity = 196, + hard_pack_node_name = "footprints:trail", + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT, + }) +end diff --git a/mods/dfcaverns/df_primordial_items/giant_fern.lua b/mods/dfcaverns/df_primordial_items/giant_fern.lua new file mode 100644 index 0000000..863b0e8 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/giant_fern.lua @@ -0,0 +1,351 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +------------------------------------------------------------------------------------ +-- Nodes + +minetest.register_node("df_primordial_items:giant_fern_tree", { + description = S("Giant Fern Stem"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + tiles = {"dfcaverns_jungle_fern_stem.png","dfcaverns_jungle_fern_stem.png","dfcaverns_jungle_fern_bark.png",}, + groups = {tree=1, choppy=2, oddly_breakable_by_hand=1, flammable= 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + sounds = df_dependencies.sound_wood(), + sunlight_propagates = true, + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +minetest.register_node("df_primordial_items:giant_fern_tree_slant_bottom", { + description = S("Giant Fern Stem"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + tiles = { + "dfcaverns_jungle_fern_stem.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_stem.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + }, + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "dfcaverns_fern_slant.obj", + paramtype = "light", + drop = "df_primordial_items:giant_fern_tree", + groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + is_ground_content = false, + on_place = minetest.rotate_node, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375}, + {-0.5, 0.0, -0.875, 0.5, 0.5, 0.125}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375}, + {-0.5, 0.0, -0.875, 0.5, 0.5, 0.125}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +minetest.register_node("df_primordial_items:giant_fern_tree_slant_top", { + description = S("Giant Fern Stem"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + tiles = { + "dfcaverns_jungle_fern_stem.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_stem.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + }, + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "dfcaverns_fern_slant_2.obj", + paramtype = "light", + drop = "df_primordial_items:giant_fern_tree", + groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + is_ground_content = false, + on_place = minetest.rotate_node, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.0, 0.875}, + {-0.5, 0.0, -0.375, 0.5, 0.5, 0.625}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.0, 0.875}, + {-0.5, 0.0, -0.375, 0.5, 0.5, 0.625}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +minetest.register_node("df_primordial_items:giant_fern_tree_slant_full", { + description = S("Giant Fern Stem"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + tiles = { + "dfcaverns_jungle_fern_stem.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + "dfcaverns_jungle_fern_bark.png", + }, + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "dfcaverns_fern_slant_full.obj", + paramtype = "light", + drop = "df_primordial_items:giant_fern_tree", + groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + is_ground_content = false, + on_place = minetest.rotate_node, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.75, 0.5, 0, 0.25}, + {-0.5, 0, -1.25, 0.5, 0.5, -0.25}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.75, 0.5, 0, 0.25}, + {-0.5, 0, -1.25, 0.5, 0.5, -0.25}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +minetest.register_node("df_primordial_items:fern_wood", { + description = S("Fern Wood"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + paramtype2 = "facedir", + tiles = {df_dependencies.texture_wood .. "^[multiply:#10FF10"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=10}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 1, +}) + +minetest.register_craft({ + output = "df_primordial_items:fern_wood 4", + recipe = { + {"group:fern_stem"}, + } +}) + +df_dependencies.register_all_stairs_and_fences("fern_wood", {burntime=7}) + +minetest.register_node("df_primordial_items:giant_fern_leaves", { + description = S("Giant Fern Leaves"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + tiles = {"dfcaverns_jungle_fern_leaves_01.png"}, + visual_scale = 1.41, + inventory_image = "dfcaverns_jungle_fern_leaves_01.png", + wield_image = "dfcaverns_jungle_fern_leaves_01.png", + groups = {snappy = 3, leafdecay = 2, flammable = 2, leaves = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + is_ground_content = false, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + walkable = false, + waving = 2, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/10 chance + items = {"df_primordial_items:fern_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:giant_fern_leaves"}, + } + } + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree"}, + leaves = {"df_primordial_items:giant_fern_leaves"}, + radius = 2, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:fern_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "group:fern_stem", + burntime = 28, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:giant_fern_leaves", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:fern_sapling", + burntime = 2, +}) +------------------------------------------------------------------------------------ +-- Schematics + +local n1 = { name = "air", prob = 0 } +local n2 = { name = "df_primordial_items:giant_fern_leaves" } +local n3 = { name = "df_primordial_items:giant_fern_tree_slant_top" } +local n4 = { name = "df_primordial_items:giant_fern_tree_slant_full" } +local n5 = { name = "df_primordial_items:giant_fern_tree" } +local n6 = { name = "df_primordial_items:giant_fern_tree_slant_bottom" } + + +local fern_4_nodes_tall = { + size = {y = 4, x = 3, z = 4}, + center_pos = {y = 0, x = 1, z = 3}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, + n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n2, n3, n2, n1, n4, n1, n1, + n1, n1, n1, n6, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + } +} + +local fern_5_nodes_tall = { + size = {y = 5, x = 3, z = 4}, + center_pos = {y = 0, x = 1, z = 3}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n2, n3, n2, n1, n4, n1, n1, n1, n1, n1, n5, n1, n2, n6, n2, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + } +} + +local fern_6_nodes_tall = { + size = {y = 6, x = 5, z = 4}, + center_pos = {y = 0, x = 2, z = 3}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n2, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n2, n3, n2, n2, n1, n1, n4, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n2, n5, n2, n1, n2, n2, + n6, n2, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, + } +} + +local fern_9_nodes_tall = { + size = {y = 9, x = 5, z = 5}, + center_pos = {y = 0, x = 2, z = 4}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n2, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n2, n2, n3, n2, n2, n1, n1, n4, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n2, n2, n3, n2, n2, n2, n2, n6, n2, n2, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, + n5, n1, n1, n1, n2, n5, n2, n1, n1, n2, n6, n2, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, + } +} + +local ferns = {fern_4_nodes_tall, fern_5_nodes_tall, fern_6_nodes_tall, fern_9_nodes_tall} +local rotations = {0, 90, 180, 270} + +df_primordial_items.get_fern_schematic = function() + return ferns[math.random(1,4)] +end + +minetest.register_node("df_primordial_items:fern_sapling", { + description = S("Giant Fern Sapling"), + _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, + tiles = {"dfcaverns_jungle_fern_03.png"}, + inventory_image = "dfcaverns_jungle_fern_03.png", + wield_image = "dfcaverns_jungle_fern_03.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13, attached_node=1,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_construct = function(pos) + if df_primordial_items.giant_fern_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + on_timer = function(pos, elapsed) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + + if minetest.get_node_light(pos) > 6 then + df_primordial_items.spawn_giant_fern(pos) + else + minetest.get_node_timer(pos):start(df_trees.config.tree_min_growth_delay) + end + end, +}) + +df_primordial_items.spawn_giant_fern = function(pos) + local fern = df_primordial_items.get_fern_schematic() + local rotation = rotations[math.random(1,#rotations)] + minetest.set_node(pos, {name="air"}) -- clear sapling so fern can replace it + mapgen_helper.place_schematic(pos, fern, rotation) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/giant_mycelium.lua b/mods/dfcaverns/df_primordial_items/giant_mycelium.lua new file mode 100644 index 0000000..d41c577 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/giant_mycelium.lua @@ -0,0 +1,441 @@ +-- This file defines a type of root-like growth that spreads over the surface of the ground in a random web-like pattern + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- hub_thickness -- the bit in the middle that's seen at the ends and corners of long hypha runs +-- connector_thickness +local get_node_box = function(hub_thickness, connector_thickness) + return { + type = "connected", + fixed = {-hub_thickness,-hub_thickness,-hub_thickness,hub_thickness,hub_thickness,hub_thickness}, + connect_top = {-connector_thickness, 0, -connector_thickness, connector_thickness, 0.5, connector_thickness}, + connect_bottom = {-connector_thickness, -0.5, -connector_thickness, connector_thickness, 0, connector_thickness}, + connect_back = {-connector_thickness, -connector_thickness, 0, connector_thickness, connector_thickness, 0.5}, + connect_right = {0, -connector_thickness, -connector_thickness, 0.5, connector_thickness, connector_thickness}, + connect_front = {-connector_thickness, -connector_thickness, -0.5, connector_thickness, connector_thickness, 0}, + connect_left = {-0.5, -connector_thickness, -connector_thickness, 0, connector_thickness, connector_thickness}, + disconnected = {-connector_thickness, -connector_thickness, -connector_thickness, connector_thickness, connector_thickness, connector_thickness}, + } +end + +minetest.register_node("df_primordial_items:giant_hypha_root", { + description = S("Rooted Giant Hypha"), + _doc_items_longdesc = df_primordial_items.doc.giant_hyphae_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_hyphae_usage, + tiles = { + {name="dfcaverns_mush_giant_hypha.png"}, + }, + connects_to = {"group:soil", "group:hypha"}, + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + drawtype = "nodebox", + node_box = get_node_box(0.1875, 0.25), + collision_box = get_node_box(0.125, 0.1875), + paramtype = "light", + light_source = 2, + is_ground_content = false, + climbable = true, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:mycelial_fibers","df_primordial_items:giant_hypha_apical_meristem"}, + rarity = 100, + }, + { + items = {"df_primordial_items:mycelial_fibers"}, + }, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) +minetest.register_node("df_primordial_items:giant_hypha", { + description = S("Giant Hypha"), + _doc_items_longdesc = df_primordial_items.doc.giant_hyphae_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_hyphae_usage, + tiles = { + {name="dfcaverns_mush_giant_hypha.png"}, + }, + connects_to = {"group:hypha"}, + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + drawtype = "nodebox", + node_box = get_node_box(0.1875, 0.25), + collision_box = get_node_box(0.125, 0.1875), + paramtype = "light", + light_source = 2, + is_ground_content = false, + climbable = true, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:mycelial_fibers","df_primordial_items:giant_hypha_apical_meristem"}, + rarity = 100, + }, + { + items = {"df_primordial_items:mycelial_fibers"}, + }, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_craftitem("df_primordial_items:mycelial_fibers", { + description = S("Giant Mycelial Fibers"), + _doc_items_longdesc = df_primordial_items.doc.mycelial_fibers_desc, + _doc_items_usagehelp = df_primordial_items.doc.mycelial_fibers_usage, + groups = {wool = 1}, + inventory_image = "dfcaverns_mush_mycelial_fibers.png", +}) + +minetest.register_craftitem("df_primordial_items:mycelial_thread", { + description = S("Mycelial thread"), + _doc_items_longdesc = df_primordial_items.doc.mycelial_thread_desc, + _doc_items_usagehelp = df_primordial_items.doc.mycelial_thread_usage, + inventory_image = "dfcaverns_pig_tail_thread.png", + groups = {flammable = 1, thread = 1}, +}) + +minetest.register_craft({ + output = "df_primordial_items:mycelial_thread 4", + type = "shapeless", + recipe = { "df_primordial_items:mycelial_fibers"}, +}) + +-- Check each of the six cardinal directions to see if it's buildable-to, +-- if it has an adjacent "soil" node (or if it's going out over the corner of an adjacent soil node), +-- and does *not* have an adjacent hypha already. +-- By growing with these conditions hyphae will hug the ground and will not immediately loop back on themselves +-- (though they can run into other pre-existing growths, forming larger loops - which is fine, large loops are nice) + +local ystride = 3 +local zstride = 9 +local get_item_group = minetest.get_item_group +local get_node = minetest.get_node +local registered_nodes = minetest.registered_nodes +local math_random = math.random + +local find_mycelium_growth_targets = function(pos) + local nodes = {} + local pos_x = pos.x + local pos_y = pos.y + local pos_z = pos.z + + for x = -1, 1 do + for y = -1, 1 do + for z = -1, 1 do + if not (x == y and y == z) then -- we don't care about the diagonals or the center node + local node = get_node({x=pos_x+x, y=pos_y+y, z=pos_z+z}) + local node_name = node.name + if node_name == "ignore" then + -- Pause growth! We're at the edge of the known world. + return nil + end + if get_item_group(node_name, "soil") > 0 or + get_item_group(node_name, "stone") > 0 and math_random() < 0.5 then -- let hyphae explore out over stone + nodes[x + y*ystride + z*zstride] = "soil" + elseif get_item_group(node_name, "hypha") > 0 then + nodes[x + y*ystride + z*zstride] = "hypha" + elseif registered_nodes[node_name] and registered_nodes[node_name].buildable_to then + nodes[x + y*ystride + z*zstride] = "buildable" + end + end + end + end + end + + --TODO there's probably some clever way to turn this into a subroutine, but I'm tired right now and + --copy and pasting is easy and nobody's going to decide whether to hire or fire me based on this + --particular snippet of code so what the hell. I'll fix it later when that clever way comes to me. + local valid_targets = {} + if nodes[-1] == "buildable" and + -- test for soil to directly support new growth + (nodes[-1 -ystride] == "soil" or + nodes[-1 +ystride] == "soil" or + nodes[-1 -zstride] == "soil" or + nodes[-1 +zstride] == "soil" or + -- test for soil "around the corner" to allow for growth over an edge + nodes[-ystride] == "soil" or + nodes[ystride] == "soil" or + nodes[-zstride] == "soil" or + nodes[zstride] == "soil") + and not -- no adjacent hypha + (nodes[-1 -ystride] == "hypha" or + nodes[-1 +ystride] == "hypha" or + nodes[-1 -zstride] == "hypha" or + nodes[-1 +zstride] == "hypha") + then + table.insert(valid_targets, {x=pos_x-1, y=pos_y, z=pos_z}) + end + if nodes[1] == "buildable" and + -- test for soil to directly support new growth + (nodes[1 -ystride] == "soil" or + nodes[1 +ystride] == "soil" or + nodes[1 -zstride] == "soil" or + nodes[1 +zstride] == "soil" or + -- test for soil "around the corner" to allow for growth over an edge + nodes[-ystride] == "soil" or + nodes[ystride] == "soil" or + nodes[-zstride] == "soil" or + nodes[zstride] == "soil") + and not -- no adjacent hypha + (nodes[1 -ystride] == "hypha" or + nodes[1 +ystride] == "hypha" or + nodes[1 -zstride] == "hypha" or + nodes[1 +zstride] == "hypha") + then + table.insert(valid_targets, {x=pos_x+1, y=pos_y, z=pos_z}) + end + if nodes[-ystride] == "buildable" and + -- test for soil to directly support new growth + (nodes[-1 -ystride] == "soil" or + nodes[1 -ystride] == "soil" or + nodes[-ystride -zstride] == "soil" or + nodes[-ystride +zstride] == "soil" or + -- test for soil "around the corner" to allow for growth over an edge + nodes[-1] == "soil" or + nodes[1] == "soil" or + nodes[-zstride] == "soil" or + nodes[zstride] == "soil") + and not -- no adjacent hypha + (nodes[-1 -ystride] == "hypha" or + nodes[1 -ystride] == "hypha" or + nodes[-ystride -zstride] == "hypha" or + nodes[-ystride +zstride] == "hypha") + then + table.insert(valid_targets, {x=pos_x, y=pos_y-1, z=pos_z}) + end + if nodes[ystride] == "buildable" and + -- test for soil to directly support new growth + (nodes[-1 +ystride] == "soil" or + nodes[1 +ystride] == "soil" or + nodes[ystride -zstride] == "soil" or + nodes[ystride +zstride] == "soil" or + -- test for soil "around the corner" to allow for growth over an edge + nodes[-1] == "soil" or + nodes[1] == "soil" or + nodes[-zstride] == "soil" or + nodes[zstride] == "soil") + and not -- no adjacent hypha + (nodes[-1] == "hypha" or + nodes[1 + ystride] == "hypha" or + nodes[ystride -zstride] == "hypha" or + nodes[ystride +zstride] == "hypha") + then + table.insert(valid_targets, {x=pos_x, y=pos_y+1, z=pos_z}) + end + if nodes[-zstride] == "buildable" and + -- test for soil to directly support new growth + (nodes[-1 -zstride] == "soil" or + nodes[1 -zstride] == "soil" or + nodes[-ystride -zstride] == "soil" or + nodes[ystride -zstride] == "soil" or + -- test for soil "around the corner" to allow for growth over an edge + nodes[-1] == "soil" or + nodes[1] == "soil" or + nodes[-ystride] == "soil" or + nodes[ystride] == "soil") + and not -- no adjacent hypha + (nodes[-1 -zstride] == "hypha" or + nodes[1 -zstride] == "hypha" or + nodes[-ystride -zstride] == "hypha" or + nodes[ystride -zstride] == "hypha") + then + table.insert(valid_targets, {x=pos_x, y=pos_y, z=pos_z-1}) + end + if nodes[zstride] == "buildable" and + -- test for soil to directly support new growth + (nodes[-1 +zstride] == "soil" or + nodes[1 +zstride] == "soil" or + nodes[-ystride +zstride] == "soil" or + nodes[ystride +zstride] == "soil" or + -- test for soil "around the corner" to allow for growth over an edge + nodes[-1] == "soil" or + nodes[1] == "soil" or + nodes[-ystride] == "soil" or + nodes[ystride] == "soil") + and not -- no adjacent hypha + (nodes[-1 +zstride] == "hypha" or + nodes[1 +zstride] == "hypha" or + nodes[-ystride + zstride] == "hypha" or + nodes[ystride +zstride] == "hypha") + then + table.insert(valid_targets, {x=pos_x, y=pos_y, z=pos_z+1}) + end + + return valid_targets +end + +local grow_mycelium = function(pos, meristem_name) + local new_meristems = {} + -- Can we grow? If so, pick a random direction and add a new meristem there + local targets = find_mycelium_growth_targets(pos) + + if targets == nil then + return nil -- We hit the edge of the known world, pause! + end + + local target_count = #targets + if target_count > 0 then + local target = targets[math.random(1,target_count)] + minetest.set_node(target, {name=meristem_name}) + table.insert(new_meristems, target) + else + --nowhere to grow, turn into a rooted hypha and we're done + minetest.set_node(pos, {name="df_primordial_items:giant_hypha_root"}) + return new_meristems + end + + if math.random() < 0.06 then -- Note: hypha growth pattern is very sensitive to this branching factor. Higher than about 0.06 will blanket the landscape with fungus. + -- Split - try again from here next time + table.insert(new_meristems, pos) + -- Otherwise, just turn into a hypha and we're done + elseif math.random() < 0.333 then + minetest.set_node(pos, {name="df_primordial_items:giant_hypha_root"}) + else + minetest.set_node(pos, {name="df_primordial_items:giant_hypha"}) + end + return new_meristems +end + +local min_growth_delay = tonumber(minetest.settings:get("dfcaverns_mycelium_min_growth_delay")) or 240 +local max_growth_delay = tonumber(minetest.settings:get("dfcaverns_mycelium_max_growth_delay")) or 400 +local avg_growth_delay = (min_growth_delay + max_growth_delay) / 2 + +minetest.register_node("df_primordial_items:giant_hypha_apical_meristem", { + description = S("Giant Hypha Apical Meristem"), + tiles = { + {name="dfcaverns_mush_giant_hypha.png^[brighten"}, + }, + connects_to = {"group:hypha"}, + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + drawtype = "nodebox", + light_source = 6, + node_box = get_node_box(0.25, 0.375), + paramtype = "light", + + is_ground_content = false, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, light_sensitive_fungus = 13, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, + _dfcaverns_dead_node = "df_primordial_items:giant_hypha_root", + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + on_construct = function(pos) + if df_primordial_items.giant_mycelium_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random(min_growth_delay, max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + on_timer = function(pos, elapsed) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + + if elapsed > max_growth_delay then + -- We've been unloaded for a while, need to do multiple growth iterations. + local iterations = math.floor(elapsed / avg_growth_delay) -- the number of iterations we've missed + local stack = {pos} -- initialize with the current location + for i = 1, iterations do + local new_stack = {} -- populate this with new node output. + for _, stackpos in ipairs(stack) do -- for each currently growing location + local ret = grow_mycelium(stackpos, "df_primordial_items:giant_hypha_apical_meristem") + if ret == nil then + -- We hit the edge of the known world, stop and retry later + minetest.get_node_timer(stackpos):start(math.random(min_growth_delay,max_growth_delay)) + else + for _, retpos in ipairs(ret) do + -- put the new locations into new_stack + table.insert(new_stack, retpos) + end + end + end + stack = new_stack -- replace the old stack with the new + end + for _, donepos in ipairs(stack) do + -- After all the iterations are done, if there's any leftover growing positions set a timer for each of them + minetest.get_node_timer(donepos):start(math.random(min_growth_delay,max_growth_delay)) + end + else + -- just do one iteration. + local new_meristems = grow_mycelium(pos, "df_primordial_items:giant_hypha_apical_meristem") + if new_meristems == nil then + -- We hit the end of the known world, try again later. Unlikely in this case, but theoretically possible I guess. + minetest.get_node_timer(pos):start(math.random(min_growth_delay,max_growth_delay)) + else + for _, newpos in ipairs(new_meristems) do + minetest.get_node_timer(newpos):start(math.random(min_growth_delay,max_growth_delay)) + end + end + end + end, +}) + +-- this version grows instantly, it is meant for mapgen usage. + +local grow_mycelium_immediately = function(pos) + local stack = {pos} + while #stack > 0 do + local pos = table.remove(stack) + if not (df_farming and df_farming.kill_if_sunlit(pos)) then + local new_poses = grow_mycelium(pos, "df_primordial_items:giant_hypha_apical_mapgen") + if new_poses then + for _, new_pos in ipairs(new_poses) do + table.insert(stack, new_pos) + end + else + -- if we hit the end of the world, just stop. There'll be a mapgen meristem left here, re-trigger it. + minetest.get_node_timer(pos):start(math.random(10,60)) + end + end + end +end + +minetest.register_node("df_primordial_items:giant_hypha_apical_mapgen", { + description = S("Giant Hypha Apical Meristem"), + tiles = { + {name="dfcaverns_mush_giant_hypha.png^[brighten"}, + }, + connects_to = {"group:hypha"}, + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + drawtype = "nodebox", + _dfcaverns_dead_node = "df_primordial_items:giant_hypha_root", + light_source = 6, + node_box = get_node_box(0.25, 0.375), + paramtype = "light", + + is_ground_content = false, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, not_in_creative_inventory = 1, light_sensitive_fungus = 13, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + on_timer = function(pos, elapsed) + grow_mycelium_immediately(pos) + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, +}) + +-- Just in case mapgen fails to trigger the timer on a mapgen mycelium this LBM will clean up. +minetest.register_lbm({ + label = "ensure mapgen mycelium has a timer running", + name = "df_primordial_items:ensure_mapgen_mycelium_timer", + nodenames = {"df_primordial_items:giant_hypha_apical_mapgen"}, + run_at_every_load = true, + action = function(pos, node) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(math.random(1,10)) + end + end, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/init.lua b/mods/dfcaverns/df_primordial_items/init.lua new file mode 100644 index 0000000..02aae71 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/init.lua @@ -0,0 +1,17 @@ +df_primordial_items = {} +df_primordial_items.doc = {} + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +dofile(modpath.."/doc.lua") +dofile(modpath.."/jungle_nodes.lua") +dofile(modpath.."/jungle_tree.lua") +dofile(modpath.."/jungle_mushroom.lua") +dofile(modpath.."/giant_fern.lua") +dofile(modpath.."/fungal_nodes.lua") +dofile(modpath.."/ceiling_fungus.lua") +dofile(modpath.."/primordial_mushroom.lua") +dofile(modpath.."/giant_mycelium.lua") +dofile(modpath.."/edibles.lua") +dofile(modpath.."/sapling_growth_conditions.lua") \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/jungle_mushroom.lua b/mods/dfcaverns/df_primordial_items/jungle_mushroom.lua new file mode 100644 index 0000000..4841a17 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/jungle_mushroom.lua @@ -0,0 +1,183 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +------------------------------------------------------------------------------------------ +-- Big jungle mushroom + +minetest.register_node("df_primordial_items:jungle_mushroom_trunk", { + description = S("Primordial Jungle Mushroom Trunk"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem_02.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_cap_1", { + description = S("Pale Jungle Mushroom Cap"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_top_02.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1, handy=1,axey=1, tree=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, compostability=30}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + on_place = minetest.rotate_node, + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:jungle_mushroom_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:jungle_mushroom_cap_1"}, + } + } + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_cap_2", { + description = S("Dark Jungle Mushroom Cap"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_top_01.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1, handy=1,axey=1, tree=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, compostability=30}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + on_place = minetest.rotate_node, + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:jungle_mushroom_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:jungle_mushroom_cap_2"}, + } + } + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +minetest.register_craftitem("df_primordial_items:diced_mushroom", { + description = S("Diced Mushroom"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + inventory_image = "dfcaverns_mush_diced_giant_mushroom.png", + groups = {food = 1, dfcaverns_cookable = 1, eatable=1, plant=1}, + sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, + on_use = minetest.item_eat(1), + _hunger_ng = {satiates = 1}, + _mcl_saturation = 0.5, +}) + +minetest.register_craft({ + output = "df_primordial_items:diced_mushroom 4", + type = "shapeless", + recipe = { "group:primordial_mushroom_cap"}, +}) + +-- Note: no wood-making recipe for the trunk, it's deliberately pretty useless since the cap is edible +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:jungle_mushroom_trunk", + burntime = 15, +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_sapling", { + description = S("Primordial Jungle Mushroom Sapling"), + _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_02.png^[brighten"}, + inventory_image = "dfcaverns_jungle_mushroom_02.png^[brighten", + wield_image = "dfcaverns_jungle_mushroom_02.png^[brighten", + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13, dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_construct = function(pos) + if df_primordial_items.jungle_mushroom_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + df_primordial_items.spawn_jungle_mushroom(pos) + end, +}) + +local c_stem = minetest.get_content_id("df_primordial_items:jungle_mushroom_trunk") +local c_cap_1 = minetest.get_content_id("df_primordial_items:jungle_mushroom_cap_1") +local c_cap_2 = minetest.get_content_id("df_primordial_items:jungle_mushroom_cap_2") +local c_air = minetest.get_content_id("air") + +df_primordial_items.spawn_jungle_mushroom = function(pos) + minetest.set_node(pos, {name="air"}) + local x, y, z = pos.x, pos.y, pos.z + local stem_height = math.random(1,3) + local cap_radius = math.random(2,3) + local maxy = y + stem_height + 3 + + local c_cap + if math.random() > 0.5 then + c_cap = c_cap_1 + else + c_cap = c_cap_2 + end + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - cap_radius, y = y, z = z - cap_radius}, + {x = x + cap_radius, y = maxy + 3, z = z + cap_radius} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + subterrane.giant_mushroom(area:indexp(pos), area, data, c_stem, c_cap, c_air, stem_height, cap_radius) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_primordial_items.spawn_jungle_mushroom_vm = function(vi, area, data) + local stem_height = math.random(1,3) + local cap_radius = math.random(2,3) + local c_cap + if math.random() > 0.5 then + c_cap = c_cap_1 + else + c_cap = c_cap_2 + end + subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, c_air, stem_height, cap_radius) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/jungle_nodes.lua b/mods/dfcaverns/df_primordial_items/jungle_nodes.lua new file mode 100644 index 0000000..a44569c --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/jungle_nodes.lua @@ -0,0 +1,514 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +---------------------------------------------------- +-- Ferns + +local jungle_plant_groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1, compostability = 30} + +minetest.register_node("df_primordial_items:fern_1", { + description = S("Primordial Fern"), + _doc_items_longdesc = df_primordial_items.doc.fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.fern_usage, + tiles = {"dfcaverns_jungle_fern_01.png"}, + inventory_image = "dfcaverns_jungle_fern_01.png", + wield_image = "dfcaverns_jungle_fern_01.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + visual_scale = 1.69, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:fern_2", { + description = S("Primordial Fern"), + _doc_items_longdesc = df_primordial_items.doc.fern_desc, + _doc_items_usagehelp = df_primordial_items.doc.fern_usage, + tiles = {"dfcaverns_jungle_fern_02.png"}, + visual_scale = 1.69, + inventory_image = "dfcaverns_jungle_fern_02.png", + wield_image = "dfcaverns_jungle_fern_02.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +--------------------------------------------------------- +-- Glowing plants + +minetest.register_node("df_primordial_items:glow_plant_1", { + description = S("Primordial Flower"), + _doc_items_longdesc = df_primordial_items.doc.glow_plant_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_plant_usage, + tiles = {"dfcaverns_jungle_flower_01.png"}, + inventory_image = "dfcaverns_jungle_flower_01.png", + wield_image = "dfcaverns_jungle_flower_01.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + light_source = 6, + drop = { + max_items = 2, + items = { + { + rarity = 3, + items = {"df_primordial_items:primordial_fruit"}, + }, + { + rarity = 3, + items = {"df_primordial_items:primordial_fruit"}, + }, + }, + }, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:glow_plant_2", { + description = S("Primordial Jungle Pod"), + _doc_items_longdesc = df_primordial_items.doc.glow_plant_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_plant_usage, + tiles = {"dfcaverns_jungle_glow_plant_01.png"}, + inventory_image = "dfcaverns_jungle_glow_plant_01.png", + wield_image = "dfcaverns_jungle_glow_plant_01.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + drop = "df_primordial_items:glowtato", + light_source = 6, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:glow_plant_3", { + description = S("Primordial Jungle Pod"), + _doc_items_longdesc = df_primordial_items.doc.glow_plant_desc, + _doc_items_usagehelp = df_primordial_items.doc.glow_plant_usage, + tiles = {"dfcaverns_jungle_glow_plant_02.png"}, + inventory_image = "dfcaverns_jungle_glow_plant_02.png", + wield_image = "dfcaverns_jungle_glow_plant_02.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + paramtype = "light", + drawtype = "plantlike", + drop = "df_primordial_items:glowtato 2", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + light_source = 6, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + + +------------------------------------------------------------------- +-- Grass + +minetest.register_node("df_primordial_items:jungle_grass_1", { + description = S("Primordial Jungle Grass"), + _doc_items_longdesc = df_primordial_items.doc.grass_desc, + _doc_items_usagehelp = df_primordial_items.doc.grass_usage, + tiles = {"dfcaverns_jungle_grass_01.png"}, + inventory_image = "dfcaverns_jungle_grass_01.png", + wield_image = "dfcaverns_jungle_grass_01.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_grass_3, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:jungle_grass_2", { + description = S("Primordial Jungle Grass"), + _doc_items_longdesc = df_primordial_items.doc.grass_desc, + _doc_items_usagehelp = df_primordial_items.doc.grass_usage, + tiles = {"dfcaverns_jungle_grass_02.png"}, + inventory_image = "dfcaverns_jungle_grass_02.png", + wield_image = "dfcaverns_jungle_grass_02.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_grass_4, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + place_param2 = 3, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:jungle_grass_3", { + description = S("Primordial Jungle Grass"), + _doc_items_longdesc = df_primordial_items.doc.grass_desc, + _doc_items_usagehelp = df_primordial_items.doc.grass_usage, + tiles = {"dfcaverns_jungle_grass_03.png"}, + inventory_image = "dfcaverns_jungle_grass_03.png", + wield_image = "dfcaverns_jungle_grass_03.png", + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_grass_4, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + place_param2 = 3, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + + +----------------------------------------------------------------------------------------- +-- Ivy + +minetest.register_node("df_primordial_items:jungle_ivy", { + description = S("Primordial Jungle Ivy"), + _doc_items_longdesc = df_primordial_items.doc.ivy_desc, + _doc_items_usagehelp = df_primordial_items.doc.ivy_usage, + tiles = {"dfcaverns_jungle_ivy_01.png"}, + inventory_image = "dfcaverns_jungle_ivy_01.png", + wield_image = "dfcaverns_jungle_ivy_01.png", + groups = {snappy = 3, flammable = 1, vines = 1, handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=15, fire_flammability=100, compostability=50}, + paramtype = "light", + drawtype = "plantlike", + place_param2 = 3, + --paramtype2 = "wallmouinted", + --drawtype = "signlike", + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + climbable = true, +-- selection_box = { +-- type = "wallmounted", +-- }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +------------------------------------------------------------------------------------- +-- Small jungle mushrooms + +minetest.register_node("df_primordial_items:jungle_mushroom_1", { + description = S("Primordial Jungle Mushroom"), + _doc_items_longdesc = df_primordial_items.doc.small_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.small_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a"}, + inventory_image = "dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a", + wield_image = "dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a", + groups = jungle_plant_groups, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:jungle_mushroom_2", { + description = S("Large Primordial Jungle Mushroom"), + _doc_items_longdesc = df_primordial_items.doc.small_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.small_mushroom_usage, + tiles = {"dfcaverns_jungle_mushroom_02.png"}, + inventory_image = "dfcaverns_jungle_mushroom_02.png", + wield_image = "dfcaverns_jungle_mushroom_02.png", + groups = jungle_plant_groups, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + is_ground_content = false, + walkable = false, + floodable = true, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +---------------------------------------------------------------------------------------- +-- Dirt + +minetest.register_node("df_primordial_items:dirt_with_jungle_grass", { + description = S("Dirt With Primordial Jungle Grass"), + _doc_items_longdesc = df_primordial_items.doc.dirt_with_jungle_grass_desc, + _doc_items_usagehelp = df_primordial_items.doc.dirt_with_jungle_grass_usage, + tiles = {"dfcaverns_jungle_plant_grass_node_01.png"}, + paramtype = "light", + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 13, handy=1,shovely=1, dirt=2, building_block=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_dirt, + is_ground_content = false, + drop = df_dependencies.node_name_dirt, + sounds = df_dependencies.sound_dirt(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, +}) + +minetest.register_abm{ + label = "df_primordial_items:jungle_grass_spread", + nodenames = {df_dependencies.node_name_dirt}, + neighbors = {"df_primordial_items:dirt_with_jungle_grass"}, + interval = 60, + chance = 50, + catch_up = true, + action = function(pos) + local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] + if above_def and (above_def.buildable_to == true or above_def.walkable == false) then + minetest.swap_node(pos, {name="df_primordial_items:dirt_with_jungle_grass"}) + end + end, +} + +minetest.register_node("df_primordial_items:plant_matter", { + description = S("Primordial Plant Matter"), + _doc_items_longdesc = df_primordial_items.doc.plant_matter_desc, + _doc_items_usagehelp = df_primordial_items.doc.plant_matter_usage, + tiles = {"dfcaverns_jungle_plant_matter_01.png"}, + is_ground_content = false, + groups = {crumbly = 3, soil = 1, flammable = 1, handy=1,shovely=1, dirt=2, building_block=1, fire_encouragement=1, fire_flammability=1}, + sounds = df_dependencies.sound_dirt(), + on_timer = function(pos, elapsed) + if elapsed > 130 then + -- the timer triggered more than ten seconds after it was suppposed to, + -- it may have been in an unloaded block. Rather than have all the timers + -- go off at once now that the block's loaded, stagger them out again. + minetest.get_node_timer(pos):start(math.random(10, 120)) + return + end + if minetest.find_node_near(pos, 1, {"air"}) == nil then + minetest.set_node(pos, {name="df_primordial_items:packed_roots"}) + end + end, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_primordial_items:packed_roots", { + description = S("Packed Primordial Jungle Roots"), + _doc_items_longdesc = df_primordial_items.doc.packed_roots_desc, + _doc_items_usagehelp = df_primordial_items.doc.packed_roots_usage, + tiles = {"dfcaverns_jungle_plant_packed_roots_01.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 3, +}) + + +if minetest.get_modpath("footprints") then + local HARDPACK_PROBABILITY = tonumber(minetest.settings:get("footprints_hardpack_probability")) or 0.9 -- Chance walked dirt/grass is worn and compacted to footprints:trail. + local HARDPACK_COUNT = tonumber(minetest.settings:get("footprints_hardpack_count")) or 10 -- Number of times the above chance needs to be passed for soil to compact. + + footprints.register_trample_node("df_primordial_items:dirt_with_jungle_grass", { + trampled_node_def_override = {description = S("Dirt With Primordial Jungle Grass and Footprint"),}, + footprint_opacity = 128, + hard_pack_node_name = "footprints:trail", + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT, + }) + footprints.register_trample_node("df_primordial_items:plant_matter", { + trampled_node_def_override = {description = S("Primordial Plant Matter with Footprint"),}, + footprint_opacity = 128, + hard_pack_node_name = "df_primordial_items:packed_roots", + hard_pack_probability = HARDPACK_PROBABILITY, + hard_pack_count = HARDPACK_COUNT, + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:packed_roots", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:plant_matter", + burntime = 20, +}) + +---------------------------------------------------------------------------------------- +-- Roots + +minetest.register_node("df_primordial_items:jungle_roots_1", { + description = S("Primordial Jungle Roots"), + _doc_items_longdesc = df_primordial_items.doc.roots_desc, + _doc_items_usagehelp = df_primordial_items.doc.roots_usage, + tiles = {"dfcaverns_jungle_root_01.png"}, + inventory_image = "dfcaverns_jungle_root_01.png", + wield_image = "dfcaverns_jungle_root_01.png", + groups = {snappy = 3, flammable = 1, vines = 1, handy=1,axey=1,shearsy=1,swordy=1, deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=3, fire_flammability=10, compostability=50}, + paramtype = "light", + drawtype = "plantlike", + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:jungle_roots_2", { + description = S("Primordial Jungle Root"), + _doc_items_longdesc = df_primordial_items.doc.roots_desc, + _doc_items_usagehelp = df_primordial_items.doc.roots_usage, + tiles = {"dfcaverns_jungle_root_02.png"}, + inventory_image = "dfcaverns_jungle_root_02.png", + wield_image = "dfcaverns_jungle_root_02.png", + groups = {snappy = 3, flammable = 1, vines = 1, handy=1,axey=1,shearsy=1,swordy=1, deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=3, fire_flammability=10, compostability=50}, + paramtype = "light", + drawtype = "plantlike", + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + climbable = true, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.2, +}) + +-------------------------------------------------------------------------------- +-- Thorns + +minetest.register_node("df_primordial_items:jungle_thorns", { + description = S("Primordial Jungle Thorns"), + _doc_items_longdesc = df_primordial_items.doc.thorn_desc, + _doc_items_usagehelp = df_primordial_items.doc.thorn_usage, + tiles = {"dfcaverns_jungle_thorns_01.png"}, + visual_scale = 1.41, + inventory_image = "dfcaverns_jungle_thorns_01.png", + wield_image = "dfcaverns_jungle_thorns_01.png", + groups = {snappy = 3, flammable = 1, primordial_jungle_plant = 1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=30, fire_flammability=100, compostability=50}, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + floodable = true, + is_ground_content = false, + place_param2 = 3, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + damage_per_second = 1, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.3, +}) + + +-- TODO I had an idea to make thorns grow into mazes naturally using cellular automata rules, but it turned out to be +-- complicated and probably not worth it right now. Deal with it later. + +--local thorn_dir = +--{ +-- {x=1,y=0,z=1}, +-- {x=-1,y=0,z=-1}, +-- {x=1,y=0,z=0}, +-- {x=1,y=0,z=-1}, +-- {x=-1,y=0,z=0}, +-- {x=-1,y=0,z=1}, +--} +-- +-- +--local thorn_name = "df_primordial_items:jungle_thorns" +--minetest.register_abm({ +-- label = "Primordial thorn growth", +-- nodenames = {thorn_name}, +-- neighbors = {"group:soil"}, +-- interval = 1.0, +-- chance = 5, +-- catch_up = true, +-- action = function(pos, node, active_object_count, active_object_count_wider) +-- if math.random() < 0.1 then +-- local above = vector.add({x=0,y=1,z=0},pos) +-- local below = vector.add({x=0,y=-1,z=0},pos) +-- local above_node = minetest.get_node(above) +-- local below_node = minetest.get_node(below) +-- if above_node.name == "air" and minetest.get_item_group(below_node.name, "soil") then +-- minetest.set_node(above, {name=thorn_name}) +-- end +-- if below_node.name == "air" then +-- minetest.set_node(below, {name=thorn_name}) +-- end +-- return +-- end +-- +-- local dir = thorn_dir[math.random(#thorn_dir)] +-- local target_pos = vector.add(dir, pos) +-- -- This gets the corners of the target zone +-- local pos1 = vector.add(target_pos, thorn_dir[1]) +-- local pos2 = vector.add(target_pos, thorn_dir[2]) +-- +-- local list, counts = minetest.find_nodes_in_area(pos1, pos2, {thorn_name}) +-- local count = counts[thorn_name] +-- local target_node = minetest.get_node(target_pos) +-- -- Cellular automaton rule B3/S12345, approximately +-- if count == 3 and target_node.name == "air" then +-- minetest.set_node(target_pos, {name=thorn_name}) +-- elseif count > 5 then +-- minetest.set_node(target_pos, {name="air"}) +-- end +-- end +--}) diff --git a/mods/dfcaverns/df_primordial_items/jungle_tree.lua b/mods/dfcaverns/df_primordial_items/jungle_tree.lua new file mode 100644 index 0000000..73c3477 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/jungle_tree.lua @@ -0,0 +1,272 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Leaves +minetest.register_node("df_primordial_items:jungle_leaves", { + description = S("Primordial Jungle Tree Leaves"), + _doc_items_longdesc = df_primordial_items.doc.leaves_desc, + _doc_items_usagehelp = df_primordial_items.doc.leaves_usage, + drawtype = "plantlike", + walkable = false, + waving = 2, + visual_scale = 1.4, + tiles = {"dfcaverns_jungle_leaves_01.png"}, + inventory_image = "dfcaverns_jungle_leaves_01.png", + wield_image = "dfcaverns_jungle_leaves_01.png", + paramtype = "light", + is_ground_content = false, + buildable_to = true, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=30, fire_flammability=60, compostability=30}, + sounds = df_dependencies.sound_leaves(), + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:jungletree_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:jungle_leaves"}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:jungle_leaves_glowing", { + description = S("Phosphorescent Primordial Jungle Tree Leaves"), + _doc_items_longdesc = df_primordial_items.doc.glowing_leaves_desc, + _doc_items_usagehelp = df_primordial_items.doc.glowing_leaves_usage, + drawtype = "plantlike", + walkable = false, + waving = 2, + visual_scale = 1.4, + tiles = {"dfcaverns_jungle_leaves_02.png"}, + inventory_image = "dfcaverns_jungle_leaves_02.png", + wield_image = "dfcaverns_jungle_leaves_02.png", + paramtype = "light", + is_ground_content = false, + buildable_to = true, + light_source = 2, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=30, fire_flammability=60, compostability=30}, + sounds = df_dependencies.sound_leaves(), + drop = { + max_items = 1, + items = { + { + items = {"df_primordial_items:jungletree_sapling"}, + rarity = 10, + }, + { + items = {"df_primordial_items:jungle_leaves_glowing"}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +-- Trunk + +minetest.register_node("df_primordial_items:jungle_tree", { + description = S("Primordial Jungle Tree"), + _doc_items_longdesc = df_primordial_items.doc.tree_desc, + _doc_items_usagehelp = df_primordial_items.doc.tree_usage, + tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_01.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1, handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_primordial_items:jungle_tree_mossy", { + description = S("Mossy Primordial Jungle Tree"), + _doc_items_longdesc = df_primordial_items.doc.tree_desc, + _doc_items_usagehelp = df_primordial_items.doc.tree_usage, + tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_03.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1, handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_primordial_items:jungle_tree_glowing", { + description = S("Phosphorescent Primordial Jungle Tree"), + _doc_items_longdesc = df_primordial_items.doc.tree_glowing_desc, + _doc_items_usagehelp = df_primordial_items.doc.tree_glowing_usage, + tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_04.png"}, + paramtype2 = "facedir", + is_ground_content = false, + light_source = 4, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1, handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:jungle_tree_glowing"}, + leaves = {"df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing"}, + radius = 1, +}) + +minetest.register_craft({ + output = df_dependencies.node_name_junglewood .. " 4", + recipe = { + {"group:primordial_jungle_tree"}, + } +}) + +---------------------------- +-- Spawn + +local c_leaves = minetest.get_content_id("df_primordial_items:jungle_leaves") +local c_leaves_glow = minetest.get_content_id("df_primordial_items:jungle_leaves_glowing") +local c_trunk = minetest.get_content_id("df_primordial_items:jungle_tree") +local c_trunk_mossy = minetest.get_content_id("df_primordial_items:jungle_tree_mossy") +local c_trunk_glow = minetest.get_content_id("df_primordial_items:jungle_tree_glowing") + +df_primordial_items.spawn_jungle_tree = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local height = math.random(8,14) + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 2, y = y - 2, z = z - 2}, + {x = x + 2, y = y + height, z = z + 2} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + local vi = area:indexp(pos) + + df_primordial_items.spawn_jungle_tree_vm(height, vi, area, data) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +local get_tree_nodes = function() + local rand = math.random() + if rand < 0.5 then + return c_trunk_glow, c_leaves_glow + end + if rand < 0.75 then + return c_trunk_mossy, c_leaves + end + return c_trunk, c_leaves +end + +df_primordial_items.spawn_jungle_tree_vm = function(height, vi, area, data) + local ystride = area.ystride + local zstride = area.zstride + local buildable_to = mapgen_helper.buildable_to + + local roots_done = {[vi] = true} + for i = 1, 6 do + local root_column = vi + math.random(-1,1) + math.random(-1,1)*zstride + if not roots_done[root_column] then + local trunknode = get_tree_nodes() + for y = -2, math.random(0,1) do -- root height is 1 to 2 nodes above ground + local root_index = root_column + y * ystride + if buildable_to(data[root_index]) then + data[root_index] = trunknode + end + end + end + roots_done[root_column] = true + end + + -- puts a trunk node in the center and surrounds it with leaves + local branch = function(bi, glow) + local trunknode, leafnode + if buildable_to(data[bi]) then + trunknode, leafnode = get_tree_nodes() + data[bi] = trunknode + else + return -- if a branch is placed in a non-viable place, don't add leaves + end + for x = -1, 1 do + for z = -1, 1 do + for y = -1, 1 do + if math.random() < 0.75 then + local li = bi + x + z*zstride + y*ystride + if buildable_to(data[li]) then + data[li] = leafnode + end + end + end + end + end + end + + for i = 0, height-2 do + local y_index = vi + i * ystride + if buildable_to(data[y_index]) then + data[y_index] = get_tree_nodes() + else + return -- if we hit something we can't grow through, stop. + end + if i > 4 then + local branch_index = y_index + math.random(-1,1) + math.random(-1,1)*zstride + branch(branch_index) + end + end + branch(vi + (height-1)*ystride) -- topper +end + +minetest.register_node("df_primordial_items:jungletree_sapling", { + description = S("Primordial Jungle Tree Sapling"), + _doc_items_longdesc = df_primordial_items.doc.tree_desc, + _doc_items_usagehelp = df_primordial_items.doc.tree_usage, + tiles = {"dfcaverns_jungle_sapling.png"}, + inventory_image = "dfcaverns_jungle_sapling.png", + wield_image = "dfcaverns_jungle_sapling.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13, dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + walkable = false, + is_ground_content = false, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_construct = function(pos) + if df_primordial_items.jungletree_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + on_timer = function(pos, elapsed) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + if minetest.get_node_light(pos) > 6 then + df_primordial_items.spawn_jungle_tree(pos) + else + minetest.get_node_timer(pos):start(df_trees.config.tree_min_growth_delay) + end + end, +}) \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/license.txt b/mods/dfcaverns/df_primordial_items/license.txt new file mode 100644 index 0000000..d1b3d1c --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/license.txt @@ -0,0 +1,24 @@ +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2019 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/locale/df_primordial_items.de.tr b/mods/dfcaverns/df_primordial_items/locale/df_primordial_items.de.tr new file mode 100644 index 0000000..ce4a882 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/locale/df_primordial_items.de.tr @@ -0,0 +1,224 @@ +# textdomain: df_primordial_items + + +### ceiling_fungus.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Lantern=Ursprüngliche Pilzlaterne +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Lantern Stalk=Ursprünglicher Pilzlaternenstiel + +### ceiling_fungus.lua ### +### fungal_nodes.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Orb=Urpilzkugel + +### doc.lua ### + +A strangely glowing starchy nodule from a plant that grew deeper than any plant has a right to.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Compared to the behemoths found elsewhere in the deep places of the world, the giant mushrooms of the primordial jungles are on the smaller side - often overwhelmed by the green plants that grow in the mysterious light below. Still, they can become substantial resources.=Im Vergleich zu den Giganten, die anderswo in den Tiefen der Welt zu finden sind, sind die riesigen Pilze des Urdschungels eher klein - oft überwältigt von den grünen Pflanzen, die im mysteriösen Licht unten wachsen. Dennoch können sie zu erheblichen Ressourcen werden. + +Eating this fruit will improve your vitality.= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fibers extracted from gigantic fungal hyphae.=Fasern aus riesigen Pilzhyphen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungal fibers have infiltrated the ground in a spongy mass, making the soil half mineral and half living matter.=Pilzfasern haben den Boden in einer schwammigen Masse infiltriert und den Boden halb mineralisch und halb lebendig gemacht. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungus in its purest form, these gigantic rope-like hyphae creep over the surface of soil and burrow in to feed wherever nutrients are sensed.=Diese gigantischen seilartigen Hyphen, Pilze in ihrer reinsten Form, kriechen über die Oberfläche des Bodens und graben sich ein, um sich dort zu ernähren, wo Nährstoffe wahrgenommen werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ivy is climbable, if it hangs close enough to the ground it can serve as a path between floor and ceiling.=Efeu ist kletterbar, wenn er nahe genug am Boden hängt, kann er als Weg zwischen Boden und Decke dienen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Like wood of the surface world, primordial jungle trees can be chopped and carved as building material or as fuel.=Ursprüngliche Dschungelbäume können wie Holz der Oberflächenwelt als Baumaterial oder als Brennstoff gehackt und geschnitzt werden. + +Much energy is contained in this tuber. It tastes surprisingly good, too. You could cook with it but any change in its pure state would only reduce its value.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Much like a rope, hyphae have fibers inside that can be unraveled and used for a variety of crafts.=Ähnlich wie ein Seil haben Hyphen Fasern im Inneren, die entwirrt und für eine Vielzahl von Handwerken verwendet werden können. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Much like the giant mushrooms of higher cavern layers, these can be carved into woody material for use as fuel or for building things. The grain of these primordial mushrooms is knurled.=Ähnlich wie die Riesenpilze höherer Höhlenschichten können diese in Holzmaterial geschnitzt werden, um sie als Brennstoff oder zum Bauen zu verwenden. Das Korn dieser Urpilze ist gerändelt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Questing fibers of fungal mycelium sometimes erupt from the soil and reach upward, driven by chemical cues to seek out nourishment above. They look a lot like white grass, at a glance.=Suchende Fasern aus Pilzmyzel brechen manchmal aus dem Boden aus und reichen nach oben, angetrieben von chemischen Hinweisen, um oben nach Nahrung zu suchen. Sie sehen auf den ersten Blick wie weißes Gras aus. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Some fronds of primordial jungle trees also become host to the phosphorescent fungus that creeps through cracks in the bark.=Einige Wedel ursprünglicher Dschungelbäume beherbergen auch den phosphoreszierenden Pilz, der durch Risse in der Rinde kriecht. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Somewhere above an enormous plant has wedged its roots down through the rock and emerged from the ceiling of another cavern.=Irgendwo oben hat eine riesige Pflanze ihre Wurzeln durch den Felsen geklemmt und ist von der Decke einer anderen Höhle aufgetaucht. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tangled weaves of ivy hang from the ceiling where there are wide enough gaps between the bright sources of light.=Von der Decke hängen verworrene Efeu-Gewebe, an denen zwischen den hellen Lichtquellen ausreichend große Lücken bestehen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cracks in the bark of some primordial jungle trees become host to phosphorescent veins of symbiotic fungus.=Die Risse in der Rinde einiger ursprünglicher Dschungelbäume beherbergen phosphoreszierende Adern symbiotischer Pilze. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The dark-leaved ferns of the primordial jungle harken back to an earlier era of life in the world.=Die dunkelblättrigen Farne des Urdschungels erinnern an eine frühere Ära des Lebens in der Welt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The glowing bark fungus doesn't extend into the wood of the trunk, resulting in surprisingly mundane building material when hewn.=Der glühende Rindenpilz dringt nicht in das Holz des Stammes ein, was beim Hauen zu überraschend banalem Baumaterial führt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The gnarled interwoven root-like foundations of this plant material is not useful as building material, but can serve as a fuel source.=Die knorrigen, verwobenen, wurzelartigen Fundamente dieses Pflanzenmaterials sind nicht als Baumaterial geeignet, können aber als Brennstoffquelle dienen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The grandest of the great mushroom species can be found in the deepest primordial caverns. Their broad caps have hanging gills.=Die größte der großen Pilzarten befindet sich in den tiefsten Urhöhlen. Ihre breiten Kappen haben hängende Kiemen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The large woody plants of the primordial jungle are similar in appearance to the jungle trees of the surface, but are a result of convergent evolution from ancient cycad plants toward a common form.=Die großen Holzpflanzen des Urdschungels ähneln in ihrem Aussehen den Dschungelbäumen der Oberfläche, sind jedoch das Ergebnis einer konvergenten Entwicklung von alten Cycad-Pflanzen zu einer gemeinsamen Form. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The soft flesh of these large mushrooms is much less woody than other giant mushrooms, making it ill-suited to structural use. This makes it rather more nutritious, however.=Das weiche Fleisch dieser großen Pilze ist viel weniger holzig als andere Riesenpilze, was sie für strukturelle Zwecke ungeeignet macht. Dies macht es jedoch etwas nahrhafter. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The soil of the primordial jungle is rife with strange life at every scale.=Der Boden des Urdschungels ist voller seltsamer Leben in jeder Größenordnung. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The steady light and unchanging growing conditions of the primordial caverns have led to great mountainous masses of plant material growing in particularly fertile spots, hardly identifiable as individual organisms.=Das stetige Licht und die unveränderlichen Wachstumsbedingungen der Urhöhlen haben dazu geführt, dass an besonders fruchtbaren Stellen große Gebirgsmassen an Pflanzenmaterial wachsen, die kaum als einzelne Organismen zu identifizieren sind. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The still air of these ancient caverns have allowed ferns to grow to prodigious sizes, where storms and rain would normally tear their weaker fronds off on the surface of the world.=Die stille Luft dieser alten Höhlen hat es Farnen ermöglicht, zu erstaunlichen Größen zu wachsen, wo Stürme und Regen normalerweise ihre schwächeren Wedel auf der Oberfläche der Welt abreißen würden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These fibrous plants that grow in the deep appear similar to grass at a glance, but they are more closely related to horsetails - a form of vegetation from before the advent of modern plant forms. Ironically, pale cave wheat is more kin to surface grass than this is.=Diese faserigen Pflanzen, die in der Tiefe wachsen, sehen auf den ersten Blick wie Gras aus, sind jedoch enger mit Schachtelhalmen verwandt - einer Vegetationsform vor dem Aufkommen moderner Pflanzenformen. Ironischerweise ist blasser Höhlenweizen mehr verwandt mit Oberflächengras als dies. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These hanging roots are climbable.=Diese hängenden Wurzeln sind kletterbar. + +This strange fruit from the depths has absorbed healthful energies.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When a fern grows to such sizes its stem becomes dense enough to be used as a form of wood.=Wenn ein Farn so groß wird, wird sein Stamm dicht genug, um als Holzform verwendet zu werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When left uncultivated mycelial soil will sprout all manner of strange wild fungi.=Wenn nicht kultivierter Myzelboden belassen wird, sprießen alle Arten von seltsamen Wildpilzen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When left uncultivated primordial jungle soil will sprout all manner of strange wild plants.=Wenn sie nicht kultiviert werden, sprießen alle Arten von seltsamen Wildpflanzen aus dem ursprünglichen Dschungelboden. + + +### edibles.lua ### + +Glowtato= +Primordial Fruit= + +### fungal_nodes.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Primordial Mycelium=Schmutz mit Urmyzel +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Primordial Mycelium and Footprint=Schmutz mit Urmyzel und Fußabdruck +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Grass=Urpilzgras +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Pod=Urpilzschote + +### giant_fern.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fern Wood=Farnholz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Fern Leaves=Riesige Farnblätter +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Fern Sapling=Riesenfarnsetzling +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Fern Stem=Riesenfarnstamm + +### giant_mycelium.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Hypha=Riesenhyphe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Hypha Apical Meristem=Riesenhypha Apical Meristem +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Mycelial Fibers=Riesige Myzelfasern +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mycelial thread=Myzelfaden +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Rooted Giant Hypha=Verwurzelte Riesenhyphe + +### jungle_mushroom.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dark Jungle Mushroom Cap=Dunkle Dschungel-Pilz-Kappe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Diced Mushroom=Pilzwürfel +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pale Jungle Mushroom Cap=Blasse Dschungel-Pilz-Kappe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Mushroom Sapling=Ur-Dschungel-Pilz-Schössling +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Mushroom Trunk=Ursprünglicher Dschungelpilzstamm + +### jungle_nodes.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt With Primordial Jungle Grass=Schmutz mit ursprünglichem Dschungelgras +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt With Primordial Jungle Grass and Footprint=Schmutz mit ursprünglichem Dschungelgras und Fußabdruck +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Large Primordial Jungle Mushroom=Großer Ur-Dschungelpilz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Packed Primordial Jungle Roots=Gepackte ursprüngliche Dschungelwurzeln +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fern=Urfarn +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Flower=Urblume +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Grass=Ursprüngliches Dschungelgras +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Ivy=Ursprünglicher Dschungel-Efeu +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Mushroom=Ursprünglicher Dschungelpilz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Pod=Ursprünglicher Dschungel-Pod +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Root=Ursprüngliche Dschungelwurzel +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Roots=Ursprüngliche Dschungelwurzeln +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Thorns=Ursprüngliche Dschungeldornen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Plant Matter=Urpflanzenmaterie +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Plant Matter with Footprint=Urpflanzen mit Fußabdruck + +### jungle_tree.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mossy Primordial Jungle Tree=Moosiger Urdschungelbaum +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Phosphorescent Primordial Jungle Tree=Phosphoreszierender Urdschungelbaum +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Phosphorescent Primordial Jungle Tree Leaves=Phosphoreszierende Ur-Dschungelbaumblätter +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Tree=Ursprünglicher Dschungelbaum +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Tree Leaves=Ursprüngliche Dschungelbaumblätter +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Tree Sapling=Ursprünglicher Dschungelbaumsetzling + +### primordial_mushroom.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing Primordial Mushroom Gills=Glühende Urpilzkiemen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Cap Wood=Urkappenholz +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Cap=Urpilzkappe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Gills=Urpilzkiemen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Spawn=Urpilzlaich +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Trunk=Urpilzstamm +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Trunk Wood=Urpilzstammholz diff --git a/mods/dfcaverns/df_primordial_items/locale/df_primordial_items.it.tr b/mods/dfcaverns/df_primordial_items/locale/df_primordial_items.it.tr new file mode 100644 index 0000000..51f1591 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/locale/df_primordial_items.it.tr @@ -0,0 +1,221 @@ +# textdomain: df_primordial_items + + +### ceiling_fungus.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Lantern=Lanterna fungina primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Lantern Stalk=Gambo di lanterna fungina primordiale + +### ceiling_fungus.lua ### +### fungal_nodes.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Orb=Globo fungino primordiale + +### doc.lua ### + +A strangely glowing starchy nodule from a plant that grew deeper than any plant has a right to.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Compared to the behemoths found elsewhere in the deep places of the world, the giant mushrooms of the primordial jungles are on the smaller side - often overwhelmed by the green plants that grow in the mysterious light below. Still, they can become substantial resources.=Rispetto ai behemoth che si trovano altrove nelle profondità del mondo, i funghi giganti delle giungle primordiali sono sul lato più piccolo, spesso sopraffatti dalle piante verdi che crescono nella misteriosa luce sottostante. Tuttavia, possono diventare risorse sostanziali. + +Eating this fruit will improve your vitality.= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fibers extracted from gigantic fungal hyphae.=Fibre estratte da gigantesche ife fungine. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungal fibers have infiltrated the ground in a spongy mass, making the soil half mineral and half living matter.=Le fibre fungine si sono infiltrate nel terreno in una massa spugnosa, rendendo il suolo metà minerale e metà materia vivente. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungus in its purest form, these gigantic rope-like hyphae creep over the surface of soil and burrow in to feed wherever nutrients are sensed.=Funghi nella sua forma più pura, queste gigantesche ife simili a corde strisciano sulla superficie del terreno e si insinuano per nutrirsi ovunque vengano percepiti i nutrienti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ivy is climbable, if it hangs close enough to the ground it can serve as a path between floor and ceiling.=Ivy è scalabile, se pende abbastanza vicino al suolo può fungere da percorso tra il pavimento e il soffitto. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Like wood of the surface world, primordial jungle trees can be chopped and carved as building material or as fuel.=Come il legno del mondo di superficie, gli alberi della giungla primordiale possono essere tagliati e intagliati come materiale da costruzione o come combustibile. + +Much energy is contained in this tuber. It tastes surprisingly good, too. You could cook with it but any change in its pure state would only reduce its value.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Much like a rope, hyphae have fibers inside that can be unraveled and used for a variety of crafts.=Proprio come una corda, le ife hanno fibre all'interno che possono essere svelate e utilizzate per una varietà di mestieri. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Much like the giant mushrooms of higher cavern layers, these can be carved into woody material for use as fuel or for building things. The grain of these primordial mushrooms is knurled.=Proprio come i funghi giganti degli strati superiori delle caverne, questi possono essere scolpiti in materiale legnoso da utilizzare come combustibile o per costruire oggetti. Il chicco di questi funghi primordiali è zigrinato. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Questing fibers of fungal mycelium sometimes erupt from the soil and reach upward, driven by chemical cues to seek out nourishment above. They look a lot like white grass, at a glance.=Le fibre di ricerca del micelio fungino a volte eruttano dal suolo e si allungano verso l'alto, spinte da segnali chimici a cercare nutrimento sopra. Assomigliano molto all'erba bianca, a prima vista. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Some fronds of primordial jungle trees also become host to the phosphorescent fungus that creeps through cracks in the bark.=Alcune fronde di alberi primordiali della giungla diventano anche ospiti del fungo fosforescente che si insinua attraverso le fessure della corteccia. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Somewhere above an enormous plant has wedged its roots down through the rock and emerged from the ceiling of another cavern.=Da qualche parte sopra un'enorme pianta ha incuneato le sue radici nella roccia ed è emersa dal soffitto di un'altra caverna. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tangled weaves of ivy hang from the ceiling where there are wide enough gaps between the bright sources of light.=Intrecci aggrovigliati di edera pendono dal soffitto dove ci sono spazi abbastanza ampi tra le sorgenti luminose luminose. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cracks in the bark of some primordial jungle trees become host to phosphorescent veins of symbiotic fungus.=Le crepe nella corteccia di alcuni alberi primordiali della giungla ospitano vene fosforescenti di funghi simbiotici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The dark-leaved ferns of the primordial jungle harken back to an earlier era of life in the world.=Le felci dalle foglie scure della giungla primordiale rimandano a un'era precedente della vita nel mondo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The glowing bark fungus doesn't extend into the wood of the trunk, resulting in surprisingly mundane building material when hewn.=Il fungo della corteccia incandescente non si estende nel legno del tronco, risultando in materiale da costruzione sorprendentemente banale quando viene tagliato. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The gnarled interwoven root-like foundations of this plant material is not useful as building material, but can serve as a fuel source.=Le fondamenta nodose intrecciate simili a radici di questo materiale vegetale non sono utili come materiale da costruzione, ma possono servire come fonte di combustibile. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The grandest of the great mushroom species can be found in the deepest primordial caverns. Their broad caps have hanging gills.=La più grande delle grandi specie di funghi si trova nelle più profonde caverne primordiali. I loro berretti larghi hanno branchie pendenti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The large woody plants of the primordial jungle are similar in appearance to the jungle trees of the surface, but are a result of convergent evolution from ancient cycad plants toward a common form.=Le grandi piante legnose della giungla primordiale sono simili nell'aspetto agli alberi della giungla della superficie, ma sono il risultato dell'evoluzione convergente dalle antiche piante delle Cicade verso una forma comune. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The soft flesh of these large mushrooms is much less woody than other giant mushrooms, making it ill-suited to structural use. This makes it rather more nutritious, however.=La polpa morbida di questi grandi funghi è molto meno legnosa di altri funghi giganti, rendendola poco adatta all'uso strutturale. Tuttavia, questo lo rende un po 'più nutriente. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The soil of the primordial jungle is rife with strange life at every scale.=Il suolo della giungla primordiale è pieno di strane forme di vita ad ogni scala. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The steady light and unchanging growing conditions of the primordial caverns have led to great mountainous masses of plant material growing in particularly fertile spots, hardly identifiable as individual organisms.=La luce costante e le condizioni di crescita immutate delle caverne primordiali hanno portato a grandi masse montuose di materiale vegetale che crescono in punti particolarmente fertili, difficilmente identificabili come singoli organismi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The still air of these ancient caverns have allowed ferns to grow to prodigious sizes, where storms and rain would normally tear their weaker fronds off on the surface of the world.=L'aria immobile di queste antiche caverne ha permesso alle felci di raggiungere dimensioni prodigiose, dove le tempeste e la pioggia normalmente strapperebbero le loro fronde più deboli sulla superficie del mondo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These fibrous plants that grow in the deep appear similar to grass at a glance, but they are more closely related to horsetails - a form of vegetation from before the advent of modern plant forms. Ironically, pale cave wheat is more kin to surface grass than this is.=Queste piante fibrose che crescono in profondità sembrano a prima vista simili all'erba, ma sono più strettamente imparentate con gli equiseti, una forma di vegetazione antecedente all'avvento delle moderne forme vegetali. Ironia della sorte, il grano chiaro delle caverne è più simile all'erba in superficie di quanto non lo sia. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These hanging roots are climbable.=Queste radici pendenti sono scalabili. + +This strange fruit from the depths has absorbed healthful energies.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When a fern grows to such sizes its stem becomes dense enough to be used as a form of wood.=Quando una felce raggiunge tali dimensioni, il suo gambo diventa abbastanza denso da essere usato come una forma di legno. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When left uncultivated mycelial soil will sprout all manner of strange wild fungi.=Se lasciato incolto il terreno miceliale germoglierà ogni sorta di strani funghi selvatici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When left uncultivated primordial jungle soil will sprout all manner of strange wild plants.=Se lasciato incolto, il terreno della giungla primordiale germoglierà ogni sorta di strane piante selvatiche. + + +### edibles.lua ### + +Glowtato= +Primordial Fruit= + +### fungal_nodes.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Primordial Mycelium=Sporcizia con micelio primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt with Primordial Mycelium and Footprint=Sporcizia con micelio primordiale e impronta +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Grass=Erba fungina primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fungal Pod=Capsula Fungina Primordiale + +### giant_fern.lua ### + +Fern Wood= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Fern Leaves=Foglie di felce gigante +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Fern Sapling=Alberello di felce gigante +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Fern Stem=Fusto di felce gigante + +### giant_mycelium.lua ### + +Giant Hypha= +Giant Hypha Apical Meristem= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Giant Mycelial Fibers=Fibre miceliali giganti +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mycelial thread=Filo miceliale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Rooted Giant Hypha=Hypha gigante radicato + +### jungle_mushroom.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dark Jungle Mushroom Cap=Cappello a fungo della giungla oscura +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Diced Mushroom=Funghi a cubetti +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Pale Jungle Mushroom Cap=Cappello a fungo della giungla pallido +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Mushroom Sapling=Alberello di funghi della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Mushroom Trunk=Tronco di funghi della giungla primordiale + +### jungle_nodes.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt With Primordial Jungle Grass=Sporcizia Con Erba Primordiale Della Giungla +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dirt With Primordial Jungle Grass and Footprint=Sporcizia con erba della giungla primordiale e impronta +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Large Primordial Jungle Mushroom=Grande fungo della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Packed Primordial Jungle Roots=Radici della giungla primordiali imballate +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Fern=Felce primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Flower=Fiore primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Grass=Erba della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Ivy=Edera della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Mushroom=Fungo della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Pod=Capsula della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Root=Radice della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Roots=Radici della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Thorns=Spine della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Plant Matter=Materia vegetale primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Plant Matter with Footprint=Materia vegetale primordiale con impronta + +### jungle_tree.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mossy Primordial Jungle Tree=Albero della giungla primordiale muschioso +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Phosphorescent Primordial Jungle Tree=Albero della giungla primordiale fosforescente +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Phosphorescent Primordial Jungle Tree Leaves=Foglie di albero della giungla primordiale fosforescente +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Tree=Albero della giungla primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Tree Leaves=Foglie primordiali dell'albero della giungla +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Jungle Tree Sapling=Alberello dell'albero della giungla primordiale + +### primordial_mushroom.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing Primordial Mushroom Gills=Incandescente branchie di funghi primordiali +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Cap Wood=Cap legno primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Cap=Cappello del fungo primordiale +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Gills=Branchie di funghi primordiali +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Spawn=Spawn dei Funghi Primordiali +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Trunk=Tronco di funghi primordiali +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Primordial Mushroom Trunk Wood=Tronco di funghi primordiali in legno diff --git a/mods/dfcaverns/df_primordial_items/locale/template.txt b/mods/dfcaverns/df_primordial_items/locale/template.txt new file mode 100644 index 0000000..20836c6 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/locale/template.txt @@ -0,0 +1,148 @@ +# textdomain: df_primordial_items + + +### ceiling_fungus.lua ### + +Primordial Fungal Lantern= +Primordial Fungal Lantern Stalk= + +### ceiling_fungus.lua ### +### fungal_nodes.lua ### + +Primordial Fungal Orb= + +### doc.lua ### + +A strangely glowing starchy nodule from a plant that grew deeper than any plant has a right to.= + +Compared to the behemoths found elsewhere in the deep places of the world, the giant mushrooms of the primordial jungles are on the smaller side - often overwhelmed by the green plants that grow in the mysterious light below. Still, they can become substantial resources.= + +Eating this fruit will improve your vitality.= +Fibers extracted from gigantic fungal hyphae.= + +Fungal fibers have infiltrated the ground in a spongy mass, making the soil half mineral and half living matter.= + +Fungus in its purest form, these gigantic rope-like hyphae creep over the surface of soil and burrow in to feed wherever nutrients are sensed.= + +Ivy is climbable, if it hangs close enough to the ground it can serve as a path between floor and ceiling.= + +Like wood of the surface world, primordial jungle trees can be chopped and carved as building material or as fuel.= + +Much energy is contained in this tuber. It tastes surprisingly good, too. You could cook with it but any change in its pure state would only reduce its value.= + +Much like a rope, hyphae have fibers inside that can be unraveled and used for a variety of crafts.= + +Much like the giant mushrooms of higher cavern layers, these can be carved into woody material for use as fuel or for building things. The grain of these primordial mushrooms is knurled.= + +Questing fibers of fungal mycelium sometimes erupt from the soil and reach upward, driven by chemical cues to seek out nourishment above. They look a lot like white grass, at a glance.= + +Some fronds of primordial jungle trees also become host to the phosphorescent fungus that creeps through cracks in the bark.= + +Somewhere above an enormous plant has wedged its roots down through the rock and emerged from the ceiling of another cavern.= + +Tangled weaves of ivy hang from the ceiling where there are wide enough gaps between the bright sources of light.= + +The cracks in the bark of some primordial jungle trees become host to phosphorescent veins of symbiotic fungus.= + +The dark-leaved ferns of the primordial jungle harken back to an earlier era of life in the world.= + +The glowing bark fungus doesn't extend into the wood of the trunk, resulting in surprisingly mundane building material when hewn.= + +The gnarled interwoven root-like foundations of this plant material is not useful as building material, but can serve as a fuel source.= + +The grandest of the great mushroom species can be found in the deepest primordial caverns. Their broad caps have hanging gills.= + +The large woody plants of the primordial jungle are similar in appearance to the jungle trees of the surface, but are a result of convergent evolution from ancient cycad plants toward a common form.= + +The soft flesh of these large mushrooms is much less woody than other giant mushrooms, making it ill-suited to structural use. This makes it rather more nutritious, however.= + +The soil of the primordial jungle is rife with strange life at every scale.= + +The steady light and unchanging growing conditions of the primordial caverns have led to great mountainous masses of plant material growing in particularly fertile spots, hardly identifiable as individual organisms.= + +The still air of these ancient caverns have allowed ferns to grow to prodigious sizes, where storms and rain would normally tear their weaker fronds off on the surface of the world.= + +These fibrous plants that grow in the deep appear similar to grass at a glance, but they are more closely related to horsetails - a form of vegetation from before the advent of modern plant forms. Ironically, pale cave wheat is more kin to surface grass than this is.= + +These hanging roots are climbable.= + +This strange fruit from the depths has absorbed healthful energies.= + +When a fern grows to such sizes its stem becomes dense enough to be used as a form of wood.= + +When left uncultivated mycelial soil will sprout all manner of strange wild fungi.= + +When left uncultivated primordial jungle soil will sprout all manner of strange wild plants.= + + +### edibles.lua ### + +Glowtato= +Primordial Fruit= + +### fungal_nodes.lua ### + +Dirt with Primordial Mycelium= +Dirt with Primordial Mycelium and Footprint= +Primordial Fungal Grass= +Primordial Fungal Pod= + +### giant_fern.lua ### + +Fern Wood= +Giant Fern Leaves= +Giant Fern Sapling= +Giant Fern Stem= + +### giant_mycelium.lua ### + +Giant Hypha= +Giant Hypha Apical Meristem= +Giant Mycelial Fibers= +Mycelial thread= +Rooted Giant Hypha= + +### jungle_mushroom.lua ### + +Dark Jungle Mushroom Cap= +Diced Mushroom= +Pale Jungle Mushroom Cap= +Primordial Jungle Mushroom Sapling= +Primordial Jungle Mushroom Trunk= + +### jungle_nodes.lua ### + +Dirt With Primordial Jungle Grass= +Dirt With Primordial Jungle Grass and Footprint= +Large Primordial Jungle Mushroom= +Packed Primordial Jungle Roots= +Primordial Fern= +Primordial Flower= +Primordial Jungle Grass= +Primordial Jungle Ivy= +Primordial Jungle Mushroom= +Primordial Jungle Pod= +Primordial Jungle Root= +Primordial Jungle Roots= +Primordial Jungle Thorns= +Primordial Plant Matter= +Primordial Plant Matter with Footprint= + +### jungle_tree.lua ### + +Mossy Primordial Jungle Tree= +Phosphorescent Primordial Jungle Tree= +Phosphorescent Primordial Jungle Tree Leaves= +Primordial Jungle Tree= +Primordial Jungle Tree Leaves= +Primordial Jungle Tree Sapling= + +### primordial_mushroom.lua ### + +Glowing Primordial Mushroom Gills= +Primordial Cap Wood= +Primordial Mushroom Cap= +Primordial Mushroom Gills= +Primordial Mushroom Spawn= +Primordial Mushroom Trunk= +Primordial Mushroom Trunk Wood= diff --git a/mods/dfcaverns/df_primordial_items/mod.conf b/mods/dfcaverns/df_primordial_items/mod.conf new file mode 100644 index 0000000..61b95d2 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/mod.conf @@ -0,0 +1,4 @@ +name = df_primordial_items +description = A collection of flora found in the "primordial" cavern layer of DF Caverns +depends = df_dependencies, mapgen_helper, subterrane, df_underworld_items, df_trees +optional_depends = footprints, df_farming \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant.obj b/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant.obj new file mode 100644 index 0000000..c856ac9 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant.obj @@ -0,0 +1,74 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g tunnel_tube_slant_2_Bottom_tunnel_tube_slant_Cube.002_Bottom +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt -0.000000 0.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 1/1/1 2/2/1 4/3/1 3/4/1 +g tunnel_tube_slant_5_Front_tunnel_tube_slant_Cube.002_Front +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.000000 +v -0.500000 0.500000 0.000000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.000000 +vn 0.0000 0.4472 0.8944 +s 1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +g tunnel_tube_slant_1_Top_tunnel_tube_slant_Cube.002_Top +v 0.500000 0.500000 -1.000000 +v -0.500000 0.500000 -1.000000 +v 0.500000 0.500000 0.000000 +v -0.500000 0.500000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vn 0.0000 1.0000 0.0000 +s 1 +f 9/9/3 10/10/3 12/11/3 11/12/3 +g tunnel_tube_slant_3_Left_tunnel_tube_slant_Cube.002_Left +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.000000 +v -0.500000 0.500000 -1.000000 +v -0.500000 -0.500000 -0.500000 +vt -0.000000 0.000000 +vt 0.500000 1.000000 +vt 1.500000 1.000000 +vt 1.000000 0.000000 +vn -1.0000 0.0000 0.0000 +s 1 +f 13/13/4 14/14/4 15/15/4 16/16/4 +g tunnel_tube_slant_6_Back_tunnel_tube_slant_Cube.002_Back +v 0.500000 0.500000 -1.000000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 -1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.4472 -0.8944 +s 1 +f 17/17/5 18/18/5 19/19/5 20/20/5 +g tunnel_tube_slant_4_Right_tunnel_tube_slant_Cube.002_Right +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -1.000000 +v 0.500000 0.500000 0.000000 +v 0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.500000 1.000000 +vt 0.500000 1.000000 +vt 0.000000 0.000000 +vn 1.0000 0.0000 0.0000 +s 1 +f 21/21/6 22/22/6 23/23/6 24/24/6 diff --git a/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant_2.obj b/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant_2.obj new file mode 100644 index 0000000..c736027 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant_2.obj @@ -0,0 +1,74 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g tunnel_tube_slant_Cube.002_Bottom.001 +v 0.500000 -0.500000 -0.000000 +v 0.500000 -0.500000 1.000000 +v -0.500000 -0.500000 -0.000000 +v -0.500000 -0.500000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt -0.000000 0.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 1/1/1 2/2/1 4/3/1 3/4/1 +g tunnel_tube_slant_Cube.002_Front.001 +v 0.500000 -0.500000 1.000000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vn 0.0000 0.4472 0.8944 +s 1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +g tunnel_tube_slant_Cube.002_Top.001 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vn 0.0000 1.0000 0.0000 +s 1 +f 9/9/3 10/10/3 12/11/3 11/12/3 +g tunnel_tube_slant_Cube.002_Left.001 +v -0.500000 -0.500000 1.000000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.000000 +vt -0.500000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.500000 0.000000 +vn -1.0000 -0.0000 0.0000 +s 1 +f 13/13/4 14/14/4 15/15/4 16/16/4 +g tunnel_tube_slant_Cube.002_Back.001 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.000000 +v -0.500000 -0.500000 -0.000000 +v -0.500000 0.500000 -0.500000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.4472 -0.8944 +s 1 +f 17/17/5 18/18/5 19/19/5 20/20/5 +g tunnel_tube_slant_Cube.002_Right.001 +v 0.500000 -0.500000 -0.000000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.500000 0.000000 +vn 1.0000 -0.0000 0.0000 +s 1 +f 21/21/6 22/22/6 23/23/6 24/24/6 diff --git a/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant_full.obj b/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant_full.obj new file mode 100644 index 0000000..b410d18 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/models/dfcaverns_fern_slant_full.obj @@ -0,0 +1,74 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g tunnel_tube_slant_Cube.002_Bottom.002 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt -0.000000 0.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 1/1/1 2/2/1 4/3/1 3/4/1 +g tunnel_tube_slant_Cube.002_Front.002 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.000000 +vn 0.0000 0.7071 0.7071 +s 1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +g tunnel_tube_slant_Cube.002_Top.002 +v 0.500000 0.500000 -1.500000 +v -0.500000 0.500000 -1.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vn 0.0000 1.0000 0.0000 +s 1 +f 9/9/3 10/10/3 12/11/3 11/12/3 +g tunnel_tube_slant_Cube.002_Left.002 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -1.500000 +v -0.500000 -0.500000 -0.500000 +vt -0.000000 0.000000 +vt 1.000000 1.000000 +vt 2.000000 1.000000 +vt 1.000000 0.000000 +vn -1.0000 0.0000 0.0000 +s 1 +f 13/13/4 14/14/4 15/15/4 16/16/4 +g tunnel_tube_slant_Cube.002_Back.002 +v 0.500000 0.500000 -1.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 -1.500000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vn 0.0000 -0.7071 -0.7071 +s 1 +f 17/17/5 18/18/5 19/19/5 20/20/5 +g tunnel_tube_slant_Cube.002_Right.002 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -1.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 2.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vn 1.0000 -0.0000 0.0000 +s 1 +f 21/21/6 22/22/6 23/23/6 24/24/6 diff --git a/mods/dfcaverns/df_primordial_items/primordial_mushroom.lua b/mods/dfcaverns/df_primordial_items/primordial_mushroom.lua new file mode 100644 index 0000000..10e3dac --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/primordial_mushroom.lua @@ -0,0 +1,788 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_primordial_items:mushroom_trunk", { + description = S("Primordial Mushroom Trunk"), + _doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage, + tiles = {"dfcaverns_mush_shaft_top.png", "dfcaverns_mush_shaft_top.png", "dfcaverns_mush_shaft_side.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 3, + _mcl_hardness = 3, +}) + +minetest.register_node("df_primordial_items:mushroom_cap", { + description = S("Primordial Mushroom Cap"), + _doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage, + tiles = {"dfcaverns_mush_cap.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_primordial_items:mushroom_gills", { + description = S("Primordial Mushroom Gills"), + _doc_items_longdesc = df_primordial_items.doc.gills_desc, + _doc_items_usagehelp = df_primordial_items.doc.gills_usage, + tiles = {"dfcaverns_mush_gills.png"}, + inventory_image = "dfcaverns_mush_gills.png", + wield_image = "dfcaverns_mush_gills.png", + groups = {snappy = 3, flammable = 1, leaves = 1, leafdecay = 8,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + paramtype = "light", + drawtype = "plantlike", + waving = 2, + walkable = false, + climbable = true, + is_ground_content = false, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"df_primordial_items:mush_sapling"}, + rarity = 20, + }, + { + items = {"df_primordial_items:mushroom_gills"}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +minetest.register_node("df_primordial_items:mushroom_gills_glowing", { + description = S("Glowing Primordial Mushroom Gills"), + _doc_items_longdesc = df_primordial_items.doc.gills_desc, + _doc_items_usagehelp = df_primordial_items.doc.gills_usage, + tiles = {"dfcaverns_mush_gills_glow.png"}, + inventory_image = "dfcaverns_mush_gills_glow.png", + wield_image = "dfcaverns_mush_gills_glow.png", + groups = {snappy = 3, flammable = 1, leaves = 1, leafdecay = 8,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + paramtype = "light", + drawtype = "plantlike", + waving = 2, + walkable = false, + climbable = true, + is_ground_content = false, + light_source = 6, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"df_primordial_items:mush_sapling"}, + rarity = 20, + }, + { + items = {"df_primordial_items:mushroom_gills_glowing"}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_primordial_items:mushroom_trunk", "df_primordial_items:mushroom_cap"}, + leaves = {"df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing"}, + radius = 5, +}) + +minetest.register_node("df_primordial_items:primordial_mush_trunk_wood", { + description = S("Primordial Mushroom Trunk Wood"), + _doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage, + paramtype2 = "facedir", + tiles = {"dfcaverns_mush_shaft_side.png^(dfcaverns_mush_gills.png^[multiply:#888888)"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 4, + _mcl_hardness = 3, +}) + +minetest.register_craft({ + output = "df_primordial_items:primordial_mush_trunk_wood 4", + recipe = { + {"df_primordial_items:mushroom_trunk"}, + } +}) + +df_dependencies.register_all_stairs_and_fences("primordial_mush_trunk_wood", {burntime = 7}) + +minetest.register_node("df_primordial_items:primordial_mush_cap_wood", { + description = S("Primordial Cap Wood"), + _doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage, + paramtype2 = "facedir", + tiles = {"dfcaverns_mush_cap.png^dfcaverns_mush_gills.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, +}) + +minetest.register_craft({ + output = "df_primordial_items:primordial_mush_cap_wood 4", + recipe = { + {"df_primordial_items:mushroom_cap"}, + } +}) + +df_dependencies.register_all_stairs_and_fences("primordial_mush_cap_wood", {burntime=12}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:primordial_mush_cap_wood", + burntime = 12, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:primordial_mush_trunk_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_cap", + burntime = 40, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_trunk", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_gills", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_gills_glowing", + burntime = 4, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mush_sapling", + burntime = 2, +}) + +------ +-- Schematics: +-- Originally created by ClockGen, released under CC-BY 4.0 + +local replace_on_buildable_to = function(old_node_id, data, area, vi) + return mapgen_helper.buildable_to(old_node_id) +end + +local n1 = {name="air", prob=0} +local n2 = {name="df_primordial_items:mushroom_gills"} +local n3 = {name="df_primordial_items:mushroom_cap", place_on_condition = replace_on_buildable_to} +local n4 = {name="df_primordial_items:mushroom_trunk", place_on_condition = replace_on_buildable_to} +local n5 = {name="df_primordial_items:mushroom_gills_glowing"} + +local bc_mushroom_3 = { + size = {x=3, y=3, z=3}, + center_pos = {x=1, y=0, z=1}, + data = { + n1, n1, n1, n2, n2, n1, n3, n3, n3, n1, n4, n1, n2, n4, n5, n3, n3, + n3, n1, n1, n1, n1, n5, n1, n3, n3, n3, + }, +} + +local bc_mushroom_5 = { + size = {x=5, y=5, z=5}, + center_pos = {x=2, y=0, z=2}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, + n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n2, n1, n1, n1, n3, n2, n5, n2, n3, n1, n3, n3, n3, n1, n1, + n1, n4, n1, n1, n1, n1, n4, n1, n1, n1, n2, n4, n5, n1, n3, n2, n4, + n5, n3, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n5, n2, n1, n1, n3, n5, n2, n2, n3, n1, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, + n1, n1, n1, n1, n1, n1, + }, +} + +local bc_mushroom_9 = { + size = {x=9, y=9, z=9}, + center_pos = {x=4, y=0, z=4}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, + n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, n3, n3, n3, n1, + n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, + n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, + n2, n1, n1, n1, n1, n3, n3, n2, n5, n2, n3, n3, n1, n1, n1, n1, n3, + n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, + n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + n3, n3, n2, n2, n5, n2, n2, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, + n1, n1, n1, n1, n1, n4, n1, n1, n1, n1, n1, n1, n1, n1, n4, n1, n1, + n1, n1, n1, n1, n1, n1, n4, n1, n1, n1, n1, n1, n1, n1, n1, n4, n1, + n1, n5, n1, n1, n5, n1, n1, n4, n2, n1, n5, n1, n1, n5, n1, n5, n4, + n2, n1, n5, n1, n1, n5, n1, n5, n4, n2, n2, n5, n1, n3, n5, n2, n5, + n4, n2, n5, n5, n3, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n1, n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n2, n1, n2, n2, n1, n1, + n1, n1, n1, n2, n5, n2, n2, n1, n1, n3, n3, n5, n2, n5, n2, n2, n3, + n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, + n1, n1, n1, n1, n1, n1, n3, n3, n5, n2, n2, n3, n3, n1, n1, n1, n1, + n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, + n1, n1, n3, n3, n3, n5, n3, n3, n3, n1, n1, n1, n1, n1, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + }, +} + +local bc_mushroom_21 = { + size = {y = 21, x = 19, z = 19}, + center_pos = {x=9, y=0, z=9}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, n3, + n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, + n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, + n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n3, n3, n5, n5, n5, n5, n2, n3, n3, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n3, n3, n3, n3, n5, n3, n3, n3, n3, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n5, n2, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n5, n2, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n5, n2, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, n1, n1, n2, n1, n5, + n2, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n2, n5, n2, + n2, n5, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, + n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, + n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n2, + n1, n1, n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, + n2, n2, n1, n1, n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, + n5, n1, n2, n2, n1, n2, n5, n1, n5, n1, n1, n1, n1, n1, n1, n1, n3, + n5, n2, n5, n1, n2, n2, n1, n2, n5, n2, n5, n3, n1, n1, n1, n1, n1, + n1, n3, n3, n3, n5, n2, n2, n2, n5, n2, n5, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n2, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n5, n1, n2, n1, n1, n1, n2, n2, n2, n2, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n5, n1, n2, n1, n1, n1, n2, n2, n2, n2, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n5, n1, n2, n1, n1, n1, n2, n2, n2, n2, + n1, n1, n1, n1, n1, n1, n3, n3, n2, n5, n1, n2, n1, n1, n1, n2, n2, + n2, n2, n3, n3, n1, n1, n1, n1, n3, n3, n3, n5, n2, n2, n5, n5, n2, + n2, n2, n2, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n4, + n4, n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n2, n1, + n2, n1, n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, n1, n2, + n2, n1, n2, n5, n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, + n1, n2, n2, n2, n2, n5, n2, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, + n1, n1, n1, n2, n2, n2, n2, n5, n2, n1, n1, n1, n1, n3, n3, n2, n1, + n1, n2, n1, n1, n5, n2, n2, n2, n2, n5, n2, n3, n3, n1, n1, n3, n3, + n3, n2, n2, n2, n2, n5, n4, n2, n2, n2, n2, n5, n3, n3, n3, n1, n1, + n1, n1, n3, n3, n3, n3, n4, n4, n4, n4, n4, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, + n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n2, n5, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n2, n5, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n2, n1, n1, n2, + n5, n1, n1, n1, n3, n2, n1, n2, n1, n1, n1, n2, n4, n5, n1, n2, n1, + n1, n2, n5, n3, n1, n1, n3, n3, n2, n2, n5, n5, n2, n4, n4, n4, n2, + n2, n2, n2, n2, n3, n3, n1, n1, n1, n3, n3, n3, n3, n4, n4, n4, n4, + n4, n4, n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, + n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n2, n2, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n4, n4, n4, n2, n2, n2, + n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n1, n1, n4, n4, n4, n2, + n2, n2, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n5, n2, n4, n4, + n4, n2, n2, n2, n1, n1, n2, n1, n1, n1, n1, n5, n5, n1, n1, n5, n2, + n4, n4, n4, n2, n2, n2, n1, n5, n2, n1, n1, n3, n3, n5, n5, n1, n1, + n5, n2, n4, n4, n4, n2, n2, n2, n1, n5, n2, n3, n3, n3, n3, n3, n5, + n5, n2, n5, n4, n4, n4, n4, n4, n2, n2, n2, n5, n3, n3, n3, n1, n1, + n3, n3, n3, n4, n4, n4, n4, n4, n4, n4, n4, n4, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, + n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n4, n4, + n4, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n5, + n4, n4, n4, n1, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, n1, n5, + n1, n5, n4, n4, n4, n2, n1, n1, n1, n1, n1, n2, n1, n1, n2, n1, n1, + n1, n5, n1, n5, n4, n4, n4, n2, n1, n1, n1, n2, n1, n2, n1, n1, n2, + n1, n1, n1, n5, n1, n5, n4, n4, n4, n2, n1, n1, n1, n2, n1, n2, n1, + n1, n2, n1, n1, n1, n5, n1, n5, n4, n4, n4, n2, n1, n1, n1, n2, n1, + n2, n1, n3, n2, n1, n1, n1, n5, n2, n4, n4, n4, n4, n4, n5, n1, n1, + n2, n1, n2, n3, n3, n3, n2, n2, n5, n5, n4, n4, n4, n4, n4, n4, n4, + n2, n2, n2, n2, n3, n3, n1, n1, n3, n3, n3, n4, n4, n4, n4, n4, n4, + n4, n4, n4, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, + n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, + n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n4, n4, n4, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n4, n4, n4, n5, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n4, n4, n4, n5, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n4, n4, n4, n5, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n4, n4, n4, n5, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n4, n4, n4, + n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n2, n4, + n4, n4, n5, n1, n1, n1, n1, n1, n1, n1, n3, n3, n2, n2, n1, n1, n1, + n2, n4, n4, n4, n5, n1, n1, n1, n1, n2, n3, n3, n3, n3, n3, n2, n2, + n5, n5, n4, n4, n4, n4, n4, n2, n5, n5, n2, n3, n3, n3, n1, n1, n3, + n3, n3, n4, n4, n4, n4, n4, n4, n4, n4, n4, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n5, n2, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n5, n2, n1, n1, n1, n1, n1, n1, n5, n1, + n1, n1, n3, n5, n1, n1, n1, n1, n1, n5, n4, n2, n1, n1, n1, n1, n1, + n5, n3, n1, n1, n3, n3, n5, n5, n2, n5, n2, n4, n4, n4, n2, n2, n2, + n2, n5, n3, n3, n1, n1, n1, n3, n3, n3, n3, n4, n4, n4, n4, n4, n4, + n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, + n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n5, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, + n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n5, n1, n1, n1, n1, + n1, n2, n5, n5, n1, n1, n1, n5, n3, n3, n1, n1, n3, n3, n3, n5, n2, + n5, n2, n2, n4, n5, n5, n2, n2, n5, n3, n3, n3, n1, n1, n1, n1, n3, + n3, n3, n3, n4, n4, n4, n4, n4, n3, n3, n3, n3, n1, n1, n1, n1, n1, + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, + n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, + n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n2, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n2, n5, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n2, n5, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n2, n5, n1, n2, n2, n1, n1, n1, n1, n1, n1, + n1, n1, n3, n3, n2, n1, n1, n1, n2, n5, n2, n2, n2, n1, n2, n3, n3, + n1, n1, n1, n1, n3, n3, n3, n5, n2, n5, n2, n5, n2, n2, n2, n5, n3, + n3, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n4, n4, n4, n3, n3, + n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, + n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, + n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n5, n1, n1, n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n1, n2, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n5, n1, n2, n2, + n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n2, n5, n1, n5, n1, + n2, n2, n2, n1, n5, n5, n3, n1, n1, n1, n1, n1, n1, n3, n3, n3, n2, + n5, n2, n2, n2, n2, n5, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, + n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n2, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n5, n2, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n3, n3, n3, n2, n5, n2, n2, n1, n1, n2, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n3, n3, n3, n3, n5, n2, n2, n5, n5, n3, n3, n3, n3, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, + n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, + n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n5, n1, n1, n1, n5, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n5, n5, n1, + n2, n5, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, + n3, n2, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n2, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n3, n3, n3, n2, n3, n3, n3, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, n3, n3, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n3, + n3, n3, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + } +} + +df_primordial_items.get_primordial_mushroom = function() + local rand = math.random() + if rand < 0.3 then + return bc_mushroom_3 + elseif rand < 0.7 then + return bc_mushroom_5 + elseif rand < 0.975 then + return bc_mushroom_9 + end + return bc_mushroom_21 +end + +minetest.register_node("df_primordial_items:mush_sapling", { + description = S("Primordial Mushroom Spawn"), + _doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc, + _doc_items_usagehelp = df_primordial_items.doc.giant_mushroom_usage, + tiles = {"dfcaverns_mush_sapling.png"}, + inventory_image = "dfcaverns_mush_sapling.png", + wield_image = "dfcaverns_mush_sapling.png", + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 11, dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + paramtype = "light", + drawtype = "plantlike", + buildable_to = true, + walkable = false, + is_ground_content = false, + sounds = df_dependencies.sound_leaves(), + use_texture_alpha = "clip", + sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_construct = function(pos) + if df_primordial_items.primordial_mushroom_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + on_timer = function(pos, elapsed) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + df_primordial_items.spawn_primordial_mushroom(pos) + end, +}) + +df_primordial_items.spawn_primordial_mushroom = function(pos) + local mushroom = df_primordial_items.get_primordial_mushroom() + local rotation = (math.random(1,4)-1)*90 + minetest.set_node(pos, {name="air"}) -- clear sapling so mushroom can replace it + mapgen_helper.place_schematic(pos, mushroom, rotation) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/sapling_growth_conditions.lua b/mods/dfcaverns/df_primordial_items/sapling_growth_conditions.lua new file mode 100644 index 0000000..1fc5325 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/sapling_growth_conditions.lua @@ -0,0 +1,22 @@ +-- these methods should indicate whether a sapling placed at pos should bother attempting to grow. +-- check soil conditions and biome here, for example. + +df_primordial_items.giant_fern_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_primordial_items.giant_mycelium_growth_permitted = function(pos) + return true +end + +df_primordial_items.jungle_mushroom_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_primordial_items.jungletree_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_primordial_items.primordial_mushroom_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end \ No newline at end of file diff --git a/mods/dfcaverns/df_primordial_items/settingtypes.txt b/mods/dfcaverns/df_primordial_items/settingtypes.txt new file mode 100644 index 0000000..6a5ed3d --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/settingtypes.txt @@ -0,0 +1,5 @@ +dfcaverns_mycelium_min_growth_delay (Minimum mycelium growth delay) int 240 +dfcaverns_mycelium_max_growth_delay (Maximum mycelium growth delay) int 400 + +dfcaverns_jungle_min_growth_delay (Minimum growth delay for large jungle plants) int 300 +dfcaverns_jungle_max_growth_delay (Maximum growth delay for large jungle plants) int 1500 diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_glowtato.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_glowtato.png new file mode 100644 index 0000000..fb11de3 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_glowtato.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_01.png new file mode 100644 index 0000000..bf07eec Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_02.png new file mode 100644 index 0000000..1501d75 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_03.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_03.png new file mode 100644 index 0000000..d7c2741 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_03.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_bark.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_bark.png new file mode 100644 index 0000000..7d53f1a Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_bark.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_leaves_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_leaves_01.png new file mode 100644 index 0000000..ccae9c7 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_leaves_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_stem.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_stem.png new file mode 100644 index 0000000..7612d59 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_fern_stem.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_flower_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_flower_01.png new file mode 100644 index 0000000..726ea3a Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_flower_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_glow_plant_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_glow_plant_01.png new file mode 100644 index 0000000..f90f4fc Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_glow_plant_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_glow_plant_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_glow_plant_02.png new file mode 100644 index 0000000..f6dfd61 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_glow_plant_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_01.png new file mode 100644 index 0000000..baad3ca Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_02.png new file mode 100644 index 0000000..fc439ff Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_03.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_03.png new file mode 100644 index 0000000..537d3b5 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_grass_03.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_ivy_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_ivy_01.png new file mode 100644 index 0000000..b6fbe1b Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_ivy_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_leaves_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_leaves_01.png new file mode 100644 index 0000000..d539030 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_leaves_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_leaves_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_leaves_02.png new file mode 100644 index 0000000..3c2889d Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_leaves_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_01.png new file mode 100644 index 0000000..082886e Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_02.png new file mode 100644 index 0000000..e388ecb Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_stem.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_stem.png new file mode 100644 index 0000000..dfd030a Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_stem.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_stem_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_stem_02.png new file mode 100644 index 0000000..771741e Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_stem_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_top_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_top_01.png new file mode 100644 index 0000000..f05fa63 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_top_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_top_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_top_02.png new file mode 100644 index 0000000..d3b081f Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_mushroom_top_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_grass_node_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_grass_node_01.png new file mode 100644 index 0000000..38366e9 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_grass_node_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_matter_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_matter_01.png new file mode 100644 index 0000000..b2809be Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_matter_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_packed_roots_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_packed_roots_01.png new file mode 100644 index 0000000..9636aad Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_plant_packed_roots_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_root_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_root_01.png new file mode 100644 index 0000000..a56f066 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_root_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_root_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_root_02.png new file mode 100644 index 0000000..beab246 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_root_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_sapling.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_sapling.png new file mode 100644 index 0000000..5447e37 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_sapling.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_thorns_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_thorns_01.png new file mode 100644 index 0000000..243b1f6 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_thorns_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_01.png new file mode 100644 index 0000000..38226f3 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_02.png new file mode 100644 index 0000000..5b633df Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_03.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_03.png new file mode 100644 index 0000000..f119bf0 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_03.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_04.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_04.png new file mode 100644 index 0000000..efe9816 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_jungle_wood_04.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_cap.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_cap.png new file mode 100644 index 0000000..fcd2756 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_cap.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_diced_giant_mushroom.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_diced_giant_mushroom.png new file mode 100644 index 0000000..65a5f32 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_diced_giant_mushroom.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_giant_hypha.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_giant_hypha.png new file mode 100644 index 0000000..246e3f1 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_giant_hypha.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_gills.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_gills.png new file mode 100644 index 0000000..6201aff Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_gills.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_gills_glow.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_gills_glow.png new file mode 100644 index 0000000..b2ebe58 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_gills_glow.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_glownode.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_glownode.png new file mode 100644 index 0000000..95488e0 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_glownode.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_grass_01.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_grass_01.png new file mode 100644 index 0000000..b2a8406 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_grass_01.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_grass_02.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_grass_02.png new file mode 100644 index 0000000..7e26d5c Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_grass_02.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_mycelial_fibers.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_mycelial_fibers.png new file mode 100644 index 0000000..e3f53a3 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_mycelial_fibers.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_orb.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_orb.png new file mode 100644 index 0000000..f44413a Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_orb.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_orb_vert.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_orb_vert.png new file mode 100644 index 0000000..2f017b7 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_orb_vert.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_pods.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_pods.png new file mode 100644 index 0000000..2e4a9c7 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_pods.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_sapling.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_sapling.png new file mode 100644 index 0000000..bf3d77c Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_sapling.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_shaft_side.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_shaft_side.png new file mode 100644 index 0000000..8264c98 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_shaft_side.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_shaft_top.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_shaft_top.png new file mode 100644 index 0000000..d6b43fb Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_shaft_top.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_soil.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_soil.png new file mode 100644 index 0000000..84bee31 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_soil.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalk_side.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalk_side.png new file mode 100644 index 0000000..317ada7 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalk_side.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalk_top.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalk_top.png new file mode 100644 index 0000000..6e7123c Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalk_top.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalks.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalks.png new file mode 100644 index 0000000..7b4a228 Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_mush_stalks.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/dfcaverns_primordial_fruit.png b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_primordial_fruit.png new file mode 100644 index 0000000..dcb7c1c Binary files /dev/null and b/mods/dfcaverns/df_primordial_items/textures/dfcaverns_primordial_fruit.png differ diff --git a/mods/dfcaverns/df_primordial_items/textures/license.txt b/mods/dfcaverns/df_primordial_items/textures/license.txt new file mode 100644 index 0000000..068a037 --- /dev/null +++ b/mods/dfcaverns/df_primordial_items/textures/license.txt @@ -0,0 +1,10 @@ +All primordial item textures not explicitly listed here were created by ClockGen and licensed under the CC BY 4.0 + +Created by FaceDeer and also licened under CC BY 4.0 (as well as CC0 public domain): +dfcaverns_mush_diced_giant_mushroom.png +dfcaverns_mush_giant_hypha.png +dfcaverns_mush_sapling.png +dfcaverns_mush_mycelial_fibers.png + +From Minetest default mod: +dfcaverns_jungle_sapling.png \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/LICENSE.txt b/mods/dfcaverns/df_trees/LICENSE.txt new file mode 100644 index 0000000..11ce895 --- /dev/null +++ b/mods/dfcaverns/df_trees/LICENSE.txt @@ -0,0 +1,26 @@ +Dwarf Fortress is copyright 2018 by Tarn Adams. This mod uses no assets or other copyrighted materials from Dwarf Fortress. + +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/aliases.lua b/mods/dfcaverns/df_trees/aliases.lua new file mode 100644 index 0000000..2d65446 --- /dev/null +++ b/mods/dfcaverns/df_trees/aliases.lua @@ -0,0 +1,44 @@ +minetest.register_alias("dfcaverns:black_cap" , "df_trees:black_cap" ) +minetest.register_alias("dfcaverns:black_cap_gills" , "df_trees:black_cap_gills" ) +minetest.register_alias("dfcaverns:black_cap_sapling" , "df_trees:black_cap_sapling" ) +minetest.register_alias("dfcaverns:black_cap_stem" , "df_trees:black_cap_stem" ) +minetest.register_alias("dfcaverns:black_cap_wood" , "df_trees:black_cap_wood" ) +minetest.register_alias("dfcaverns:blood_thorn" , "df_trees:blood_thorn" ) +minetest.register_alias("dfcaverns:blood_thorn_dead" , "df_trees:blood_thorn_dead" ) +minetest.register_alias("dfcaverns:blood_thorn_spike" , "df_trees:blood_thorn_spike" ) +minetest.register_alias("dfcaverns:blood_thorn_spike_dead" , "df_trees:blood_thorn_spike_dead" ) +minetest.register_alias("dfcaverns:blood_thorn_wood" , "df_trees:blood_thorn_wood" ) +minetest.register_alias("dfcaverns:fungiwood" , "df_trees:fungiwood" ) +minetest.register_alias("dfcaverns:fungiwood_sapling" , "df_trees:fungiwood_sapling" ) +minetest.register_alias("dfcaverns:fungiwood_shelf" , "df_trees:fungiwood_shelf" ) +minetest.register_alias("dfcaverns:fungiwood_wood" , "df_trees:fungiwood_wood" ) +minetest.register_alias("dfcaverns:goblin_cap" , "df_trees:goblin_cap" ) +minetest.register_alias("dfcaverns:goblin_cap_gills" , "df_trees:goblin_cap_gills" ) +minetest.register_alias("dfcaverns:goblin_cap_sapling" , "df_trees:goblin_cap_sapling" ) +minetest.register_alias("dfcaverns:goblin_cap_stem" , "df_trees:goblin_cap_stem" ) +minetest.register_alias("dfcaverns:goblin_cap_stem_wood" , "df_trees:goblin_cap_stem_wood" ) +minetest.register_alias("dfcaverns:goblin_cap_wood" , "df_trees:goblin_cap_wood" ) +minetest.register_alias("dfcaverns:nether_cap" , "df_trees:nether_cap" ) +minetest.register_alias("dfcaverns:nether_cap_gills" , "df_trees:nether_cap_gills" ) +minetest.register_alias("dfcaverns:nether_cap_sapling" , "df_trees:nether_cap_sapling" ) +minetest.register_alias("dfcaverns:nether_cap_stem" , "df_trees:nether_cap_stem" ) +minetest.register_alias("dfcaverns:nether_cap_wood" , "df_trees:nether_cap_wood" ) +minetest.register_alias("dfcaverns:spore_tree" , "df_trees:spore_tree" ) +minetest.register_alias("dfcaverns:spore_tree_fruiting_body" , "df_trees:spore_tree_fruiting_body" ) +minetest.register_alias("dfcaverns:spore_tree_hyphae" , "df_trees:spore_tree_hyphae" ) +minetest.register_alias("dfcaverns:spore_tree_ladder" , "df_trees:spore_tree_ladder" ) +minetest.register_alias("dfcaverns:spore_tree_sapling" , "df_trees:spore_tree_sapling" ) +minetest.register_alias("dfcaverns:spore_tree_wood" , "df_trees:spore_tree_wood" ) +minetest.register_alias("dfcaverns:tower_cap" , "df_trees:tower_cap" ) +minetest.register_alias("dfcaverns:tower_cap_gills" , "df_trees:tower_cap_gills" ) +minetest.register_alias("dfcaverns:tower_cap_sapling" , "df_trees:tower_cap_sapling" ) +minetest.register_alias("dfcaverns:tower_cap_stem" , "df_trees:tower_cap_stem" ) +minetest.register_alias("dfcaverns:tower_cap_wood" , "df_trees:tower_cap_wood" ) +minetest.register_alias("dfcaverns:tunnel_tube" , "df_trees:tunnel_tube" ) +minetest.register_alias("dfcaverns:tunnel_tube_fruiting_body" , "df_trees:tunnel_tube_fruiting_body" ) +minetest.register_alias("dfcaverns:tunnel_tube_fruiting_body_burning", "df_trees:tunnel_tube_fruiting_body_burning") +minetest.register_alias("dfcaverns:tunnel_tube_sapling" , "df_trees:tunnel_tube_sapling" ) +minetest.register_alias("dfcaverns:tunnel_tube_slant_bottom" , "df_trees:tunnel_tube_slant_bottom" ) +minetest.register_alias("dfcaverns:tunnel_tube_slant_full" , "df_trees:tunnel_tube_slant_full" ) +minetest.register_alias("dfcaverns:tunnel_tube_slant_top" , "df_trees:tunnel_tube_slant_top" ) +minetest.register_alias("dfcaverns:tunnel_tube_wood" , "df_trees:tunnel_tube_wood" ) \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/black_cap.lua b/mods/dfcaverns/df_trees/black_cap.lua new file mode 100644 index 0000000..7567350 --- /dev/null +++ b/mods/dfcaverns/df_trees/black_cap.lua @@ -0,0 +1,214 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +--stem +minetest.register_node("df_trees:black_cap_stem", { + description = S("Black Cap Stem"), + _doc_items_longdesc = df_trees.doc.black_cap_desc, + _doc_items_usagehelp = df_trees.doc.black_cap_usage, + tiles = {"dfcaverns_black_cap_top.png","dfcaverns_black_cap_top.png","dfcaverns_black_cap_side.png",}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, +}) + +--cap +minetest.register_node("df_trees:black_cap", { + description = S("Black Cap"), + _doc_items_longdesc = df_trees.doc.black_cap_desc, + _doc_items_usagehelp = df_trees.doc.black_cap_usage, + tiles = {"dfcaverns_black_cap_top.png","dfcaverns_black_cap_top.png","dfcaverns_black_cap_side.png^[transformR90",}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, +}) + +--gills +minetest.register_node("df_trees:black_cap_gills", { + description = S("Black Cap Gills"), + _doc_items_longdesc = df_trees.doc.black_cap_desc, + _doc_items_usagehelp = df_trees.doc.black_cap_usage, + tiles = {"dfcaverns_black_cap_gills.png"}, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + sounds = df_dependencies.sound_leaves(), + drawtype = "plantlike", + paramtype = "light", + drop = { + max_items = 1, + items = { + { + items = {'df_trees:black_cap_sapling', 'df_trees:black_cap_gills'}, + rarity = 5, + }, + { + items = {'df_trees:black_cap_gills'}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_trees:black_cap"}, -- don't need stem nodes here + leaves = {"df_trees:black_cap_gills"}, + radius = 1, +}) + +-- Wood +minetest.register_craft({ + output = 'df_trees:black_cap_wood 4', + recipe = { + {'df_trees:black_cap'}, + } +}) + +minetest.register_craft({ + output = 'df_trees:black_cap_wood 4', + recipe = { + {'df_trees:black_cap_stem'}, + } +}) + +minetest.register_craft({ + output = df_dependencies.node_name_torch .. ' 8', + recipe = { + {'df_trees:black_cap_gills'}, + {'group:stick'}, + } +}) + +if minetest.get_modpath("basic_materials") then + minetest.register_craft({ + type = "cooking", + output = "basic_materials:paraffin", + recipe = "df_trees:black_cap_gills", + cooktime = 5, + }) +end + +minetest.register_node("df_trees:black_cap_wood", { + description = S("Black Cap Planks"), + _doc_items_longdesc = df_trees.doc.black_cap_desc, + _doc_items_usagehelp = df_trees.doc.black_cap_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_black_cap_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 5, + _mcl_hardness = 5, +}) + +df_dependencies.register_all_stairs_and_fences("black_cap_wood", {burntime = 30}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:black_cap_wood", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:black_cap", + burntime = 120, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:black_cap_stem", + burntime = 120, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:black_cap_gills", + burntime = 6, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:black_cap_sapling", + burntime = 6, +}) + +-- sapling +minetest.register_node("df_trees:black_cap_sapling", { + description = S("Black Cap Spawn"), + _doc_items_longdesc = df_trees.doc.black_cap_desc, + _doc_items_usagehelp = df_trees.doc.black_cap_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_black_cap_sapling.png"}, + inventory_image = "dfcaverns_black_cap_sapling.png", + wield_image = "dfcaverns_black_cap_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + floodable = true, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + + on_construct = function(pos) + if df_trees.black_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.black_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.black_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + minetest.set_node(pos, {name="air"}) + df_trees.spawn_black_cap(pos) + end, +}) + +local c_stem = minetest.get_content_id("df_trees:black_cap_stem") +local c_cap = minetest.get_content_id("df_trees:black_cap") +local c_gills = minetest.get_content_id("df_trees:black_cap_gills") + +df_trees.spawn_black_cap = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local stem_height = math.random(1,5) + local cap_radius = math.random(2,3) + local maxy = y + stem_height + 3 + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - cap_radius, y = y, z = z - cap_radius}, + {x = x + cap_radius, y = maxy + 3, z = z + cap_radius} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + subterrane.giant_mushroom(area:indexp(pos), area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_trees.spawn_black_cap_vm = function(vi, area, data) + local stem_height = math.random(1,5) + local cap_radius = math.random(2,3) + + subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) +end + diff --git a/mods/dfcaverns/df_trees/blood_thorn.lua b/mods/dfcaverns/df_trees/blood_thorn.lua new file mode 100644 index 0000000..1a7ff6a --- /dev/null +++ b/mods/dfcaverns/df_trees/blood_thorn.lua @@ -0,0 +1,342 @@ +-------------------------------------------------- +-- Blood thorn + +-- Max trunk height 5 +-- red with purple mottling +-- High density wood +-- Depth 3 + +local S = minetest.get_translator(minetest.get_current_modname()) + +local spike_directions = { + {dir={x=0,y=0,z=1}, facedir=2}, + {dir={x=0,y=0,z=-1}, facedir=0}, + {dir={x=1,y=0,z=0}, facedir=3}, + {dir={x=-1,y=0,z=0}, facedir=1} +} +local spikes = {["df_trees:blood_thorn_spike"] = true, ["df_trees:blood_thorn_spike_dead"] = true} + +local blood_thorn_after_dig = function(pos, oldnode, oldmetadata, digger) + for _, spike_dir in pairs(spike_directions) do + local loc = vector.add(pos,spike_dir.dir) + local node = minetest.get_node(loc) + if spikes[node.name] and spike_dir.facedir == node.param2 then + minetest.node_dig(loc, node, digger) + end + end +end + +local blood_thorn_min_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_min_growth_delay +local blood_thorn_max_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_max_growth_delay + +minetest.register_node("df_trees:blood_thorn", { + description = S("Blood Thorn Stem"), + _doc_items_longdesc = df_trees.doc.blood_thorn_desc, + _doc_items_usagehelp = df_trees.doc.blood_thorn_usage, + tiles = {"dfcaverns_blood_thorn_top.png", "dfcaverns_blood_thorn_top.png", + "dfcaverns_blood_thorn_side.png", "dfcaverns_blood_thorn_side.png", "dfcaverns_blood_thorn_side.png", "dfcaverns_blood_thorn_side.png"}, + paramtype2 = "facedir", + paramtype = "light", + groups = {choppy = 3, tree = 1, flammable = 2, light_sensitive_fungus = 11, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, opaque=1}, + _dfcaverns_dead_node = "df_trees:blood_thorn_dead", + sounds = df_dependencies.sound_wood(), + is_ground_content = false, + on_place = minetest.rotate_node, + after_dig_node = blood_thorn_after_dig, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + + on_construct = function(pos) + if not df_trees.blood_thorn_growth_permitted(pos) then + return + end + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + local below = {x=pos.x, y=pos.y-1, z=pos.z} + local below_node = minetest.get_node(below) + while below_node.name == "df_trees:blood_thorn" do + -- if you chop down a bloodthorn it can start growing again + minetest.get_node_timer(below):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + below.y = below.y-1 + below_node = minetest.get_node(below) + end + end, + + on_timer = function(pos, elapsed) + while elapsed > blood_thorn_max_delay do + -- catch up if the block was unloaded for a long time + elapsed = elapsed - blood_thorn_max_delay + if not df_trees.grow_blood_thorn(vector.new(pos), minetest.get_node(pos)) then + return + end + end + if df_trees.grow_blood_thorn(vector.new(pos), minetest.get_node(pos)) then + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end + end, + +}) + +minetest.register_node("df_trees:blood_thorn_dead", { + description = S("Dead Blood Thorn Stem"), + _doc_items_longdesc = df_trees.doc.blood_thorn_desc, + _doc_items_usagehelp = df_trees.doc.blood_thorn_usage, + tiles = {"dfcaverns_blood_thorn_top.png^[multiply:#804000", "dfcaverns_blood_thorn_top.png^[multiply:#804000", + "dfcaverns_blood_thorn_side.png^[multiply:#804000"}, + paramtype2 = "facedir", + paramtype = "light", + groups = {choppy = 3, tree = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + is_ground_content = false, + on_place = minetest.rotate_node, + after_dig_node = blood_thorn_after_dig, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) + +minetest.register_node("df_trees:blood_thorn_spike", { + description = S("Blood Thorn Spike"), + _doc_items_longdesc = df_trees.doc.blood_thorn_spike_desc, + _doc_items_usagehelp = df_trees.doc.blood_thorn_spike_usage, + tiles = { + "dfcaverns_blood_thorn_spike_side.png^[transformR90", + "dfcaverns_blood_thorn_spike_side.png^[transformR270", + "dfcaverns_blood_thorn_spike_side.png", + "dfcaverns_blood_thorn_spike_side.png^[transformR180", + "dfcaverns_blood_thorn_spike_front.png", + "dfcaverns_blood_thorn_spike_front.png" + }, + groups = {choppy = 3, flammable = 2, fall_damage_add_percent=100, light_sensitive_fungus = 11, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + _dfcaverns_dead_node = "df_trees:blood_thorn_spike_dead", + sounds = df_dependencies.sound_wood(), + drawtype = "nodebox", + climbable = true, + is_ground_content = false, + damage_per_second = 1, + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.1875, 0.1875, 0.1875, 0.1875, 0.5}, -- base + {-0.125, -0.125, -0.125, 0.125, 0.125, 0.1875}, -- mid + {-0.0625, -0.0625, -0.5, 0.0625, 0.0625, -0.125}, -- tip + } + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) + +minetest.register_node("df_trees:blood_thorn_spike_dead", { + description = S("Dead Blood Thorn Spike"), + _doc_items_longdesc = df_trees.doc.blood_thorn_spike_desc, + _doc_items_usagehelp = df_trees.doc.blood_thorn_spike_usage, + tiles = { + "dfcaverns_blood_thorn_spike_side.png^[transformR90^[multiply:#804000", + "dfcaverns_blood_thorn_spike_side.png^[transformR270^[multiply:#804000", + "dfcaverns_blood_thorn_spike_side.png^[multiply:#804000", + "dfcaverns_blood_thorn_spike_side.png^[transformR180^[multiply:#804000", + "dfcaverns_blood_thorn_spike_front.png^[multiply:#804000", + "dfcaverns_blood_thorn_spike_front.png^[multiply:#804000" + }, + groups = {choppy = 3, flammable = 2, fall_damage_add_percent=100, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + drawtype = "nodebox", + climbable = true, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.1875, 0.1875, 0.1875, 0.1875, 0.5}, -- base + {-0.125, -0.125, -0.125, 0.125, 0.125, 0.1875}, -- mid + {-0.0625, -0.0625, -0.5, 0.0625, 0.0625, -0.125}, -- tip + } + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 0.8, +}) + + +--Wood +minetest.register_craft({ + output = 'df_trees:blood_thorn_wood 4', + recipe = { + {'df_trees:blood_thorn'}, + } +}) +minetest.register_craft({ + output = 'df_trees:blood_thorn_wood 4', + recipe = { + {'df_trees:blood_thorn_dead'}, + } +}) + +minetest.register_node("df_trees:blood_thorn_wood", { + description = S("Blood Thorn Planks"), + _doc_items_longdesc = df_trees.doc.blood_thorn_desc, + _doc_items_usagehelp = df_trees.doc.blood_thorn_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_blood_thorn_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 2, + _mcl_hardness = 1, +}) + +df_dependencies.register_all_stairs_and_fences("blood_thorn_wood", {burntime = 40}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:blood_thorn_wood", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:blood_thorn", + burntime = 150, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:blood_thorn_dead", + burntime = 120, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:blood_thorn_spike", + burntime = 5, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:blood_thorn_spike_dead", + burntime = 5, +}) + +-- This ensures consistent random maximum to bloodthorn growth +local max_bloodthorn_height = function(pos) + local next_seed = math.floor(math.random() * 2^31) + math.randomseed(pos.x + pos.z * 2 ^ 8) + local output = math.random(3,6) + math.randomseed(next_seed) + return output +end + +function df_trees.grow_blood_thorn(pos, node) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + + -- node is tipped over + if node.param2 >= 4 then + return + end + + local height = 0 + local max_height = max_bloodthorn_height(pos) + while node.name == "df_trees:blood_thorn" and height < max_height do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 7 or node.name ~= "air" then + return + end + + minetest.set_node(pos, {name = "df_trees:blood_thorn"}) + + local dir = spike_directions[math.random(1,4)] + local spike_pos = vector.add(pos, dir.dir) + if minetest.get_node(spike_pos).name == "air" then + minetest.set_node(spike_pos, {name="df_trees:blood_thorn_spike", param2=dir.facedir}) + end + dir = spike_directions[math.random(1,4)] + spike_pos = vector.add(pos, dir.dir) + if minetest.get_node(spike_pos).name == "air" then + minetest.set_node(spike_pos, {name="df_trees:blood_thorn_spike", param2=dir.facedir}) + end + return true +end + +minetest.register_lbm({ + label = "Start timers for bloodthorn nodes that used to depend on the ABM", + name = "df_trees:start_bloodthorn_timers", + nodenames = {"df_trees:blood_thorn"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end, +}) + +function df_trees.spawn_blood_thorn(pos) + local height = max_bloodthorn_height(pos) + local x, y, z = pos.x, pos.y, pos.z + local maxy = y + height -- Trunk top + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 1, y = y, z = z - 1}, + {x = x + 1, y = maxy, z = z + 1} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + local data_param2 = vm:get_param2_data() + + df_trees.spawn_blood_thorn_vm(area:indexp(pos), area, data, data_param2, height) + + vm:set_data(data) + vm:set_param2_data(data_param2) + vm:write_to_map() + vm:update_map() +end + +local c_air = minetest.get_content_id("air") +local c_ignore = minetest.get_content_id("ignore") +local c_blood_thorn = minetest.get_content_id("df_trees:blood_thorn") +local c_blood_thorn_spike = minetest.get_content_id("df_trees:blood_thorn_spike") + +local facedir_to_increment = function(direction, area) + if direction == 0 then + return -area.zstride + elseif direction == 1 then + return -1 + elseif direction == 2 then + return area.zstride + elseif direction == 3 then + return 1 + end +end + +df_trees.spawn_blood_thorn_vm = function(vi, area, data, data_param2, height) + local pos = area:position(vi) + if height == nil then height = max_bloodthorn_height(pos) end + + for i = 1, height do + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore then + data[vi] = c_blood_thorn + + for i = 1, 2 do + local facedir = math.random(1,4)-1 + local spike_vi = vi + facedir_to_increment(facedir, area) + if data[spike_vi] == c_air or data[spike_vi] == c_ignore then + data[spike_vi] = c_blood_thorn_spike + data_param2[spike_vi] = facedir + end + end + else + break + end + vi = vi + area.ystride + end +end + + + + + diff --git a/mods/dfcaverns/df_trees/config.lua b/mods/dfcaverns/df_trees/config.lua new file mode 100644 index 0000000..41f4f86 --- /dev/null +++ b/mods/dfcaverns/df_trees/config.lua @@ -0,0 +1,53 @@ +local CONFIG_FILE_PREFIX = "dfcaverns_" + +df_trees.config = {} + +local print_settingtypes = false + +local function setting(stype, name, default, description) + local value + if stype == "bool" then + value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default) + elseif stype == "string" then + value = minetest.settings:get(CONFIG_FILE_PREFIX..name) + elseif stype == "int" or stype == "float" then + value = tonumber(minetest.settings:get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + df_trees.config[name] = value + + if print_settingtypes then + minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default)) + end +end + +local trees = { + {name="fungiwood", delay_multiplier = 1}, + {name="tunnel_tube", delay_multiplier = 1}, + {name="spore_tree", delay_multiplier = 1}, + {name="black_cap", delay_multiplier = 1}, + {name="nether_cap", delay_multiplier = 1}, + {name="goblin_cap", delay_multiplier = 1}, + {name="tower_cap", delay_multiplier = 1}, + {name="blood_thorn", delay_multiplier = 1}, +} + +--Trees + +setting("int", "tree_min_growth_delay", 2400, "Minimum sapling growth delay") +setting("int", "tree_max_growth_delay", 4800, "Maximum sapling growth delay") + +for _, tree in pairs(trees) do + setting("float", tree.name.."_delay_multiplier", tree.delay_multiplier, tree.name.." growth delay multiplier") +end + +-- TODO: mineclone settings +if df_dependencies.tnt_boom then + df_trees.config.enable_tnt = minetest.settings:get_bool("enable_tnt") + if df_trees.config.enable_tnt == nil then + -- Default to enabled when in singleplayer + df_trees.config.enable_tnt = minetest.is_singleplayer() + end +end \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/doc.lua b/mods/dfcaverns/df_trees/doc.lua new file mode 100644 index 0000000..37e1a18 --- /dev/null +++ b/mods/dfcaverns/df_trees/doc.lua @@ -0,0 +1,71 @@ +df_trees.doc = {} + +local nethercap_name = df_dependencies.nethercap_name + +if not minetest.get_modpath("doc") then + return +end + +local S = minetest.get_translator(minetest.get_current_modname()) + +-- Trees +df_trees.doc.black_cap_desc = S("The dense black wood of these mushrooms is heavy and hard to work with, and has few remarkable properties.") +df_trees.doc.black_cap_usage = S("Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications. Black cap gills are oily and make for excellent torch fuel.") + +df_trees.doc.blood_thorn_desc = S("Blood thorns are the most vicious of underground flora, as befits their harsh environments. Found only in hot, dry caverns with sandy soil far from the surface world's organic bounty, blood thorns seek to supplement their nutrient supply with wickedly barbed hollow spines that actively drain fluids from whatever stray plant or creature they might impale.") +df_trees.doc.blood_thorn_usage = S("When harvested, the central stalk of a blood thorn can be cut into planks and used as wood. It has a purple-red hue that may or may not appeal, depending on one's artistic tastes.") +df_trees.doc.blood_thorn_spike_desc = S("The spikes of a blood thorn can actually remain living long after they're severed from their parent stalk, a testament to their tenacity. As long as they remain alive they will continue to actively drain anything they puncture, though they don't grow.") +df_trees.doc.blood_thorn_spike_usage = S("Living blood thorn spikes remain harmful to creatures that touch them. If killed by bright light, they cause only passive damage to creatures that fall on them (as one would expect from an enormous spike).") + +df_trees.doc.fungiwood_desc = S("Thin, irregular layers of spore-producing 'shelves' surround the strong central stalk of the mighty Fungiwood.") +df_trees.doc.fungiwood_usage = S("Fungiwood stalk is strong and very fine-grained, making smooth yellow-tinted lumber when cut. Fungiwood shelf is too fragile to be much use as anything other than fuel.") + +df_trees.doc.goblin_cap_desc = S("Massive but squat, mature goblin cap mushrooms are the size of small cottages.") +df_trees.doc.goblin_cap_usage = S("Goblin cap stem and cap material can be cut into wood of two different hues, a subdued cream and a bright orange-red.") + +df_trees.doc.nether_cap_desc = S("@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.", nethercap_name) +df_trees.doc.nether_cap_usage = S("@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.", nethercap_name) + +df_trees.doc.spore_tree_desc = S("Spore trees have a sturdy 'trunk' that supports a large spongy mesh of branching fibers, with embedded fruiting bodies that produce a copious amount of spores that gently rain down around the spore tree's base.") +df_trees.doc.spore_tree_usage = S("Spore tree trunks can be cut into pale woody planks. The branching fibers and fruiting bodies are only useful as fuel.") + +df_trees.doc.tower_cap_desc = S("The king of the fungi, tower cap mushrooms grow to immense proportions.") +df_trees.doc.tower_cap_usage = S("Tower caps are an excellent source of wood.") + +df_trees.doc.tunnel_tube_desc = S("Tunnel tubes are hollow, curved fungal growths that support a fruiting body.") +if df_trees.config.enable_tnt then + df_trees.doc.tunnel_tube_usage = S("The trunk of a tunnel tube can be cut and processed to produce plywood-like material. The fruiting body accumulates high-energy compounds that, when ignited, produce a vigorous detonation - a unique adaptation for spreading tunnel tube spawn through the still cavern air.") +else + df_trees.doc.tunnel_tube_usage = S("The trunk of a tunnel tube can be cut and processed to produce plywood-like material.") +end + +df_trees.doc.torchspine_desc = S("Torchspines are strange organic formations that are alive only in a technical sense. They \"feed\" on volatile flammable vapors vented up through their structure, growing from combustion residue deposited at their tips.") +df_trees.doc.torchspine_usage = S("A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.") + +df_trees.doc.spindlestem_desc = S("Spindlestems are too big to easily pluck by hand but too small to be called a proper tree. Nevertheless, they are a common and useful resource for underground travelers - particularly their glowing caps.") +df_trees.doc.spindlestem_usage = S("The stem of a Spindlestem is surprisingly sturdy, and despite their thinness they can grow quite tall. They can be used as a wood substitute in many crafting recipes.") + +df_trees.doc.spindlestem_cap_white_desc = S("The cap of a Spindlestem, uncontaminated by any symbiotic luminescent microorganisms.") +df_trees.doc.spindlestem_cap_white_usage = S("These things are useless except as weak fuel for a fire.") + +df_trees.doc.spindlestem_cap_red_desc = S("The cap of a Spindlestem, glowing a weak red due to symbiotic microorganisms.") +df_trees.doc.spindlestem_cap_red_usage = S("Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.") + +df_trees.doc.spindlestem_cap_green_desc = S("The cap of a Spindlestem, glowing a soft green due to symbiotic microorganisms.") +df_trees.doc.spindlestem_cap_green_usage = S("Green Spindlestems are a sign of nearby copper deposits. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is not strong.") + +df_trees.doc.spindlestem_cap_cyan_desc = S("The cap of a Spindlestem, glowing a strong cyan due to symbiotic microorganisms.") +df_trees.doc.spindlestem_cap_cyan_usage = S("Cyan Spindlestems are a sign of both copper and iron deposits nearby. Their glowing symbiotes can be extracted as a long-lived light source.") + +df_trees.doc.spindlestem_cap_golden_desc = S("The cap of a Spindlestem, glowing a brilliant yellow due to symbiotic microorganisms.") +df_trees.doc.spindlestem_cap_golden_usage = S("Golden Spindlestems are a sign of rare and magical mineral deposits nearby. Their glowing symbiotes can be extracted as a strong and long-lived light source.") + + +df_trees.doc.spindlestem_extract_red_desc = S("Living extract from the cap of a red Spindlestem.") +df_trees.doc.spindlestem_extract_red_usage = df_trees.doc.spindlestem_cap_red_usage +df_trees.doc.spindlestem_extract_green_desc = S("Living extract from the cap of a green Spindlestem.") +df_trees.doc.spindlestem_extract_green_usage = df_trees.doc.spindlestem_cap_green_usage +df_trees.doc.spindlestem_extract_cyan_desc = S("Living extract from the cap of a cyan Spindlestem.") +df_trees.doc.spindlestem_extract_cyan_usage = df_trees.doc.spindlestem_cap_cyan_usage +df_trees.doc.spindlestem_extract_golden_desc = S("Living extract from the cap of a yellow Spindlestem.") +df_trees.doc.spindlestem_extract_golden_usage = df_trees.doc.spindlestem_cap_golden_usage \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/fungiwood.lua b/mods/dfcaverns/df_trees/fungiwood.lua new file mode 100644 index 0000000..ea7be80 --- /dev/null +++ b/mods/dfcaverns/df_trees/fungiwood.lua @@ -0,0 +1,238 @@ +-------------------------------------------------- +-- Fungiwood + +-- fine grain +-- Max trunk height 8 +-- depth 1-2 + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_trees:fungiwood", { + description = S("Fungiwood Stem"), + _doc_items_longdesc = df_trees.doc.fungiwood_desc, + _doc_items_usagehelp = df_trees.doc.fungiwood_usage, + tiles = {"dfcaverns_fungiwood.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + + on_place = minetest.rotate_node +}) + +--Wood +minetest.register_craft({ + output = 'df_trees:fungiwood_wood 4', + recipe = { + {'df_trees:fungiwood'}, + } +}) + +minetest.register_node("df_trees:fungiwood_wood", { + description = S("Fungiwood Planks"), + _doc_items_longdesc = df_trees.doc.fungiwood_desc, + _doc_items_usagehelp = df_trees.doc.fungiwood_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_fungiwood_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, +}) + +df_dependencies.register_all_stairs_and_fences("fungiwood_wood", {burntime = 7}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:fungiwood_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:fungiwood", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:fungiwood_shelf", + burntime = 3, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:fungiwood_sapling", + burntime = 2, +}) + +minetest.register_node("df_trees:fungiwood_shelf",{ + description = S("Fungiwood Shelf"), + _doc_items_longdesc = df_trees.doc.fungiwood_desc, + _doc_items_usagehelp = df_trees.doc.fungiwood_usage, + tiles = {"dfcaverns_fungiwood.png", "dfcaverns_fungiwood_shelf_underside.png", "dfcaverns_fungiwood.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.375, -0.5, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, 0.3125, -0.0625, 0.5, 0.375, 0.0625}, -- NodeBox2 + {-0.0625, 0.3125, -0.5, 0.0625, 0.375, 0.5}, -- NodeBox3 + } + }, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 5, flammable = 2, leaves = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + drop = { + max_items = 1, + items = { + {items = {"df_trees:fungiwood_sapling"}, rarity = 10}, + {items = {"df_trees:fungiwood_shelf"}} + } + }, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_trees:fungiwood"}, + leaves = {"df_trees:fungiwood_shelf"}, + radius = 5, +}) + +minetest.register_node("df_trees:fungiwood_sapling", { + description = S("Fungiwood Spawn"), + _doc_items_longdesc = df_trees.doc.fungiwood_desc, + _doc_items_usagehelp = df_trees.doc.fungiwood_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_fungiwood_sapling.png"}, + inventory_image = "dfcaverns_fungiwood_sapling.png", + wield_image = "dfcaverns_fungiwood_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + floodable = true, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_construct = function(pos) + if df_trees.fungiwood_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.fungiwood_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.fungiwood_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + minetest.set_node(pos, {name="air"}) + df_trees.spawn_fungiwood(pos) + end, +}) + +local c_air = minetest.get_content_id("air") +local c_ignore = minetest.get_content_id("ignore") +local c_fungiwood = minetest.get_content_id("df_trees:fungiwood") +local c_fungiwood_shelf = minetest.get_content_id("df_trees:fungiwood_shelf") + +function df_trees.spawn_fungiwood(pos) + local x, y, z = pos.x, pos.y, pos.z + local height = math.random(6, 10) + local maxy = y + height -- Trunk top + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y, z = z - 3}, + {x = x + 3, y = maxy, z = z + 3} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + df_trees.spawn_fungiwood_vm(area:indexp(pos), area, data, height) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_trees.spawn_fungiwood_vm = function(vi, area, data, height) + if height == nil then height = math.random(6, 10) end + local pos = area:position(vi) + local x = pos.x + local y = pos.y + local z = pos.z + local maxy = y + height -- Trunk top + + -- Upper branches layer + local dev = 3 + for yy = maxy - 2, maxy do + for zz = z - dev, z + dev do + local vi = area:index(x - dev, yy, zz) + local via = area:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if math.random() < 0.95 - dev * 0.05 then + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore then + data[vi] = c_fungiwood_shelf + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Lower branches layer + local my = 0 + for i = 1, 20 do -- Random 2x2 squares of shelf + local xi = x + math.random(-3, 2) + local yy = maxy + math.random(-6, -5) + local zi = z + math.random(-3, 2) + if yy > my then + my = yy + end + for zz = zi, zi+1 do + local vi = area:index(xi, yy, zz) + local via = area:index(xi, yy + 1, zz) + for xx = xi, xi + 1 do + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore then + data[vi] = c_fungiwood_shelf + end + vi = vi + 1 + via = via + 1 + end + end + end + + -- Trunk + for yy = y, maxy do + local vi = area:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or + node_id == c_fungiwood_shelf then + data[vi] = c_fungiwood + end + end +end diff --git a/mods/dfcaverns/df_trees/goblin_cap.lua b/mods/dfcaverns/df_trees/goblin_cap.lua new file mode 100644 index 0000000..3932f54 --- /dev/null +++ b/mods/dfcaverns/df_trees/goblin_cap.lua @@ -0,0 +1,322 @@ +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator(minetest.get_current_modname()) + +local log_location +if minetest.get_modpath("mapgen_helper") and mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +--stem +minetest.register_node("df_trees:goblin_cap_stem", { + description = S("Goblin Cap Stem"), + _doc_items_longdesc = df_trees.doc.goblin_cap_desc, + _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, + tiles = {"dfcaverns_goblin_cap_stem.png"}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, goblin_cap = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +--cap +minetest.register_node("df_trees:goblin_cap", { + description = S("Goblin Cap"), + _doc_items_longdesc = df_trees.doc.goblin_cap_desc, + _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, + tiles = {"dfcaverns_goblin_cap.png"}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, goblin_cap = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +--gills +minetest.register_node("df_trees:goblin_cap_gills", { + description = S("Goblin Cap Gills"), + _doc_items_longdesc = df_trees.doc.goblin_cap_desc, + _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, + tiles = {"dfcaverns_goblin_cap_gills.png"}, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1, goblin_cap = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + sounds = df_dependencies.sound_leaves(), + drawtype = "plantlike", + paramtype = "light", + drop = { + max_items = 1, + items = { + { + items = {'df_trees:goblin_cap_sapling'}, + rarity = 15, + }, + { + items = {'df_trees:goblin_cap_gills'}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_trees:goblin_cap"}, -- don't need stem nodes here + leaves = {"df_trees:goblin_cap_gills"}, + radius = 1, +}) + +--Wood +minetest.register_craft({ + output = 'df_trees:goblin_cap_wood 4', + recipe = { + {'df_trees:goblin_cap'}, + } +}) + +minetest.register_craft({ + output = 'df_trees:goblin_cap_stem_wood 4', + recipe = { + {'df_trees:goblin_cap_stem'}, + } +}) + +minetest.register_node("df_trees:goblin_cap_wood", { + description = S("Goblin Cap Planks"), + _doc_items_longdesc = df_trees.doc.goblin_cap_desc, + _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_goblin_cap_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, +}) + +minetest.register_node("df_trees:goblin_cap_stem_wood", { + description = S("Goblin Cap Stem Planks"), + _doc_items_longdesc = df_trees.doc.goblin_cap_desc, + _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_goblin_cap_stem_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, +}) + +df_dependencies.register_all_stairs_and_fences("goblin_cap_wood", {burntime = 12}) +df_dependencies.register_all_stairs_and_fences("goblin_cap_stem_wood", {burntime = 7}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:goblin_cap_wood", + burntime = 12, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:goblin_cap_stem_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:goblin_cap", + burntime = 40, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:goblin_cap_stem", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:goblin_cap_gills", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:goblin_cap_sapling", + burntime = 2, +}) + +local big_goblin_cap_schem = dofile(modpath.."/schematics/goblin_cap_big.lua") +local big_goblin_cap_hut_schem = dofile(modpath.."/schematics/goblin_cap_big_hut.lua") +local bigger_goblin_cap_schem = dofile(modpath.."/schematics/goblin_cap_bigger.lua") +local bigger_goblin_cap_hut_schem = dofile(modpath.."/schematics/goblin_cap_bigger_hut.lua") + +-- The hut has a chest and furnace near pos, use this to initialize it +local chest_node = df_dependencies.node_name_chest +local furnace_node = df_dependencies.node_name_furnace +local gold_item = df_dependencies.node_name_gold_ingot +local apple_item = df_dependencies.node_name_apple + +local chest_on_construct = minetest.registered_items[chest_node].on_construct +local furnace_on_construct = minetest.registered_items[furnace_node].on_construct +local init_hut = function(pos) + local chest_pos = minetest.find_node_near({x=pos.x, y=pos.y+1, z=pos.z}, 2, chest_node) + if chest_pos then + chest_on_construct(chest_pos) + local inv = minetest.get_inventory({type="node", pos=chest_pos}) + inv:add_item("main", apple_item.." 3") + inv:add_item("main", gold_item.." ".. math.random(1,5)) + end + local furnace_pos = minetest.find_node_near({x=pos.x, y=pos.y+1, z=pos.z}, 2, furnace_node) + if furnace_pos then + furnace_on_construct(furnace_pos) + end +end +local init_vessels +if minetest.get_modpath("vessels") then + local vessels_on_construct = minetest.registered_items["vessels:shelf"].on_construct + init_vessels = function(pos) + local vessel_pos = minetest.find_node_near({x=pos.x, y=pos.y+1, z=pos.z}, 2, "vessels:shelf") + if vessel_pos then + vessels_on_construct(vessel_pos) + local inv = minetest.get_inventory({type="node", pos=vessel_pos}) + inv:add_item("vessels", "df_trees:glowing_bottle_red "..math.random(50,99)) + inv:add_item("vessels", "df_trees:glowing_bottle_green "..math.random(50,99)) + inv:add_item("vessels", "df_trees:glowing_bottle_cyan "..math.random(40,99)) + inv:add_item("vessels", "df_trees:glowing_bottle_golden "..math.random(30,99)) + end + end +end + +--local debug_test_hut = function(pos) +-- minetest.set_node(pos, {name="air"}) +-- minetest.after(5, init_hut, pos) +-- if math.random() < 0.5 then +-- mapgen_helper.place_schematic(pos, big_goblin_cap_hut_schem, "random") +-- else +-- if init_vessels then +-- minetest.after(5, init_vessels, pos) +-- end +-- mapgen_helper.place_schematic(pos, bigger_goblin_cap_hut_schem, "random") +-- end +--end + + +-- sapling +minetest.register_node("df_trees:goblin_cap_sapling", { + description = S("Goblin Cap Spawn"), + _doc_items_longdesc = df_trees.doc.goblin_cap_desc, + _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_goblin_cap_sapling.png"}, + inventory_image = "dfcaverns_goblin_cap_sapling.png", + wield_image = "dfcaverns_goblin_cap_sapling.png", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + floodable = true, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_construct = function(pos) + if df_trees.goblin_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.goblin_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.goblin_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + + minetest.set_node(pos, {name="air"}) + if minetest.find_node_near({x=pos.x, y=pos.y-1, z=pos.z}, 1, {"group:straw"}) then + if math.random() < 0.5 then + mapgen_helper.place_schematic(pos, big_goblin_cap_schem) + else + mapgen_helper.place_schematic(pos, bigger_goblin_cap_schem) + end + return + else + df_trees.spawn_goblin_cap(pos) + end + end, +}) + +local c_stem = minetest.get_content_id("df_trees:goblin_cap_stem") +local c_cap = minetest.get_content_id("df_trees:goblin_cap") +local c_gills = minetest.get_content_id("df_trees:goblin_cap_gills") + +df_trees.spawn_goblin_cap = function(pos) + if math.random() < 0.1 then + if math.random() < 0.5 then + mapgen_helper.place_schematic(pos, big_goblin_cap_schem) + else + mapgen_helper.place_schematic(pos, bigger_goblin_cap_schem) + end + return + end + + local x, y, z = pos.x, pos.y, pos.z + + local stem_height = math.random(1,3) + local cap_radius = math.random(3,6) + local maxy = y + stem_height + 3 + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - cap_radius, y = y, z = z - cap_radius}, + {x = x + cap_radius, y = maxy + 3, z = z + cap_radius} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + subterrane.giant_mushroom(area:indexp(pos), area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_trees.spawn_goblin_cap_vm = function(vi, area, data, data_param2) + if math.random() < 0.1 then + local pos = area:position(vi) + if math.random() < 0.5 then + mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, big_goblin_cap_schem) + if log_location then log_location("goblin_cap_big", pos) end + elseif math.random() < 0.9 then + mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, bigger_goblin_cap_schem) + if log_location then log_location("goblin_cap_bigger", pos) end + else + -- easter egg - every once in a while (0.5%), a mapgen Goblin cap is a Smurf house + minetest.after(5, init_hut, pos) + if math.random() < 0.5 then + mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, big_goblin_cap_hut_schem) + if log_location then log_location("goblin_cap_big_hut", pos) end + else + if init_vessels then + minetest.after(5, init_vessels, pos) + end + mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, bigger_goblin_cap_hut_schem) + if log_location then log_location("goblin_cap_bigger_hut", pos) end + end + end + return + end + + local stem_height = math.random(1,3) + local cap_radius = math.random(3,6) + subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/init.lua b/mods/dfcaverns/df_trees/init.lua new file mode 100644 index 0000000..efaba73 --- /dev/null +++ b/mods/dfcaverns/df_trees/init.lua @@ -0,0 +1,32 @@ +df_trees = {} + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +-- This is used by other mods, leave it exposed +df_trees.node_sound_tree_soft_fungus_defaults = function(table) + table = table or {} + table.footstep = table.footstep or + {name = "dfcaverns_fungus_footstep", gain = 0.3} + df_dependencies.sound_wood(table) + return table +end + +--load companion lua files +dofile(modpath.."/config.lua") +dofile(modpath.."/doc.lua") +dofile(modpath.."/aliases.lua") + +dofile(modpath.."/blood_thorn.lua") +dofile(modpath.."/fungiwood.lua") +dofile(modpath.."/tunnel_tube.lua") +dofile(modpath.."/spore_tree.lua") +dofile(modpath.."/black_cap.lua") +dofile(modpath.."/nether_cap.lua") +dofile(modpath.."/goblin_cap.lua") +dofile(modpath.."/tower_cap.lua") + +dofile(modpath.."/torchspine.lua") +dofile(modpath.."/spindlestem.lua") + +dofile(modpath.."/sapling_growth_conditions.lua") \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/locale/df_trees.de.tr b/mods/dfcaverns/df_trees/locale/df_trees.de.tr new file mode 100644 index 0000000..5363bcd --- /dev/null +++ b/mods/dfcaverns/df_trees/locale/df_trees.de.tr @@ -0,0 +1,236 @@ +# textdomain: df_trees + + +### black_cap.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Black Cap=Schwarze Kappe +Black Cap Gills= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Black Cap Planks=Black Cap Planken +Black Cap Spawn= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Black Cap Stem=Schwarzer Kappenstiel + +### blood_thorn.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Blood Thorn Planks=Blutdornbretter +Blood Thorn Spike= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Blood Thorn Stem=Blutdornstamm +Dead Blood Thorn Spike= +Dead Blood Thorn Stem= + +### doc.lua ### + +@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= + +@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.=Eine Fackel wechselt zwischen aktiver und ruhender Phase und gibt schwaches Licht ab, wenn sie aktiv ist. Sie können für Fackeln geerntet werden, und ihre Glut sprießt auf brennbaren Oberflächen zu neuen Fackelstacheln. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications. Black cap gills are oily and make for excellent torch fuel.=Abgesehen von den künstlerischen Anwendungen seiner besonders dunklen Farbe ist Schwarzkappenholz eine langbrennende Brennstoffquelle, die für einige Anwendungen so gut wie Kohle ist. Kiemen mit schwarzer Kappe sind ölig und sorgen für hervorragenden Brennerkraftstoff. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Blood thorns are the most vicious of underground flora, as befits their harsh environments. Found only in hot, dry caverns with sandy soil far from the surface world's organic bounty, blood thorns seek to supplement their nutrient supply with wickedly barbed hollow spines that actively drain fluids from whatever stray plant or creature they might impale.=Blutdornen sind die bösartigste unterirdische Flora, wie es sich für ihre raue Umgebung gehört. Blutdornen kommen nur in heißen, trockenen Höhlen mit sandigem Boden vor, weit entfernt von der organischen Prämie der Oberflächenwelt. Sie versuchen, ihre Nährstoffversorgung durch boshafte, hohle Stacheln zu ergänzen, die aktiv Flüssigkeiten aus streunenden Pflanzen oder Kreaturen ablassen, die sie aufspießen könnten. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cyan Spindlestems are a sign of both copper and iron deposits nearby. Their glowing symbiotes can be extracted as a long-lived light source.=Cyan-Spindelstämme sind ein Zeichen für Kupfer- und Eisenvorkommen in der Nähe. Ihre leuchtenden Symbioten können als langlebige Lichtquelle extrahiert werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungiwood stalk is strong and very fine-grained, making smooth yellow-tinted lumber when cut. Fungiwood shelf is too fragile to be much use as anything other than fuel.=Der Pilzholzstiel ist stark und sehr feinkörnig, wodurch beim Schneiden glattes, gelb getöntes Holz entsteht. Das Pilzholzregal ist zu zerbrechlich, um als etwas anderes als Kraftstoff verwendet zu werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Goblin cap stem and cap material can be cut into wood of two different hues, a subdued cream and a bright orange-red.=Goblin-Kappenstiel und Kappenmaterial können in Holz in zwei verschiedenen Farbtönen geschnitten werden, einer gedämpften Creme und einem leuchtenden Orangerot. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Golden Spindlestems are a sign of rare and magical mineral deposits nearby. Their glowing symbiotes can be extracted as a strong and long-lived light source.=Goldene Spindelstämme sind ein Zeichen für seltene und magische Mineralvorkommen in der Nähe. Ihre leuchtenden Symbioten können als starke und langlebige Lichtquelle extrahiert werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Green Spindlestems are a sign of nearby copper deposits. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is not strong.=Grüne Spindelstämme sind ein Zeichen für nahegelegene Kupfervorkommen. Ihre leuchtenden Symbioten können als langlebige Lichtquelle extrahiert werden, obwohl das Leuchten nicht stark ist. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living blood thorn spikes remain harmful to creatures that touch them. If killed by bright light, they cause only passive damage to creatures that fall on them (as one would expect from an enormous spike).=Lebende Blutdornspitzen bleiben für Kreaturen, die sie berühren, schädlich. Wenn sie durch helles Licht getötet werden, verursachen sie nur passiven Schaden an Kreaturen, die auf sie fallen (wie man es von einer enormen Spitze erwarten würde). + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a cyan Spindlestem.=Lebender Extrakt aus der Kappe eines cyanfarbenen Spindlestems. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a green Spindlestem.=Lebender Extrakt aus der Kappe eines grünen Spindlestems. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a red Spindlestem.=Lebender Extrakt aus der Kappe eines roten Spindlestems. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a yellow Spindlestem.=Lebender Extrakt aus der Kappe eines gelben Spindlestems. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Massive but squat, mature goblin cap mushrooms are the size of small cottages.=Massive, aber gedrungene, reife Koboldkappenpilze haben die Größe kleiner Hütten. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.=Rote Spindelstämme sind ein Zeichen für nahegelegene Eisenvorkommen - oder vielleicht Goblin Caps. Ihre leuchtenden Symbioten können als langlebige Lichtquelle extrahiert werden, obwohl das Leuchten schwach ist. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spindlestems are too big to easily pluck by hand but too small to be called a proper tree. Nevertheless, they are a common and useful resource for underground travelers - particularly their glowing caps.=Spindelstämme sind zu groß, um leicht von Hand gepflückt zu werden, aber zu klein, um als richtiger Baum bezeichnet zu werden. Trotzdem sind sie eine häufige und nützliche Ressource für U-Bahn-Reisende - insbesondere für ihre leuchtenden Kappen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore tree trunks can be cut into pale woody planks. The branching fibers and fruiting bodies are only useful as fuel.=Sporenbaumstämme können in blasse Holzbretter geschnitten werden. Die verzweigten Fasern und Fruchtkörper sind nur als Brennstoff nützlich. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore trees have a sturdy 'trunk' that supports a large spongy mesh of branching fibers, with embedded fruiting bodies that produce a copious amount of spores that gently rain down around the spore tree's base.=Sporenbäume haben einen stabilen "Stamm", der ein großes schwammiges Netz aus verzweigten Fasern trägt, mit eingebetteten Fruchtkörpern, die eine große Menge von Sporen produzieren, die sanft um die Basis des Sporenbaums regnen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a brilliant yellow due to symbiotic microorganisms.=Die Kappe eines Spindlestems, die aufgrund symbiotischer Mikroorganismen leuchtend gelb leuchtet. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a soft green due to symbiotic microorganisms.=Die Kappe eines Spindlestems, die aufgrund symbiotischer Mikroorganismen sanft grün leuchtet. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a strong cyan due to symbiotic microorganisms.=Die Kappe eines Spindlestems, die aufgrund symbiotischer Mikroorganismen stark cyan leuchtet. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a weak red due to symbiotic microorganisms.=Die Kappe eines Spindlestems, die aufgrund symbiotischer Mikroorganismen schwach rot leuchtet. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, uncontaminated by any symbiotic luminescent microorganisms.=Die Kappe eines Spindlestems, die nicht durch symbiotische lumineszierende Mikroorganismen kontaminiert ist. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The dense black wood of these mushrooms is heavy and hard to work with, and has few remarkable properties.=Das dichte schwarze Holz dieser Pilze ist schwer und schwer zu verarbeiten und hat nur wenige bemerkenswerte Eigenschaften. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The king of the fungi, tower cap mushrooms grow to immense proportions.=Der König der Pilze, Turmkappenpilze, wachsen zu immensen Ausmaßen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The spikes of a blood thorn can actually remain living long after they're severed from their parent stalk, a testament to their tenacity. As long as they remain alive they will continue to actively drain anything they puncture, though they don't grow.=Die Stacheln eines Blutdorns können tatsächlich noch lange leben, nachdem sie von ihrem Elternstiel abgetrennt wurden, ein Beweis für ihre Hartnäckigkeit. Solange sie am Leben bleiben, werden sie weiterhin aktiv alles ablassen, was sie durchstechen, obwohl sie nicht wachsen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The stem of a Spindlestem is surprisingly sturdy, and despite their thinness they can grow quite tall. They can be used as a wood substitute in many crafting recipes.=Der Stiel eines Spindlestems ist überraschend robust und kann trotz ihrer Dünnheit ziemlich groß werden. Sie können als Holzersatz in vielen Handwerksrezepten verwendet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The trunk of a tunnel tube can be cut and processed to produce plywood-like material.=Der Stamm eines Tunnelrohrs kann geschnitten und zu sperrholzartigem Material verarbeitet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The trunk of a tunnel tube can be cut and processed to produce plywood-like material. The fruiting body accumulates high-energy compounds that, when ignited, produce a vigorous detonation - a unique adaptation for spreading tunnel tube spawn through the still cavern air.=Der Stamm eines Tunnelrohrs kann geschnitten und zu sperrholzartigem Material verarbeitet werden. Der Fruchtkörper sammelt hochenergetische Verbindungen an, die beim Zünden eine heftige Detonation hervorrufen - eine einzigartige Anpassung für die Ausbreitung von Tunnelrohrlaich in der stillen Höhlenluft. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These things are useless except as weak fuel for a fire.=Diese Dinge sind nutzlos, außer als schwacher Brennstoff für ein Feuer. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Thin, irregular layers of spore-producing 'shelves' surround the strong central stalk of the mighty Fungiwood.=Dünne, unregelmäßige Schichten sporenproduzierender "Regale" umgeben den starken Mittelstiel des mächtigen Pilzwaldes. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Torchspines are strange organic formations that are alive only in a technical sense. They "feed" on volatile flammable vapors vented up through their structure, growing from combustion residue deposited at their tips.=Fackelstacheln sind seltsame organische Formationen, die nur im technischen Sinne leben. Sie "ernähren" sich von flüchtigen brennbaren Dämpfen, die durch ihre Struktur entweichen und aus Verbrennungsrückständen wachsen, die sich an ihren Spitzen ablagern. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tower caps are an excellent source of wood.=Turmkappen sind eine ausgezeichnete Holzquelle. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tunnel tubes are hollow, curved fungal growths that support a fruiting body.=Tunnelrohre sind hohle, gekrümmte Pilzwucherungen, die einen Fruchtkörper stützen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When harvested, the central stalk of a blood thorn can be cut into planks and used as wood. It has a purple-red hue that may or may not appeal, depending on one's artistic tastes.=Bei der Ernte kann der zentrale Stiel eines Blutdorns in Bretter geschnitten und als Holz verwendet werden. Es hat einen purpurroten Farbton, der je nach künstlerischem Geschmack ansprechen kann oder nicht. + + +### fungiwood.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungiwood Planks=Fungiwood Planken +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungiwood Shelf=Fungiwood Regal +Fungiwood Spawn= +Fungiwood Stem= + +### goblin_cap.lua ### + +Goblin Cap= +Goblin Cap Gills= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Goblin Cap Planks=Goblin Cap Planken +Goblin Cap Spawn= +Goblin Cap Stem= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Goblin Cap Stem Planks=Goblin Cap Stem Planken + +### nether_cap.lua ### + +@1 Gills= +@1 Planks= +@1 Spawn= +@1 Stem= + +### spindlestem.lua ### + +@1 Spindlestem Cap= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Spindlestem Extract=@1 Spindlestem-Extrakt +Cyan= +Golden= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Green=Grün +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Red=Rot +Spindlestem= +Spindlestem Spawn= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +White=Weiß + +### spore_tree.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore Tree Fruiting Body=Sporenbaum-Fruchtkörper +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore Tree Hyphae=Sporenbaumhyphen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore Tree Ladder=Sporenbaumleiter +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore Tree Planks=Sporenbaumbretter +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore Tree Spawn=Sporenbaumlaich +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore Tree Stem=Sporenbaumstamm + +### torchspine.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Torchspine=Fackelrücken +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Torchspine Ember=Fackelglut +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Torchspine Tip=Fackelspitze + +### tower_cap.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tower Cap=Turmkappe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tower Cap Gills=Tower Cap Kiemen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tower Cap Planks=Turmkappenbretter +Tower Cap Spawn= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tower Cap Stem=Turmkappenstiel + +### tunnel_tube.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tunnel Tube=Tunnelrohr +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tunnel Tube Fruiting Body=Tunnelrohr-Fruchtkörper +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tunnel Tube Plies=Tunnelrohrlagen +Tunnel Tube Spawn= + + +##### not used anymore ##### + + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.=Netherkappenholz ist nicht nur ein wunderschöner blauer Farbton, sondern behält auch die seltsame Wärmeableitungsfähigkeit lebender Netherkappen bei und kann in der Nähe befindliche Wasserfeststoffe schnell einfrieren. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.=Netherkappen haben eine ungewöhnliche Biochemie, die es ihnen ermöglicht, unter Verstoß gegen alle bekannten Gesetze der Thermodynamik von Umgebungswärme zu leben. Sie wachsen tief unter der Erde in kalten, eisigen Höhlen, die auf jeden Fall vulkanisch sein sollten. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether Cap Gills=Nether Cap Kiemen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether Cap Planks=Nether Cap Planken diff --git a/mods/dfcaverns/df_trees/locale/df_trees.it.tr b/mods/dfcaverns/df_trees/locale/df_trees.it.tr new file mode 100644 index 0000000..5829ac3 --- /dev/null +++ b/mods/dfcaverns/df_trees/locale/df_trees.it.tr @@ -0,0 +1,210 @@ +# textdomain: df_trees + + +### black_cap.lua ### + +Black Cap=Cappello nero +Black Cap Gills=Lamelle di cappello nero +Black Cap Planks=Assi di cappello nero +Black Cap Spawn=Prole di cappello nero +Black Cap Stem=Gambo di cappello nero + +### blood_thorn.lua ### + +Blood Thorn Planks=Assi di spina del sangue +Blood Thorn Spike=Spuntone di spina del sangue +Blood Thorn Stem=Gambo di spina del sangue +Dead Blood Thorn Spike=Spuntone di spina del sangue morta +Dead Blood Thorn Stem=Gambo di spina del sangue morta + +### doc.lua ### + +@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= + +@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.=Una torcia alterna le fasi attiva e quiescente ed emette una luce fioca quando è attiva. Possono essere raccolti per le torce e le loro braci germogliano in nuove spine delle torce quando vengono posizionate su superfici infiammabili. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications. Black cap gills are oily and make for excellent torch fuel.=A parte le applicazioni artistiche del suo colore particolarmente scuro, il legno del cappello nero è una fonte di combustibile a combustione lunga che è buona come il carbone per alcune applicazioni. Le branchie del cappuccio nero sono oleose e costituiscono un eccellente combustibile per la torcia. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Blood thorns are the most vicious of underground flora, as befits their harsh environments. Found only in hot, dry caverns with sandy soil far from the surface world's organic bounty, blood thorns seek to supplement their nutrient supply with wickedly barbed hollow spines that actively drain fluids from whatever stray plant or creature they might impale.=Le spine di sangue sono le più viziose della flora sotterranea, come si addice ai loro ambienti ostili. Trovate solo in caverne calde e asciutte con terreno sabbioso lontano dalla generosità organica del mondo di superficie, le spine di sangue cercano di integrare il loro apporto di nutrienti con spine cave malvagie che drenano attivamente i fluidi da qualsiasi pianta o creatura vagante che potrebbero impalare. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cyan Spindlestems are a sign of both copper and iron deposits nearby. Their glowing symbiotes can be extracted as a long-lived light source.=Gli spindlestem ciano sono un segno di depositi di rame e ferro nelle vicinanze. I loro simbionti luminosi possono essere estratti come fonte di luce a lunga durata. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Fungiwood stalk is strong and very fine-grained, making smooth yellow-tinted lumber when cut. Fungiwood shelf is too fragile to be much use as anything other than fuel.=Il gambo di legno di fungo è forte e a grana molto fine, quando viene tagliato produce legname liscio di colore giallo. La mensola in legno di fungo è troppo fragile per essere utilizzata come qualcosa di diverso dal carburante. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Goblin cap stem and cap material can be cut into wood of two different hues, a subdued cream and a bright orange-red.=Il gambo e il materiale del cappuccio del goblin possono essere tagliati in legno di due diverse tonalità, una crema tenue e un rosso arancio brillante. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Golden Spindlestems are a sign of rare and magical mineral deposits nearby. Their glowing symbiotes can be extracted as a strong and long-lived light source.=I Golden Spindlestems sono un segno di depositi minerali rari e magici nelle vicinanze. I loro simbionti luminosi possono essere estratti come una fonte di luce forte e di lunga durata. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Green Spindlestems are a sign of nearby copper deposits. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is not strong.=Gli spindlestem verdi sono un segno di depositi di rame nelle vicinanze. I loro simbionti luminosi possono essere estratti come fonte di luce a lunga durata, sebbene il bagliore non sia forte. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living blood thorn spikes remain harmful to creatures that touch them. If killed by bright light, they cause only passive damage to creatures that fall on them (as one would expect from an enormous spike).=Le punte di spine di sangue vivo rimangono dannose per le creature che le toccano. Se uccisi da una luce intensa, causano solo danni passivi alle creature che cadono su di loro (come ci si aspetterebbe da un enorme picco). + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a cyan Spindlestem.=Estratto vivo dal tappo di uno Spindlestem ciano. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a green Spindlestem.=Estratto vivo dal cappello di uno Spindlestem verde. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a red Spindlestem.=Estratto vivo dal cappello di uno Spindlestem rosso. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Living extract from the cap of a yellow Spindlestem.=Estratto vivo dal cappello di uno Spindlestem giallo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Massive but squat, mature goblin cap mushrooms are the size of small cottages.=I funghi goblin sono grandi ma tozzi e maturi, hanno le dimensioni di piccoli cottage. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.=I Red Spindlestems sono un segno di depositi di ferro vicini - o forse Goblin Caps. I loro simbionti luminosi possono essere estratti come fonte di luce a lunga durata, anche se il bagliore è debole. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spindlestems are too big to easily pluck by hand but too small to be called a proper tree. Nevertheless, they are a common and useful resource for underground travelers - particularly their glowing caps.=Gli spindlestem sono troppo grandi per essere strappati facilmente a mano ma troppo piccoli per essere definiti un albero vero e proprio. Tuttavia, sono una risorsa comune e utile per i viaggiatori sotterranei, in particolare i loro berretti luminosi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore tree trunks can be cut into pale woody planks. The branching fibers and fruiting bodies are only useful as fuel.=I tronchi degli alberi di spore possono essere tagliati in assi legnose chiare. Le fibre ramificate e i corpi fruttiferi sono utili solo come combustibile. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Spore trees have a sturdy 'trunk' that supports a large spongy mesh of branching fibers, with embedded fruiting bodies that produce a copious amount of spores that gently rain down around the spore tree's base.=Gli alberi di spore hanno un robusto "tronco" che sostiene una grande rete spugnosa di fibre ramificate, con corpi fruttiferi incorporati che producono una copiosa quantità di spore che piovono delicatamente intorno alla base dell'albero di spore. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a brilliant yellow due to symbiotic microorganisms.=Il cappuccio di uno Spindlestem, che brilla di un giallo brillante a causa di microrganismi simbiotici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a soft green due to symbiotic microorganisms.=Il cappuccio di uno Spindlestem, che emette un colore verde tenue a causa di microrganismi simbiotici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a strong cyan due to symbiotic microorganisms.=Il cappuccio di uno Spindlestem, che emette un forte colore ciano a causa di microrganismi simbiotici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, glowing a weak red due to symbiotic microorganisms.=Il cappuccio di uno Spindlestem, che brilla di un debole rosso a causa di microrganismi simbiotici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The cap of a Spindlestem, uncontaminated by any symbiotic luminescent microorganisms.=Il cappuccio di uno Spindlestem, incontaminato da eventuali microrganismi luminescenti simbiotici. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The dense black wood of these mushrooms is heavy and hard to work with, and has few remarkable properties.=Il denso legno nero di questi funghi è pesante e difficile da lavorare e ha poche proprietà notevoli. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The king of the fungi, tower cap mushrooms grow to immense proportions.=Il re dei funghi, i funghi con cappuccio a torre crescono in proporzioni immense. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The spikes of a blood thorn can actually remain living long after they're severed from their parent stalk, a testament to their tenacity. As long as they remain alive they will continue to actively drain anything they puncture, though they don't grow.=Le punte di una spina di sangue possono effettivamente rimanere in vita molto tempo dopo essere state separate dal gambo dei genitori, a testimonianza della loro tenacia. Finché rimangono in vita continueranno a drenare attivamente tutto ciò che forano, anche se non crescono. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The stem of a Spindlestem is surprisingly sturdy, and despite their thinness they can grow quite tall. They can be used as a wood substitute in many crafting recipes.=Lo stelo di uno Spindlestem è sorprendentemente robusto e nonostante la loro magrezza possono crescere abbastanza alti. Possono essere usati come sostituti del legno in molte ricette di lavorazione. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The trunk of a tunnel tube can be cut and processed to produce plywood-like material.=Il tronco di un tubo a tunnel può essere tagliato e lavorato per produrre materiale simile al compensato. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The trunk of a tunnel tube can be cut and processed to produce plywood-like material. The fruiting body accumulates high-energy compounds that, when ignited, produce a vigorous detonation - a unique adaptation for spreading tunnel tube spawn through the still cavern air.=Il tronco di un tubo a tunnel può essere tagliato e lavorato per produrre materiale simile al compensato. Il corpo fruttifero accumula composti ad alta energia che, una volta innescati, producono una vigorosa detonazione - un adattamento unico per diffondere le uova del tubo del tunnel attraverso l'aria tranquilla della caverna. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These things are useless except as weak fuel for a fire.=Queste cose sono inutili se non come combustibile debole per un incendio. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Thin, irregular layers of spore-producing 'shelves' surround the strong central stalk of the mighty Fungiwood.=Strati sottili e irregolari di "mensole" che producono spore circondano il robusto gambo centrale del potente Fungiwood. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Torchspines are strange organic formations that are alive only in a technical sense. They "feed" on volatile flammable vapors vented up through their structure, growing from combustion residue deposited at their tips.=Le torce sono strane formazioni organiche che sono vive solo in senso tecnico. Si "nutrono" di vapori volatili infiammabili emessi attraverso la loro struttura, che crescono dai residui di combustione depositati alle loro estremità. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tower caps are an excellent source of wood.=I cappucci delle torri sono un'ottima fonte di legno. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Tunnel tubes are hollow, curved fungal growths that support a fruiting body.=I tubi del tunnel sono escrescenze fungine cave e ricurve che supportano un corpo fruttifero. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When harvested, the central stalk of a blood thorn can be cut into planks and used as wood. It has a purple-red hue that may or may not appeal, depending on one's artistic tastes.=Quando viene raccolto, il gambo centrale di una spina sanguigna può essere tagliato in assi e usato come legno. Ha una tonalità rosso porpora che può piacere o meno, a seconda dei gusti artistici. + + +### fungiwood.lua ### + +Fungiwood Planks=Assi di fungo di legno +Fungiwood Shelf=Mensola di fungo di legno +Fungiwood Spawn=Prole di fungo di legno +Fungiwood Stem=Gambo di fungo di legno + +### goblin_cap.lua ### + +Goblin Cap=Cappello di folletto +Goblin Cap Gills=Lamelle di cappello di folletto +Goblin Cap Planks=Assi di cappello di folletto +Goblin Cap Spawn=Prole di cappello di folletto +Goblin Cap Stem=Gambo di cappello di folletto +Goblin Cap Stem Planks=Assi di gambo di cappello di folletto + +### nether_cap.lua ### + +@1 Gills=Lamelle di @1 +@1 Planks=Assi di @1 +@1 Spawn=Prole di @1 +@1 Stem=Gambo di @1 + +### spindlestem.lua ### + +@1 Spindlestem Cap= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Spindlestem Extract=@1 Estratto di Spindlestem +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Cyan=Ciano +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Golden=D'oro +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Green=Verde +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Red=Rosso +Spindlestem= +Spindlestem Spawn=Prole di albero delle spore +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +White=Bianca + +### spore_tree.lua ### + +Spore Tree Fruiting Body=Corpo fruttifero dell'albero delle spore +Spore Tree Hyphae=Ife di albero delle spore +Spore Tree Ladder=Ife di albero delle spore +Spore Tree Planks=Assi di albero delle spore +Spore Tree Spawn=Prole di albero delle spore +Spore Tree Stem=Gambo di albero delle spore + +### torchspine.lua ### + +Torchspine= +Torchspine Ember= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Torchspine Tip=Punta Torchspine + +### tower_cap.lua ### + +Tower Cap=Cappello a torre +Tower Cap Gills=Lamelle di cappello a torre +Tower Cap Planks=Assi di cappello a torre +Tower Cap Spawn=Prole di cappello a torre +Tower Cap Stem=Gambo di cappello a torre + +### tunnel_tube.lua ### + +Tunnel Tube=Tubo di galleria +Tunnel Tube Fruiting Body=Corpo fruttifero del tubo di galleria +Tunnel Tube Plies=Strati di tubo di galleria +Tunnel Tube Spawn=Prole di tubo di galleria + + +##### not used anymore ##### + + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.=Il legno del cappuccio inferiore, oltre ad essere una bella tonalità blu, conserva la strana capacità di drenaggio del calore dei tappi inferiori viventi ed è in grado di congelare rapidamente l'acqua solida vicina. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.=I cappucci inferiori hanno una biochimica insolita che consente loro di sopravvivere in qualche modo al calore ambientale, in violazione di tutte le leggi conosciute della termodinamica. Crescono in profondità nel sottosuolo in caverne gelide che dovrebbero a tutti gli effetti essere vulcaniche. + diff --git a/mods/dfcaverns/df_trees/locale/template.txt b/mods/dfcaverns/df_trees/locale/template.txt new file mode 100644 index 0000000..cc5d27a --- /dev/null +++ b/mods/dfcaverns/df_trees/locale/template.txt @@ -0,0 +1,157 @@ +# textdomain: df_trees + + +### black_cap.lua ### + +Black Cap= +Black Cap Gills= +Black Cap Planks= +Black Cap Spawn= +Black Cap Stem= + +### blood_thorn.lua ### + +Blood Thorn Planks= +Blood Thorn Spike= +Blood Thorn Stem= +Dead Blood Thorn Spike= +Dead Blood Thorn Stem= + +### doc.lua ### + +@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= + +@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.= + +A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.= + +Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications. Black cap gills are oily and make for excellent torch fuel.= + +Blood thorns are the most vicious of underground flora, as befits their harsh environments. Found only in hot, dry caverns with sandy soil far from the surface world's organic bounty, blood thorns seek to supplement their nutrient supply with wickedly barbed hollow spines that actively drain fluids from whatever stray plant or creature they might impale.= + +Cyan Spindlestems are a sign of both copper and iron deposits nearby. Their glowing symbiotes can be extracted as a long-lived light source.= + +Fungiwood stalk is strong and very fine-grained, making smooth yellow-tinted lumber when cut. Fungiwood shelf is too fragile to be much use as anything other than fuel.= + +Goblin cap stem and cap material can be cut into wood of two different hues, a subdued cream and a bright orange-red.= + +Golden Spindlestems are a sign of rare and magical mineral deposits nearby. Their glowing symbiotes can be extracted as a strong and long-lived light source.= + +Green Spindlestems are a sign of nearby copper deposits. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is not strong.= + +Living blood thorn spikes remain harmful to creatures that touch them. If killed by bright light, they cause only passive damage to creatures that fall on them (as one would expect from an enormous spike).= + +Living extract from the cap of a cyan Spindlestem.= +Living extract from the cap of a green Spindlestem.= +Living extract from the cap of a red Spindlestem.= +Living extract from the cap of a yellow Spindlestem.= + +Massive but squat, mature goblin cap mushrooms are the size of small cottages.= + +Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.= + +Spindlestems are too big to easily pluck by hand but too small to be called a proper tree. Nevertheless, they are a common and useful resource for underground travelers - particularly their glowing caps.= + +Spore tree trunks can be cut into pale woody planks. The branching fibers and fruiting bodies are only useful as fuel.= + +Spore trees have a sturdy 'trunk' that supports a large spongy mesh of branching fibers, with embedded fruiting bodies that produce a copious amount of spores that gently rain down around the spore tree's base.= + +The cap of a Spindlestem, glowing a brilliant yellow due to symbiotic microorganisms.= + +The cap of a Spindlestem, glowing a soft green due to symbiotic microorganisms.= + +The cap of a Spindlestem, glowing a strong cyan due to symbiotic microorganisms.= + +The cap of a Spindlestem, glowing a weak red due to symbiotic microorganisms.= + +The cap of a Spindlestem, uncontaminated by any symbiotic luminescent microorganisms.= + +The dense black wood of these mushrooms is heavy and hard to work with, and has few remarkable properties.= + +The king of the fungi, tower cap mushrooms grow to immense proportions.= + +The spikes of a blood thorn can actually remain living long after they're severed from their parent stalk, a testament to their tenacity. As long as they remain alive they will continue to actively drain anything they puncture, though they don't grow.= + +The stem of a Spindlestem is surprisingly sturdy, and despite their thinness they can grow quite tall. They can be used as a wood substitute in many crafting recipes.= + +The trunk of a tunnel tube can be cut and processed to produce plywood-like material.= + +The trunk of a tunnel tube can be cut and processed to produce plywood-like material. The fruiting body accumulates high-energy compounds that, when ignited, produce a vigorous detonation - a unique adaptation for spreading tunnel tube spawn through the still cavern air.= + +These things are useless except as weak fuel for a fire.= + +Thin, irregular layers of spore-producing 'shelves' surround the strong central stalk of the mighty Fungiwood.= + +Torchspines are strange organic formations that are alive only in a technical sense. They "feed" on volatile flammable vapors vented up through their structure, growing from combustion residue deposited at their tips.= + +Tower caps are an excellent source of wood.= + +Tunnel tubes are hollow, curved fungal growths that support a fruiting body.= + +When harvested, the central stalk of a blood thorn can be cut into planks and used as wood. It has a purple-red hue that may or may not appeal, depending on one's artistic tastes.= + + +### fungiwood.lua ### + +Fungiwood Planks= +Fungiwood Shelf= +Fungiwood Spawn= +Fungiwood Stem= + +### goblin_cap.lua ### + +Goblin Cap= +Goblin Cap Gills= +Goblin Cap Planks= +Goblin Cap Spawn= +Goblin Cap Stem= +Goblin Cap Stem Planks= + +### nether_cap.lua ### + +@1 Gills= +@1 Planks= +@1 Spawn= +@1 Stem= + +### spindlestem.lua ### + +@1 Spindlestem Cap= +@1 Spindlestem Extract= +Cyan= +Golden= +Green= +Red= +Spindlestem= +Spindlestem Spawn= +White= + +### spore_tree.lua ### + +Spore Tree Fruiting Body= +Spore Tree Hyphae= +Spore Tree Ladder= +Spore Tree Planks= +Spore Tree Spawn= +Spore Tree Stem= + +### torchspine.lua ### + +Torchspine= +Torchspine Ember= +Torchspine Tip= + +### tower_cap.lua ### + +Tower Cap= +Tower Cap Gills= +Tower Cap Planks= +Tower Cap Spawn= +Tower Cap Stem= + +### tunnel_tube.lua ### + +Tunnel Tube= +Tunnel Tube Fruiting Body= +Tunnel Tube Plies= +Tunnel Tube Spawn= diff --git a/mods/dfcaverns/df_trees/mod.conf b/mods/dfcaverns/df_trees/mod.conf new file mode 100644 index 0000000..f29022f --- /dev/null +++ b/mods/dfcaverns/df_trees/mod.conf @@ -0,0 +1,4 @@ +name = df_trees +description = Adds various types of underground fungal "trees". Light kills their saplings, they only grow in the dark. +depends = df_dependencies +optional_depends = doc, basic_materials, df_farming, mapgen_helper, looped_node_sound \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/models/license.txt b/mods/dfcaverns/df_trees/models/license.txt new file mode 100644 index 0000000..17364d2 --- /dev/null +++ b/mods/dfcaverns/df_trees/models/license.txt @@ -0,0 +1 @@ +All tunnel tube models were created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/models/tunnel_tube_slant.mtl b/mods/dfcaverns/df_trees/models/tunnel_tube_slant.mtl new file mode 100644 index 0000000..b33fe71 --- /dev/null +++ b/mods/dfcaverns/df_trees/models/tunnel_tube_slant.mtl @@ -0,0 +1,62 @@ +# Blender MTL File: 'tunnel tube base.blend' +# Material Count: 6 + +newmtl Back +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Bottom +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Front +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Left +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Right +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Top +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_trees/models/tunnel_tube_slant.obj b/mods/dfcaverns/df_trees/models/tunnel_tube_slant.obj new file mode 100644 index 0000000..1ea9b6d --- /dev/null +++ b/mods/dfcaverns/df_trees/models/tunnel_tube_slant.obj @@ -0,0 +1,94 @@ +# Blender v2.77 (sub 0) OBJ File: 'tunnel tube base.blend' +# www.blender.org +mtllib tunnel_tube_slant.mtl +o tunnel_tube_slant_Cube.002 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.250000 -0.500000 0.250000 +v 0.250000 -0.500000 0.250000 +v 0.250000 -0.500000 -0.250000 +v -0.250000 -0.500000 -0.250000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -1.000000 +v -0.500000 0.500000 -1.000000 +v 0.500000 0.500000 0.000000 +v -0.500000 0.500000 -0.000000 +v -0.250000 0.500000 -0.250000 +v -0.250000 0.500000 -0.750000 +v 0.250000 0.500000 -0.750000 +v 0.250000 0.500000 -0.250000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.2500 0.7500 +vt 0.7500 0.7500 +vt 0.7500 0.2500 +vt 1.0000 -0.0000 +vt -0.0000 0.0000 +vt 0.2500 0.2500 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 0.7500 0.2500 +vt 0.7500 0.7500 +vt 0.2500 0.7500 +vt 0.0000 1.0000 +vt 0.2500 0.2500 +vt -0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.5000 1.0000 +vt 0.5000 1.0000 +vt 0.0000 0.0000 +vt 1.2500 1.0000 +vt 0.7500 1.0000 +vt 0.2500 0.0000 +vt 0.7500 0.0000 +vt 0.5000 1.0000 +vt 1.5000 1.0000 +vt 1.0000 0.0000 +vt 0.7500 1.0000 +vt 1.2500 1.0000 +vt 0.7500 0.0000 +vt 0.2500 0.0000 +vt 1.0000 1.0000 +vt -0.0000 1.0000 +vt 0.7500 1.0000 +vt 0.2500 1.0000 +vt 0.2500 0.0000 +vt 0.0000 0.0000 +vt 0.2500 1.0000 +vt 0.7500 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 0.4472 0.8944 +vn 0.0000 -0.4472 -0.8944 +g tunnel_tube_slant_Cube.002_Top +usemtl Top +s off +f 9/1/1 10/2/1 14/3/1 15/4/1 +f 9/1/1 15/4/1 16/5/1 11/6/1 +f 14/3/1 10/2/1 12/7/1 13/8/1 +f 11/6/1 16/5/1 13/8/1 12/7/1 +g tunnel_tube_slant_Cube.002_Bottom +usemtl Bottom +f 1/9/2 2/10/2 5/11/2 6/12/2 +f 1/9/2 6/12/2 7/13/2 8/14/2 +f 8/14/2 7/13/2 4/15/2 3/16/2 +f 5/11/2 2/10/2 3/16/2 4/15/2 +g tunnel_tube_slant_Cube.002_Right +usemtl Right +f 1/17/3 9/18/3 11/19/3 2/20/3 +f 14/21/3 13/22/3 4/23/3 7/24/3 +g tunnel_tube_slant_Cube.002_Left +usemtl Left +f 3/16/4 12/25/4 10/26/4 8/27/4 +f 16/28/4 15/29/4 6/30/4 5/31/4 +g tunnel_tube_slant_Cube.002_Front +usemtl Front +f 2/10/5 11/32/5 12/33/5 3/16/5 +f 15/34/5 14/35/5 7/36/5 6/30/5 +g tunnel_tube_slant_Cube.002_Back +usemtl Back +f 9/1/6 1/17/6 8/37/6 10/2/6 +f 13/38/6 16/28/6 5/39/6 4/23/6 \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/models/tunnel_tube_slant_2.mtl b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_2.mtl new file mode 100644 index 0000000..b33fe71 --- /dev/null +++ b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_2.mtl @@ -0,0 +1,62 @@ +# Blender MTL File: 'tunnel tube base.blend' +# Material Count: 6 + +newmtl Back +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Bottom +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Front +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Left +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Right +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Top +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_trees/models/tunnel_tube_slant_2.obj b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_2.obj new file mode 100644 index 0000000..2b61938 --- /dev/null +++ b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_2.obj @@ -0,0 +1,94 @@ +# Blender v2.77 (sub 0) OBJ File: 'tunnel tube base.blend' +# www.blender.org +mtllib tunnel_tube_slant_2.mtl +o tunnel_tube_slant_Cube.002 +v 0.500000 -0.500000 0.000000 +v 0.500000 -0.500000 1.000000 +v -0.500000 -0.500000 1.000000 +v -0.250000 -0.500000 0.750000 +v 0.250000 -0.500000 0.750000 +v 0.250000 -0.500000 0.250000 +v -0.250000 -0.500000 0.250000 +v -0.500000 -0.500000 -0.000000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.250000 0.500000 0.250000 +v -0.250000 0.500000 -0.250000 +v 0.250000 0.500000 -0.250000 +v 0.250000 0.500000 0.250000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.2500 0.7500 +vt 0.7500 0.7500 +vt 0.7500 0.2500 +vt 1.0000 -0.0000 +vt -0.0000 0.0000 +vt 0.2500 0.2500 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 0.7500 0.2500 +vt 0.7500 0.7500 +vt 0.2500 0.7500 +vt 0.0000 1.0000 +vt 0.2500 0.2500 +vt -0.0000 0.0000 +vt 0.5000 0.0000 +vt -0.0000 1.0000 +vt -0.5000 0.0000 +vt 0.7500 1.0000 +vt 0.2500 1.0000 +vt -0.2500 0.0000 +vt 0.2500 0.0000 +vt -0.5000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 0.5000 0.0000 +vt 0.2500 1.0000 +vt 0.7500 1.0000 +vt 0.2500 0.0000 +vt -0.2500 0.0000 +vt 1.0000 1.0000 +vt 0.2500 1.0000 +vt 0.7500 0.0000 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 0.7500 1.0000 +vt 0.7500 0.0000 +vt 0.2500 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 0.4472 0.8944 +vn 0.0000 -0.4472 -0.8944 +g tunnel_tube_slant_Cube.002_Top +usemtl Top +s off +f 9/1/1 10/2/1 14/3/1 15/4/1 +f 9/1/1 15/4/1 16/5/1 11/6/1 +f 14/3/1 10/2/1 12/7/1 13/8/1 +f 11/6/1 16/5/1 13/8/1 12/7/1 +g tunnel_tube_slant_Cube.002_Bottom +usemtl Bottom +f 1/9/2 2/10/2 5/11/2 6/12/2 +f 1/9/2 6/12/2 7/13/2 8/14/2 +f 8/14/2 7/13/2 4/15/2 3/16/2 +f 5/11/2 2/10/2 3/16/2 4/15/2 +g tunnel_tube_slant_Cube.002_Right +usemtl Right +f 1/17/3 9/1/3 11/18/3 2/19/3 +f 14/20/3 13/21/3 4/22/3 7/23/3 +g tunnel_tube_slant_Cube.002_Left +usemtl Left +f 3/24/4 12/25/4 10/26/4 8/27/4 +f 16/28/4 15/29/4 6/30/4 5/31/4 +g tunnel_tube_slant_Cube.002_Front +usemtl Front +f 2/10/5 11/32/5 12/25/5 3/16/5 +f 15/29/5 14/33/5 7/23/5 6/34/5 +g tunnel_tube_slant_Cube.002_Back +usemtl Back +f 9/1/6 1/35/6 8/36/6 10/2/6 +f 13/21/6 16/37/6 5/38/6 4/39/6 diff --git a/mods/dfcaverns/df_trees/models/tunnel_tube_slant_full.mtl b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_full.mtl new file mode 100644 index 0000000..b33fe71 --- /dev/null +++ b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_full.mtl @@ -0,0 +1,62 @@ +# Blender MTL File: 'tunnel tube base.blend' +# Material Count: 6 + +newmtl Back +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Bottom +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Front +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Left +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Right +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Top +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/mods/dfcaverns/df_trees/models/tunnel_tube_slant_full.obj b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_full.obj new file mode 100644 index 0000000..070b1ef --- /dev/null +++ b/mods/dfcaverns/df_trees/models/tunnel_tube_slant_full.obj @@ -0,0 +1,94 @@ +# Blender v2.77 (sub 0) OBJ File: 'tunnel tube base.blend' +# www.blender.org +mtllib tunnel_tube_slant_full.mtl +o tunnel_tube_slant_Cube.002 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.250000 -0.500000 0.250000 +v 0.250000 -0.500000 0.250000 +v 0.250000 -0.500000 -0.250000 +v -0.250000 -0.500000 -0.250000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -1.500000 +v -0.500000 0.500000 -1.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v -0.250000 0.500000 -0.750000 +v -0.250000 0.500000 -1.250000 +v 0.250000 0.500000 -1.250000 +v 0.250000 0.500000 -0.750000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.2500 0.7500 +vt 0.7500 0.7500 +vt 0.7500 0.2500 +vt 1.0000 -0.0000 +vt -0.0000 0.0000 +vt 0.2500 0.2500 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 0.7500 0.2500 +vt 0.7500 0.7500 +vt 0.2500 0.7500 +vt 0.0000 1.0000 +vt 0.2500 0.2500 +vt -0.0000 0.0000 +vt 1.0000 0.0000 +vt 2.0000 1.0000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.7500 1.0000 +vt 1.2500 1.0000 +vt 0.2500 0.0000 +vt 0.7500 0.0000 +vt 1.0000 1.0000 +vt 2.0000 1.0000 +vt 1.0000 0.0000 +vt 1.2500 1.0000 +vt 1.7500 1.0000 +vt 0.7500 0.0000 +vt 0.2500 0.0000 +vt -0.0000 1.0000 +vt 0.7500 1.2500 +vt 0.2500 1.2500 +vt 0.2500 0.2500 +vt 0.7500 0.2500 +vt 0.0000 0.0000 +vt 0.2500 1.2500 +vt 0.7500 1.2500 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +g tunnel_tube_slant_Cube.002_Top +usemtl Top +s off +f 9/1/1 10/2/1 14/3/1 15/4/1 +f 9/1/1 15/4/1 16/5/1 11/6/1 +f 14/3/1 10/2/1 12/7/1 13/8/1 +f 11/6/1 16/5/1 13/8/1 12/7/1 +g tunnel_tube_slant_Cube.002_Bottom +usemtl Bottom +f 1/9/2 2/10/2 5/11/2 6/12/2 +f 1/9/2 6/12/2 7/13/2 8/14/2 +f 8/14/2 7/13/2 4/15/2 3/16/2 +f 5/11/2 2/10/2 3/16/2 4/15/2 +g tunnel_tube_slant_Cube.002_Right +usemtl Right +f 1/17/3 9/18/3 11/19/3 2/20/3 +f 14/21/3 13/22/3 4/23/3 7/24/3 +g tunnel_tube_slant_Cube.002_Left +usemtl Left +f 3/16/4 12/25/4 10/26/4 8/27/4 +f 16/28/4 15/29/4 6/30/4 5/31/4 +g tunnel_tube_slant_Cube.002_Front +usemtl Front +f 2/10/5 11/19/5 12/32/5 3/16/5 +f 15/33/5 14/34/5 7/35/5 6/36/5 +g tunnel_tube_slant_Cube.002_Back +usemtl Back +f 9/1/6 1/17/6 8/37/6 10/2/6 +f 13/38/6 16/39/6 5/11/6 4/15/6 diff --git a/mods/dfcaverns/df_trees/nether_cap.lua b/mods/dfcaverns/df_trees/nether_cap.lua new file mode 100644 index 0000000..0470225 --- /dev/null +++ b/mods/dfcaverns/df_trees/nether_cap.lua @@ -0,0 +1,204 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local nethercap_name = df_dependencies.nethercap_name + +--stem +minetest.register_node("df_trees:nether_cap_stem", { + description = S("@1 Stem", nethercap_name), + _doc_items_longdesc = df_trees.doc.nether_cap_desc, + _doc_items_usagehelp = df_trees.doc.nether_cap_usage, + tiles = {"dfcaverns_nether_cap_stem.png"}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1, handy=1,axey=1, building_block=1, material_wood=1}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 0.7, + _mcl_hardness = 0.7, +}) + +--cap +minetest.register_node("df_trees:nether_cap", { + description = nethercap_name, + _doc_items_longdesc = df_trees.doc.nether_cap_desc, + _doc_items_usagehelp = df_trees.doc.nether_cap_usage, + tiles = {"dfcaverns_nether_cap.png"}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1, handy=1,axey=1, building_block=1, material_wood=1}, + sounds = df_dependencies.sound_wood({footstep = {name = df_dependencies.soundfile_snow_footstep, gain = 0.2},}), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +--gills +minetest.register_node("df_trees:nether_cap_gills", { + description = S("@1 Gills", nethercap_name), + _doc_items_longdesc = df_trees.doc.nether_cap_desc, + _doc_items_usagehelp = df_trees.doc.nether_cap_usage, + tiles = {"dfcaverns_nether_cap_gills.png"}, + is_ground_content = false, + light_source = 6, + groups = {snappy = 3, leafdecay = 1, leaves = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), + drawtype = "plantlike", + paramtype = "light", + drop = { + max_items = 1, + items = { + { + items = {'df_trees:nether_cap_sapling'}, + rarity = 5, + }, + { + items = {'df_trees:nether_cap_gills'}, + } + } + }, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_trees:nether_cap"}, -- don't need stem nodes here + leaves = {"df_trees:nether_cap_gills"}, + radius = 1, +}) + +--Wood +minetest.register_craft({ + output = 'df_trees:nether_cap_wood 4', + recipe = { + {'df_trees:nether_cap'}, + } +}) + +minetest.register_craft({ + output = 'df_trees:nether_cap_wood 4', + recipe = { + {'df_trees:nether_cap_stem'}, + } +}) + +minetest.register_node("df_trees:nether_cap_wood", { + description = S("@1 Planks", nethercap_name), + _doc_items_longdesc = df_trees.doc.nether_cap_desc, + _doc_items_usagehelp = df_trees.doc.nether_cap_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_nether_cap_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, wood = 1, freezes_water = 1, handy=1,axey=1,building_block=1, material_wood=1}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +df_dependencies.register_all_stairs_and_fences("nether_cap_wood") + +-- sapling +minetest.register_node("df_trees:nether_cap_sapling", { + description = S("@1 Spawn", nethercap_name), + _doc_items_longdesc = df_trees.doc.nether_cap_desc, + _doc_items_usagehelp = df_trees.doc.nether_cap_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_nether_cap_sapling.png"}, + inventory_image = "dfcaverns_nether_cap_sapling.png", + wield_image = "dfcaverns_nether_cap_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + floodable = true, -- nether cap spawn aren't tough enough to freeze water yet + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + + on_construct = function(pos) + if df_trees.nether_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + + minetest.set_node(pos, {name="air"}) + df_trees.spawn_nether_cap(pos) + end, +}) + +local c_stem = minetest.get_content_id("df_trees:nether_cap_stem") +local c_cap = minetest.get_content_id("df_trees:nether_cap") +local c_gills = minetest.get_content_id("df_trees:nether_cap_gills") + +df_trees.spawn_nether_cap = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local stem_height = math.random(1,3) + local cap_radius = math.random(2,3) + local maxy = y + stem_height + 3 + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - cap_radius, y = y, z = z - cap_radius}, + {x = x + cap_radius, y = maxy + 3, z = z + cap_radius} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + subterrane.giant_mushroom(area:indexp(pos), area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_trees.spawn_nether_cap_vm = function(vi, area, data) + local stem_height = math.random(1,3) + local cap_radius = math.random(2,3) + subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) +end + +local water = df_dependencies.node_name_water_source +local river_water = df_dependencies.node_name_river_water_source +local ice = df_dependencies.node_name_ice +local water_flowing = df_dependencies.node_name_water_flowing +local river_water_flowing = df_dependencies.node_name_river_water_flowing +local snow = df_dependencies.node_name_snow + +minetest.register_abm{ + label = "water freezing", + nodenames = {water, river_water,}, + neighbors = {"group:freezes_water"}, + interval = 1, + chance = 5, + catch_up = true, + action = function(pos) + minetest.swap_node(pos, {name=ice}) + end, +} + +minetest.register_abm{ + label = "flowing water freezing", + nodenames = {water_flowing, river_water_flowing}, + neighbors = {"group:freezes_water"}, + interval = 1, + chance = 1, + catch_up = true, + action = function(pos) + minetest.swap_node(pos, {name=snow}) + end, +} \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/sapling_growth_conditions.lua b/mods/dfcaverns/df_trees/sapling_growth_conditions.lua new file mode 100644 index 0000000..846ea29 --- /dev/null +++ b/mods/dfcaverns/df_trees/sapling_growth_conditions.lua @@ -0,0 +1,52 @@ +-- these methods should indicate whether a sapling placed at pos should bother attempting to grow. +-- check soil conditions and biome here, for example. + +local stone_with_coal = df_dependencies.node_name_stone_with_coal +local coalblock = df_dependencies.node_name_coalblock +local is_coal = function(name) + return name == stone_with_coal or name == coalblock +end + +df_trees.black_cap_growth_permitted = function(pos) + local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + return minetest.get_item_group(below_name, "soil") > 0 or is_coal(below_name) +end + +df_trees.blood_thorn_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "sand") > 0 +end + +df_trees.fungiwood_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.goblin_cap_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.nether_cap_growth_permitted = function(pos) + local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + return (minetest.get_item_group(below_name, "cools_lava") > 0 or minetest.get_item_group(below_name, "ice") > 0) + and minetest.get_item_group(below_name, "nether_cap") == 0 +end + +df_trees.spindlestem_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.spore_tree_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.torchspine_growth_permitted = function(pos) + local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + return minetest.get_item_group(below_name, "flammable") > 0 or is_coal(below_name) +end + +df_trees.tower_cap_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.tunnel_tube_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/schematics/goblin_cap_big.lua b/mods/dfcaverns/df_trees/schematics/goblin_cap_big.lua new file mode 100644 index 0000000..181b979 --- /dev/null +++ b/mods/dfcaverns/df_trees/schematics/goblin_cap_big.lua @@ -0,0 +1,220 @@ +local n1 = { name = "air", prob = 0 } -- external air +local n2 = { name = "df_trees:goblin_cap" } +local n4 = { name = "df_trees:goblin_cap_gills" } +local n6 = { name = "df_trees:goblin_cap_stem" } + +return { + yslice_prob = {}, + size = {y = 9, x = 11, z = 11}, + center_pos = {x=5, y=2, z=5}, + data = { + -- z=0, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=5 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=0, y=6 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=1, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=5 + n1, n1, n2, n2, n2, n4, n2, n2, n2, n1, n1, + -- z=1, y=6 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=1, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=2, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=5 + n1, n2, n2, n4, n4, n4, n4, n4, n2, n2, n1, + -- z=2, y=6 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=2, y=7 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=2, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=3, y=0 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=3, y=1 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=3, y=2 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=3, y=3 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=3, y=4 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=3, y=5 + n1, n2, n4, n4, n6, n6, n6, n4, n4, n2, n1, + -- z=3, y=6 + n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, + -- z=3, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=3, y=8 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + + -- z=4, y=0 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=4, y=1 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=4, y=2 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=4, y=3 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=4, y=4 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=4, y=5 + n1, n2, n4, n6, n6, n6, n6, n6, n4, n2, n1, + -- z=4, y=6 + n1, n1, n2, n2, n6, n6, n6, n2, n2, n1, n1, + -- z=4, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=4, y=8 + n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, + + -- z=5, y=0 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=5, y=1 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=5, y=2 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=5, y=3 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=5, y=4 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=5, y=5 + n2, n4, n4, n6, n6, n6, n6, n6, n4, n4, n2, + -- z=5, y=6 + n1, n2, n2, n2, n6, n6, n6, n2, n2, n2, n1, + -- z=5, y=7 + n1, n1, n2, n2, n2, n6, n2, n2, n2, n1, n1, + -- z=5, y=8 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + + -- z=6, y=0 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=6, y=1 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=6, y=2 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=6, y=3 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=6, y=4 + n1, n1, n1, n6, n6, n6, n6, n6, n1, n1, n1, + -- z=6, y=5 + n1, n2, n4, n6, n6, n6, n6, n6, n4, n2, n1, + -- z=6, y=6 + n1, n1, n2, n2, n6, n6, n6, n2, n2, n1, n1, + -- z=6, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=6, y=8 + n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, + + -- z=7, y=0 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=1 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=2 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=3 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=4 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=5 + n1, n2, n4, n4, n6, n6, n6, n4, n4, n2, n1, + -- z=7, y=6 + n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, + -- z=7, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=7, y=8 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + + -- z=8, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=5 + n1, n2, n2, n4, n4, n4, n4, n4, n2, n2, n1, + -- z=8, y=6 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=8, y=7 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=8, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=9, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=5 + n1, n1, n2, n2, n2, n4, n2, n2, n2, n1, n1, + -- z=9, y=6 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=9, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=10, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=5 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=10, y=6 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, +} +} diff --git a/mods/dfcaverns/df_trees/schematics/goblin_cap_big_hut.lua b/mods/dfcaverns/df_trees/schematics/goblin_cap_big_hut.lua new file mode 100644 index 0000000..a63c2bf --- /dev/null +++ b/mods/dfcaverns/df_trees/schematics/goblin_cap_big_hut.lua @@ -0,0 +1,254 @@ +local n1 = { name = "air", prob = 0 } -- external air +local n2 = { name = "df_trees:goblin_cap" } +local n3 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 2} -- porch top +local n4 = { name = "df_trees:goblin_cap_gills" } +local n6 = { name = "df_trees:goblin_cap_stem", force_place=true } -- walls +local n7 = { name = "df_trees:goblin_cap_stem_wood", force_place=true } -- internal floor +local n8 = { name = df_dependencies.node_name_door_wood_a or "air", force_place=true } +local n9 = { name = df_dependencies.node_name_door_hidden or "air", force_place=true } +local n10 = { name = df_dependencies.node_name_furnace, param2 = 3, force_place=true } +local n11 = { name = "air", force_place=true } -- internal air +local n12 = { name = df_dependencies.node_name_bed_bottom or "air", force_place=true } +local n13 = { name = "df_trees:goblin_cap_stem", prob = 198, force_place=true } -- possible window holes +local n16 = { name = df_dependencies.node_name_chest, param2 = 3, force_place=true } +local n17 = { name = df_dependencies.node_name_bed_top or "air", force_place=true } +local n18 = { name = df_dependencies.node_name_torch_wall, param2 = 4, force_place=true } +local n19 = { name = "df_trees:goblin_cap_stem" } -- base + +local n20 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood, param2 = 1 } +local n21 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood, param2 = 3 } +local n22 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 22} + +if minetest.get_modpath("vessels") then + n18 = { name = "df_trees:glowing_bottle_red", force_place=true} +end + +if not df_dependencies.node_name_stair_goblin_cap_stem_wood then + -- replace stairs with air + n3 = n1 + n20 = n1 + n21 = n1 + n22 = n1 +end + +local schematic = { + yslice_prob = {}, + size = {y = 9, x = 11, z = 11}, + center_pos = {x=5, y=2, z=5}, + data = { + -- z=0, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=5 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=0, y=6 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=1, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=3 + n1, n1, n1, n1, n1, n11, n1, n1, n1, n1, n1, + -- z=1, y=4 + n1, n1, n1, n1, n1, n11, n1, n1, n1, n1, n1, + -- z=1, y=5 + n1, n1, n2, n2, n2, n4, n2, n2, n2, n1, n1, + -- z=1, y=6 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=1, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=2, y=0 + n1, n1, n1, n22, n1, n1, n1, n22, n1, n1, n1, + -- z=2, y=1 + n1, n1, n1, n1, n20, n1, n21, n1, n1, n1, n1, + -- z=2, y=2 + n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, + -- z=2, y=3 + n1, n1, n1, n1, n1, n11, n1, n1, n1, n1, n1, + -- z=2, y=4 + n1, n1, n1, n1, n1, n11, n1, n1, n1, n1, n1, + -- z=2, y=5 + n1, n2, n2, n4, n4, n4, n4, n4, n2, n2, n1, + -- z=2, y=6 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=2, y=7 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=2, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=3, y=0 + n1, n1, n1, n3, n19, n19, n19, n3, n1, n1, n1, + -- z=3, y=1 + n1, n1, n1, n1, n19, n19, n19, n1, n1, n1, n1, + -- z=3, y=2 + n1, n1, n1, n1, n6, n7, n6, n1, n1, n1, n1, + -- z=3, y=3 + n1, n1, n1, n1, n6, n8, n6, n1, n1, n1, n1, + -- z=3, y=4 + n1, n1, n1, n1, n6, n9, n6, n1, n1, n1, n1, + -- z=3, y=5 + n1, n2, n4, n4, n6, n6, n6, n4, n4, n2, n1, + -- z=3, y=6 + n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, + -- z=3, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=3, y=8 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + + -- z=4, y=0 + n1, n1, n1, n19, n19, n19, n19, n19, n1, n1, n1, + -- z=4, y=1 + n1, n1, n1, n19, n19, n19, n19, n19, n1, n1, n1, + -- z=4, y=2 + n1, n1, n1, n6, n7, n7, n7, n6, n1, n1, n1, + -- z=4, y=3 + n1, n1, n1, n6, n10, n11, n11, n6, n1, n1, n1, + -- z=4, y=4 + n1, n1, n1, n6, n11, n11, n11, n6, n1, n1, n1, + -- z=4, y=5 + n1, n2, n4, n6, n11, n11, n11, n6, n4, n2, n1, + -- z=4, y=6 + n1, n1, n2, n2, n6, n6, n6, n2, n2, n1, n1, + -- z=4, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=4, y=8 + n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, + + -- z=5, y=0 + n1, n1, n1, n19, n19, n19, n19, n19, n1, n1, n1, + -- z=5, y=1 + n1, n1, n1, n19, n19, n19, n19, n19, n1, n1, n1, + -- z=5, y=2 + n1, n1, n1, n6, n7, n7, n7, n6, n1, n1, n1, + -- z=5, y=3 + n1, n1, n1, n6, n11, n11, n12, n6, n1, n1, n1, + -- z=5, y=4 + n1, n1, n1, n13, n11, n11, n11, n13, n1, n1, n1, + -- z=5, y=5 + n2, n4, n4, n6, n11, n11, n11, n6, n4, n4, n2, + -- z=5, y=6 + n1, n2, n2, n2, n6, n11, n6, n2, n2, n2, n1, + -- z=5, y=7 + n1, n1, n2, n2, n2, n6, n2, n2, n2, n1, n1, + -- z=5, y=8 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + + -- z=6, y=0 + n1, n1, n1, n19, n19, n19, n19, n19, n1, n1, n1, + -- z=6, y=1 + n1, n1, n1, n19, n19, n19, n19, n19, n1, n1, n1, + -- z=6, y=2 + n1, n1, n1, n6, n7, n7, n7, n6, n1, n1, n1, + -- z=6, y=3 + n1, n1, n1, n6, n16, n11, n17, n6, n1, n1, n1, + -- z=6, y=4 + n1, n1, n1, n6, n18, n11, n11, n6, n1, n1, n1, + -- z=6, y=5 + n1, n2, n4, n6, n11, n11, n11, n6, n4, n2, n1, + -- z=6, y=6 + n1, n1, n2, n2, n6, n6, n6, n2, n2, n1, n1, + -- z=6, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=6, y=8 + n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, + + -- z=7, y=0 + n1, n1, n1, n1, n19, n19, n19, n1, n1, n1, n1, + -- z=7, y=1 + n1, n1, n1, n1, n19, n19, n19, n1, n1, n1, n1, + -- z=7, y=2 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=3 + n1, n1, n1, n1, n6, n6, n6, n1, n1, n1, n1, + -- z=7, y=4 + n1, n1, n1, n1, n6, n13, n6, n1, n1, n1, n1, + -- z=7, y=5 + n1, n2, n4, n4, n6, n6, n6, n4, n4, n2, n1, + -- z=7, y=6 + n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, + -- z=7, y=7 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=7, y=8 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + + -- z=8, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=8, y=5 + n1, n2, n2, n4, n4, n4, n4, n4, n2, n2, n1, + -- z=8, y=6 + n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=8, y=7 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=8, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=9, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=5 + n1, n1, n2, n2, n2, n4, n2, n2, n2, n1, n1, + -- z=9, y=6 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=9, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=9, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=10, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=5 + n1, n1, n1, n1, n1, n2, n1, n1, n1, n1, n1, + -- z=10, y=6 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, +} +} + +for index, node in ipairs(schematic.data) do + assert(node.name ~= nil, "undefined node name for index " .. tostring(index) .. " in goblin_cap_big_hut schematic data") +end + +return schematic \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/schematics/goblin_cap_bigger.lua b/mods/dfcaverns/df_trees/schematics/goblin_cap_bigger.lua new file mode 100644 index 0000000..70b7cb0 --- /dev/null +++ b/mods/dfcaverns/df_trees/schematics/goblin_cap_bigger.lua @@ -0,0 +1,284 @@ +local n1 = { name = "air", prob=0 } +local n3 = { name = "df_trees:goblin_cap" } +local n4 = { name = "df_trees:goblin_cap_gills" } +local n5 = { name = "df_trees:goblin_cap_stem" } + +return { + yslice_prob = {}, + size = {y = 10, x = 13, z = 13}, + center_pos = {x=6, y=2, z=6}, + data = { + -- z=0, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=6 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=0, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=1, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=6 + n1, n1, n1, n3, n3, n3, n4, n3, n3, n3, n1, n1, n1, + -- z=1, y=7 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=1, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=2, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=6 + n1, n1, n3, n4, n4, n4, n4, n4, n4, n4, n3, n1, n1, + -- z=2, y=7 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=2, y=8 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=2, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=3, y=0 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=1 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=2 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=3 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=4 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=5 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=6 + n1, n3, n4, n4, n4, n4, n5, n4, n4, n4, n4, n3, n1, + -- z=3, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=3, y=8 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + -- z=3, y=9 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + + -- z=4, y=0 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=4, y=1 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=4, y=2 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=4, y=3 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=4, y=4 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=4, y=5 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=4, y=6 + n1, n3, n4, n4, n4, n5, n5, n5, n4, n4, n4, n3, n1, + -- z=4, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=4, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=4, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=5, y=0 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=5, y=1 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=5, y=2 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=5, y=3 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=5, y=4 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=5, y=5 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=5, y=6 + n1, n3, n4, n4, n5, n5, n5, n5, n5, n4, n4, n3, n1, + -- z=5, y=7 + n1, n1, n3, n3, n3, n5, n5, n5, n3, n3, n3, n1, n1, + -- z=5, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=5, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=6, y=0 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=6, y=1 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=6, y=2 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=6, y=3 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=6, y=4 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=6, y=5 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=6, y=6 + n3, n4, n4, n5, n5, n5, n5, n5, n5, n5, n4, n4, n3, + -- z=6, y=7 + n1, n3, n3, n3, n3, n5, n5, n5, n3, n3, n3, n3, n1, + -- z=6, y=8 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=6, y=9 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + + -- z=7, y=0 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=7, y=1 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=7, y=2 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=7, y=3 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=7, y=4 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=7, y=5 + n1, n1, n1, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, + -- z=7, y=6 + n1, n3, n4, n4, n5, n5, n5, n5, n5, n4, n4, n3, n1, + -- z=7, y=7 + n1, n1, n3, n3, n3, n5, n5, n5, n3, n3, n3, n1, n1, + -- z=7, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=7, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=8, y=0 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=8, y=1 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=8, y=2 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=8, y=3 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=8, y=4 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=8, y=5 + n1, n1, n1, n1, n5, n5, n5, n5, n5, n1, n1, n1, n1, + -- z=8, y=6 + n1, n3, n4, n4, n4, n5, n5, n5, n4, n4, n4, n3, n1, + -- z=8, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=8, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=8, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=9, y=0 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=1 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=2 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=3 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=4 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=5 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=6 + n1, n3, n4, n4, n4, n4, n5, n4, n4, n4, n4, n3, n1, + -- z=9, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=9, y=8 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + -- z=9, y=9 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + + -- z=10, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=6 + n1, n1, n3, n4, n4, n4, n4, n4, n4, n3, n3, n1, n1, + -- z=10, y=7 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=10, y=8 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=10, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=11, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=6 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=11, y=7 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=11, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=12, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=6 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=12, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, +} +} diff --git a/mods/dfcaverns/df_trees/schematics/goblin_cap_bigger_hut.lua b/mods/dfcaverns/df_trees/schematics/goblin_cap_bigger_hut.lua new file mode 100644 index 0000000..43bfe8b --- /dev/null +++ b/mods/dfcaverns/df_trees/schematics/goblin_cap_bigger_hut.lua @@ -0,0 +1,314 @@ +local n1 = { name = "air" } -- external air +local n2 = { name = "df_trees:goblin_cap_stem"} -- below ground, don't force place these +local n3 = { name = "df_trees:goblin_cap" } +local n4 = { name = "df_trees:goblin_cap_gills" } +local n5 = { name = "df_trees:goblin_cap_stem", force_place = true } -- walls, force place these +local n6 = { name = "df_trees:goblin_cap_stem", prob = 198, force_place=true } -- possible window holes +local n7 = { name = "df_trees:goblin_cap_stem_wood", force_place=true } -- internal floor +local n8 = { name = df_dependencies.node_name_furnace, param2 = 2, force_place=true } +local n9 = { name = "air", force_place=true } -- internal air +local n10 = { name = df_dependencies.node_name_torch_wall, param2 = 3, force_place = true } +local n12 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 2} -- porch top +local n13 = { name = df_dependencies.node_name_door_wood_a or "air", param2 = 3, force_place = true } +local n14 = { name = df_dependencies.node_name_door_hidden or "air", param2 = 3, force_place = true } +local n15 = n9 -- internal air, but could be a vessel shelf +local n16 = { name = df_dependencies.node_name_bed_top or "air", param2 = 3, force_place = true } +local n17 = { name = df_dependencies.node_name_bed_bottom or "air", param2 = 3, force_place = true } +local n18 = { name = df_dependencies.node_name_chest, force_place = true } +local n19 = { name = df_dependencies.node_name_torch_wall, param2 = 2, force_place = true } +local n20 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood } +local n21 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood, param2 = 2 } +local n22 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 22} + +if df_dependencies.node_name_shelf then + -- replace torches with glowing bottles, add vessel shelf + n10 = { name = "df_trees:glowing_bottle_red", force_place=true} + n19 = n10 + n15 = { name = df_dependencies.node_name_shelf, param2 = 3, force_place = true } +end + +local schematic = { + yslice_prob = {}, + size = {y = 10, x = 13, z = 13}, + center_pos = {x=6, y=2, z=6}, + data = { + -- z=0, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=6 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=0, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=0, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=1, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=6 + n1, n1, n1, n3, n3, n3, n4, n3, n3, n3, n1, n1, n1, + -- z=1, y=7 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=1, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=1, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=2, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=2, y=6 + n1, n1, n3, n4, n4, n4, n4, n4, n4, n4, n3, n1, n1, + -- z=2, y=7 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=2, y=8 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=2, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=3, y=0 + n1, n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, n1, + -- z=3, y=1 + n1, n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, n1, + -- z=3, y=2 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=3 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=4 + n1, n1, n1, n1, n1, n5, n6, n5, n1, n1, n1, n1, n1, + -- z=3, y=5 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=3, y=6 + n1, n3, n4, n4, n4, n4, n5, n4, n4, n4, n4, n3, n1, + -- z=3, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=3, y=8 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + -- z=3, y=9 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + + -- z=4, y=0 + n1, n1, n1, n1, n2, n2, n2, n2, n2, n12, n22, n1, n1, + -- z=4, y=1 + n1, n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, n1, + -- z=4, y=2 + n1, n1, n1, n1, n5, n7, n7, n7, n5, n1, n1, n1, n1, + -- z=4, y=3 + n1, n1, n1, n1, n5, n8, n9, n9, n5, n1, n1, n1, n1, + -- z=4, y=4 + n1, n1, n1, n1, n5, n10, n9, n9, n5, n1, n1, n1, n1, + -- z=4, y=5 + n1, n1, n1, n1, n5, n5, n9, n5, n5, n1, n1, n1, n1, + -- z=4, y=6 + n1, n3, n4, n4, n4, n5, n5, n5, n4, n4, n4, n3, n1, + -- z=4, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=4, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=4, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=5, y=0 + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=5, y=1 + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n20, n1, n1, + -- z=5, y=2 + n1, n1, n1, n5, n7, n7, n7, n7, n7, n5, n1, n1, n1, + -- z=5, y=3 + n1, n1, n1, n5, n9, n9, n9, n9, n9, n5, n1, n1, n1, + -- z=5, y=4 + n1, n1, n1, n5, n9, n9, n9, n9, n9, n5, n1, n1, n1, + -- z=5, y=5 + n1, n1, n1, n5, n5, n9, n9, n9, n5, n5, n1, n1, n1, + -- z=5, y=6 + n1, n3, n4, n4, n5, n9, n9, n9, n5, n4, n4, n3, n1, + -- z=5, y=7 + n1, n1, n3, n3, n3, n5, n5, n5, n3, n3, n3, n1, n1, + -- z=5, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=5, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=6, y=0 + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=6, y=1 + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=6, y=2 + n1, n1, n1, n5, n7, n7, n7, n7, n7, n7, n12, n1, n1, + -- z=6, y=3 + n1, n1, n1, n5, n9, n9, n9, n9, n9, n13, n9, n9, n1, + -- z=6, y=4 + n1, n1, n1, n6, n9, n9, n9, n9, n9, n14, n9, n9, n1, + -- z=6, y=5 + n1, n1, n1, n5, n9, n9, n9, n9, n9, n5, n1, n1, n1, + -- z=6, y=6 + n3, n4, n4, n5, n5, n9, n9, n9, n5, n5, n4, n4, n3, + -- z=6, y=7 + n1, n3, n3, n3, n3, n5, n5, n5, n3, n3, n3, n3, n1, + -- z=6, y=8 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=6, y=9 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + + -- z=7, y=0 + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, + -- z=7, y=1 + n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n21, n1, n1, + -- z=7, y=2 + n1, n1, n1, n5, n7, n7, n7, n7, n7, n5, n1, n1, n1, + -- z=7, y=3 + n1, n1, n1, n5, n15, n9, n9, n9, n9, n5, n1, n1, n1, + -- z=7, y=4 + n1, n1, n1, n5, n9, n9, n9, n9, n9, n5, n1, n1, n1, + -- z=7, y=5 + n1, n1, n1, n5, n5, n9, n9, n9, n5, n5, n1, n1, n1, + -- z=7, y=6 + n1, n3, n4, n4, n5, n9, n9, n9, n5, n4, n4, n3, n1, + -- z=7, y=7 + n1, n1, n3, n3, n3, n5, n5, n5, n3, n3, n3, n1, n1, + -- z=7, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=7, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=8, y=0 + n1, n1, n1, n1, n2, n2, n2, n2, n2, n12, n22, n1, n1, + -- z=8, y=1 + n1, n1, n1, n1, n2, n2, n2, n2, n2, n1, n1, n1, n1, + -- z=8, y=2 + n1, n1, n1, n1, n5, n7, n7, n7, n5, n1, n1, n1, n1, + -- z=8, y=3 + n1, n1, n1, n1, n5, n16, n17, n18, n5, n1, n1, n1, n1, + -- z=8, y=4 + n1, n1, n1, n1, n5, n9, n9, n19, n5, n1, n1, n1, n1, + -- z=8, y=5 + n1, n1, n1, n1, n5, n5, n9, n5, n5, n1, n1, n1, n1, + -- z=8, y=6 + n1, n3, n4, n4, n4, n5, n5, n5, n4, n4, n4, n3, n1, + -- z=8, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=8, y=8 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=8, y=9 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + + -- z=9, y=0 + n1, n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, n1, + -- z=9, y=1 + n1, n1, n1, n1, n1, n2, n2, n2, n1, n1, n1, n1, n1, + -- z=9, y=2 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=3 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=4 + n1, n1, n1, n1, n1, n5, n6, n5, n1, n1, n1, n1, n1, + -- z=9, y=5 + n1, n1, n1, n1, n1, n5, n5, n5, n1, n1, n1, n1, n1, + -- z=9, y=6 + n1, n3, n4, n4, n4, n4, n5, n4, n4, n4, n4, n3, n1, + -- z=9, y=7 + n1, n1, n3, n3, n3, n3, n3, n3, n3, n3, n3, n1, n1, + -- z=9, y=8 + n1, n1, n1, n1, n3, n3, n3, n3, n3, n1, n1, n1, n1, + -- z=9, y=9 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + + -- z=10, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=10, y=6 + n1, n1, n3, n4, n4, n4, n4, n4, n4, n3, n3, n1, n1, + -- z=10, y=7 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=10, y=8 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=10, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=11, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=6 + n1, n1, n1, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, + -- z=11, y=7 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=11, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=11, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + + -- z=12, y=0 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=1 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=2 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=3 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=4 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=5 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=6 + n1, n1, n1, n1, n1, n1, n3, n1, n1, n1, n1, n1, n1, + -- z=12, y=7 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=8 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + -- z=12, y=9 + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, +} +} + +for index, node in ipairs(schematic.data) do + assert(node.name ~= nil, "undefined node name for index " .. tostring(index) .. " in goblin_cap_bigger_hut schematic data") +end + +return schematic \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/settingtypes.txt b/mods/dfcaverns/df_trees/settingtypes.txt new file mode 100644 index 0000000..d760af9 --- /dev/null +++ b/mods/dfcaverns/df_trees/settingtypes.txt @@ -0,0 +1,10 @@ +dfcaverns_tree_min_growth_delay (Minimum sapling growth delay) int 2400 +dfcaverns_tree_max_growth_delay (Maximum sapling growth delay) int 4800 +dfcaverns_fungiwood_delay_multiplier (fungiwood growth delay multiplier) float 1 +dfcaverns_tunnel_tube_delay_multiplier (tunnel_tube growth delay multiplier) float 1 +dfcaverns_spore_tree_delay_multiplier (spore_tree growth delay multiplier) float 1 +dfcaverns_black_cap_delay_multiplier (black_cap growth delay multiplier) float 1 +dfcaverns_nether_cap_delay_multiplier (nether_cap growth delay multiplier) float 1 +dfcaverns_goblin_cap_delay_multiplier (goblin_cap growth delay multiplier) float 1 +dfcaverns_tower_cap_delay_multiplier (tower_cap growth delay multiplier) float 1 +dfcaverns_blood_thorn_delay_multiplier (blood_thorn growth delay multiplier) float 1 \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.1.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.1.ogg new file mode 100644 index 0000000..3aec502 Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.1.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.2.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.2.ogg new file mode 100644 index 0000000..97aaa8a Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.2.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.3.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.3.ogg new file mode 100644 index 0000000..2a931c0 Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.3.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.4.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.4.ogg new file mode 100644 index 0000000..ebeee6c Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_fungus_footstep.4.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.1.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.1.ogg new file mode 100644 index 0000000..6487d03 Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.1.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.2.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.2.ogg new file mode 100644 index 0000000..5b0d682 Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.2.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.3.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.3.ogg new file mode 100644 index 0000000..8bdc900 Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.3.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.4.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.4.ogg new file mode 100644 index 0000000..5574495 Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_spore_tree_pitter_patter.4.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_torchspine_ignite.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_torchspine_ignite.ogg new file mode 100644 index 0000000..3935bff Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_torchspine_ignite.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/dfcaverns_torchspine_loop.ogg b/mods/dfcaverns/df_trees/sounds/dfcaverns_torchspine_loop.ogg new file mode 100644 index 0000000..8c7e81b Binary files /dev/null and b/mods/dfcaverns/df_trees/sounds/dfcaverns_torchspine_loop.ogg differ diff --git a/mods/dfcaverns/df_trees/sounds/license.txt b/mods/dfcaverns/df_trees/sounds/license.txt new file mode 100644 index 0000000..99381db --- /dev/null +++ b/mods/dfcaverns/df_trees/sounds/license.txt @@ -0,0 +1,5 @@ +dfcaverns_fungus_footstep are from https://freesound.org/people/jakeh111/sounds/60853/ under CC-BY-SA 3.0 in 2008 by jakeh111 +dfcaverns_spore_tree_pitter_patter are from https://freesound.org/people/martinimeniscus/sounds/199332/ by martinimeniscus under the CC0 public domain license + +dfcaverns_torchspine_loop is from https://freesound.org/people/PegasusCZ/sounds/569332/ by PegasusCZ under the CC0 public domain license +dfcaverns_torchspine_ignite is from https://freesound.org/people/deleted_user_4772965/sounds/256510/ by Patrick Hunt5 under the CC0 public domain license \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/spindlestem.lua b/mods/dfcaverns/df_trees/spindlestem.lua new file mode 100644 index 0000000..a37b52e --- /dev/null +++ b/mods/dfcaverns/df_trees/spindlestem.lua @@ -0,0 +1,415 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local glass_bottle = df_dependencies.node_name_glass_bottle + +-- pre-declare +local get_spindlestem_cap_type + +-- Copied from subterrane's features.lua +-- Figured that was nicer than adding a dependency for just this little bit + +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + +local stem_on_place = function(itemstack, placer, pointed_thing) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + if minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.record_protection_violation(pt.above, placer:get_player_name()) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] or not minetest.registered_nodes[above.name] then + return itemstack + end + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + local new_param2 + -- check if pointing at an existing spindlestem + if minetest.get_item_group(under.name, "spindlestem") > 0 then + new_param2 = under.param2 + else + new_param2 = math.random(0,3) + end + + -- add the node and remove 1 item from the itemstack + local newnode= {name = itemstack:get_name(), param2 = new_param2, param1=0} + local oldnode= minetest.get_node(pt.above) + minetest.add_node(pt.above, newnode) + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) and take_item then + itemstack:take_item() + end + return itemstack +end + +local growth_delay = function() + return math.random( + df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_max_growth_delay) +end + +local disp = 0.0625 -- adjusting position a bit + +minetest.register_node("df_trees:spindlestem_stem", { + description = S("Spindlestem"), + _doc_items_longdesc = df_trees.doc.spindlestem_desc, + _doc_items_usagehelp = df_trees.doc.spindlestem_usage, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, spindlestem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + tiles = { + "dfcaverns_tower_cap.png", + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.0625+disp, -0.5, -0.125+disp, 0.1875+disp, 0.5, 0.25+disp}, + {-0.125+disp, -0.5, -0.0625+disp, 0.25+disp, 0.5, 0.1875+disp}, + } + }, + on_place = stem_on_place, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spindlestem_stem", + burntime = 5, +}) + +local register_spindlestem_type = function(item_suffix, colour_name, colour_code, light_level, extract_color_group) + local cap_item = "df_trees:spindlestem_cap_"..item_suffix + local cap_item_harvested = "df_trees:spindlestem_cap_harvested_"..item_suffix + + local cap_def = { + description = S("@1 Spindlestem Cap", colour_name), + is_ground_content = false, + _doc_items_longdesc = df_trees.doc["spindlestem_cap_"..item_suffix.."_desc"], + _doc_items_usagehelp = df_trees.doc["spindlestem_cap_"..item_suffix.."_usage"], + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, spindlestem = 1, not_in_creative_inventory = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + tiles = { + "dfcaverns_tower_cap.png^[multiply:#"..colour_code, + "dfcaverns_spindlestem_cap.png^[multiply:#"..colour_code, + "dfcaverns_tower_cap.png^[multiply:#"..colour_code, + "dfcaverns_tower_cap.png^[multiply:#"..colour_code, + "dfcaverns_tower_cap.png^[multiply:#"..colour_code, + "dfcaverns_tower_cap.png^[multiply:#"..colour_code, + }, + light_source = light_level, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.1875+disp, -0.5, -0.3125+disp, 0.3125+disp, -0.3125, 0.4375+disp}, + {-0.3125+disp, -0.5, -0.1875+disp, 0.4375+disp, -0.3125, 0.3125+disp}, + {-0.0625+disp, -0.1875, -0.0625+disp, 0.1875+disp, -0.125, 0.1875+disp}, + {-0.1875+disp, -0.3125, -0.1875+disp, 0.3125+disp, -0.1875, 0.3125+disp}, + } + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + + drop = { + -- Maximum number of items to drop + max_items = 1, + -- Choose max_items randomly from this list + items = { + { + items = {cap_item_harvested, "df_trees:spindlestem_seedling"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + { + items = {cap_item_harvested, "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + { + items = {cap_item_harvested, "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + { + items = {cap_item_harvested}, -- Items to drop + rarity = 1, -- Probability of dropping is 1 / rarity + }, + }, + }, + + on_place = stem_on_place, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local height = meta:get_int("spindlestem_to_grow") + local delay = meta:get_int("spindlestem_delay") + if delay == 0 then + delay = growth_delay() -- compatibility code to ensure no crash for previous version + end + local node = minetest.get_node(pos) + + while height > 0 and elapsed >= delay do + elapsed = elapsed - delay + local this_pos = pos + pos = vector.add(this_pos, {x=0,y=1,z=0}) + local node_above = minetest.get_node(pos) + local above_def = minetest.registered_nodes[node_above.name] + if not above_def or not above_def.buildable_to then + -- can't grow any more, exit + return + end + minetest.set_node(this_pos, {name="df_trees:spindlestem_stem", param2 = node.param2}) + minetest.set_node(pos, {name=cap_item, param2 = node.param2}) + height = height - 1 + end + + if height > 0 then + meta = minetest.get_meta(pos) + meta:set_int("spindlestem_to_grow", height) + meta:set_int("spindlestem_delay", delay) + minetest.get_node_timer(pos):start(delay-elapsed) + end + end, + } + + local cap_def_harvested = {} + for key, val in pairs(cap_def) do + cap_def_harvested[key] = val + end + cap_def_harvested.groups = {} + for key, val in pairs(cap_def.groups) do + cap_def_harvested.groups[key] = val + end + cap_def_harvested.drop = nil -- harvested caps shouldn't drop spawn + cap_def_harvested.on_timer = nil -- harvested caps shouldn't grow, just in case a timer and node metadata are set up where it's placed + cap_def_harvested.groups.not_in_creative_inventory = nil + + minetest.register_node(cap_item, cap_def) + minetest.register_node(cap_item_harvested, cap_def_harvested) + + minetest.register_craft({ + type = "fuel", + recipe = cap_item_harvested, + burntime = 10, + }) + + if glass_bottle and light_level > 0 then + local tex = "dfcaverns_vessels_glowing_liquid.png^[multiply:#"..colour_code.."^"..df_dependencies.texture_glass_bottle + local new_light = light_level + math.floor((minetest.LIGHT_MAX-light_level)/2) + + local groups = {vessel = 1, dig_immediate = 3, attached_node = 1, material_glass = 1, destroy_by_lava_flow=1} + if extract_color_group then + groups[extract_color_group] = 1 + end + + minetest.register_node("df_trees:glowing_bottle_"..item_suffix, { + description = S("@1 Spindlestem Extract", colour_name), + drawtype = "plantlike", + _doc_items_longdesc = df_trees.doc["spindlestem_extract_"..item_suffix.."_desc"], + _doc_items_usagehelp = df_trees.doc["spindlestem_extract_"..item_suffix.."_usage"], + tiles = {tex}, + inventory_image = tex, + wield_image = tex, + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = groups, + sounds = df_dependencies.sound_glass(), + light_source = new_light, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + }) + + minetest.register_craft( { + output = "df_trees:glowing_bottle_"..item_suffix.." 3", + type = "shapeless", + recipe = { + glass_bottle, + glass_bottle, + glass_bottle, + cap_item_harvested, + } + }) + + minetest.register_craft( { + output = glass_bottle, + type = "shapeless", + recipe = { + "df_trees:glowing_bottle_"..item_suffix, + } + }) + end +end + +minetest.register_node("df_trees:spindlestem_seedling", { + description = S("Spindlestem Spawn"), + _doc_items_longdesc = df_trees.doc.spindlestem_desc, + _doc_items_usagehelp = df_trees.doc.spindlestem_usage, + tiles = { + "dfcaverns_tower_cap.png", + }, + groups = {snappy = 3, flammable = 2, plant = 1, attached_node = 1, light_sensitive_fungus = 11, digtron_on_place=1, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + walkable = false, + floodable = true, + node_box = { + type = "fixed", + fixed = { + {-0.0625 + 0.125, -0.5, -0.125 + 0.125, 0.125 + 0.125, -0.375, 0.0625 + 0.125}, + } + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_place = stem_on_place, + on_construct = function(pos) + if df_trees.spindlestem_growth_permitted(pos) then + minetest.get_node_timer(pos):start(growth_delay()) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos, elapsed) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + df_trees.spawn_spindlestem(pos) + end, +}) + +df_trees.spawn_spindlestem = function(pos) + local cap_item = minetest.get_name_from_content_id(get_spindlestem_cap_type(pos)) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name=cap_item, param2 = node.param2}) + local disp = {x=3, y=3, z=3} + local nearby = minetest.find_nodes_in_area(vector.add(pos, disp), vector.subtract(pos, disp), {"group:spindlestem"}) + local count = #nearby + local height = math.random(1,3) + if count > 10 then height = height + 2 end -- if there are a lot of nearby spindlestems, grow taller + if height > 0 then + local delay = growth_delay() + local meta = minetest.get_meta(pos) + meta:set_int("spindlestem_to_grow", height) + meta:set_int("spindlestem_delay", delay) + minetest.get_node_timer(pos):start(delay) + end +end + +register_spindlestem_type("white", S("White"), "FFFFFF", 0) +register_spindlestem_type("red", S("Red"), "FFC3C3", 3, "color_red") +register_spindlestem_type("green", S("Green"), "C3FFC3", 4, "color_green") +register_spindlestem_type("cyan", S("Cyan"), "C3FFFF", 6, "color_cyan") +register_spindlestem_type("golden", S("Golden"), "FFFFC3", 12, "color_yellow") + +local c_air = minetest.get_content_id("air") +local c_stem = minetest.get_content_id("df_trees:spindlestem_stem") + +df_trees.spawn_spindlestem_vm = function(vi, area, data, data_param2, c_cap) + if data[vi] ~= c_air then return end + + if c_cap == nil then + -- note: this won't account for rock removed by subterrane, so may not be entirely accurate. Good enough! + c_cap = get_spindlestem_cap_type(area:position(vi)) + end + + local stem_height = math.random(1,3) + local param2 = math.random(1,4)-1 + local i = 0 + local top = 0 + local index + while i <= stem_height do + index = vi + i * area.ystride + if data[index] == c_air then + data[index] = c_stem + data_param2[index] = param2 + top = i + else + i = 100 + end + i = i + 1 + end + index = vi + top * area.ystride + data[index] = c_cap +end + +local c_white = minetest.get_content_id("df_trees:spindlestem_cap_white") +local c_red = minetest.get_content_id("df_trees:spindlestem_cap_red") +local c_green = minetest.get_content_id("df_trees:spindlestem_cap_green") +local c_cyan = minetest.get_content_id("df_trees:spindlestem_cap_cyan") +local c_golden = minetest.get_content_id("df_trees:spindlestem_cap_golden") + +local iron_nodes = df_dependencies.data_iron_containing_nodes +local copper_nodes = df_dependencies.data_copper_containing_nodes +local mese_nodes = df_dependencies.data_mese_containing_nodes + +get_spindlestem_cap_type = function(pos) + if minetest.find_node_near(pos, 15, "group:tower_cap") then + return c_white + end + if minetest.find_node_near(pos, 15, "group:goblin_cap") then + return c_red + end + + local iron = minetest.find_node_near(pos, 5, iron_nodes) + local copper = minetest.find_node_near(pos, 5, copper_nodes) + local mese = minetest.find_node_near(pos, 5, mese_nodes) + local possibilities = {} + + if mese then table.insert(possibilities, c_golden) end + if copper then table.insert(possibilities, c_green) end + if iron then table.insert(possibilities, c_red) end + if iron and copper then table.insert(possibilities, c_cyan) end + if #possibilities == 0 then + return c_white + else + local pick = math.random(1, #possibilities) + return possibilities[pick] + end +end diff --git a/mods/dfcaverns/df_trees/spore_tree.lua b/mods/dfcaverns/df_trees/spore_tree.lua new file mode 100644 index 0000000..dd8dd93 --- /dev/null +++ b/mods/dfcaverns/df_trees/spore_tree.lua @@ -0,0 +1,349 @@ +-------------------------------------------------- +-- Spore Tree + +-- Teal +-- raining spores +-- Max trunk height 5 +-- depth 2-3 + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_trees:spore_tree", { + description = S("Spore Tree Stem"), + _doc_items_longdesc = df_trees.doc.spore_tree_desc, + _doc_items_usagehelp = df_trees.doc.spore_tree_usage, + tiles = {"dfcaverns_spore_tree_top.png", "dfcaverns_spore_tree_top.png", "dfcaverns_spore_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + + on_place = minetest.rotate_node, +}) + +--Wood +minetest.register_craft({ + output = "df_trees:spore_tree_wood 4", + recipe = { + {"df_trees:spore_tree"}, + } +}) + +minetest.register_node("df_trees:spore_tree_wood", { + description = S("Spore Tree Planks"), + _doc_items_longdesc = df_trees.doc.spore_tree_desc, + _doc_items_usagehelp = df_trees.doc.spore_tree_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_spore_tree_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, +}) + +df_dependencies.register_all_stairs_and_fences("spore_tree_wood", {burntime = 6}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spore_tree_wood", + burntime = 6, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spore_tree", + burntime = 20, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spore_tree_hyphae", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spore_tree_fruiting_body", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spore_tree_sapling", + burntime = 1, +}) + +minetest.register_node("df_trees:spore_tree_hyphae", { + description = S("Spore Tree Hyphae"), + _doc_items_longdesc = df_trees.doc.spore_tree_desc, + _doc_items_usagehelp = df_trees.doc.spore_tree_usage, + waving = 1, + tiles = {"dfcaverns_spore_tree.png"}, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, spore_tree_hyphae = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + walkable = false, + climbable = true, + + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + {-0.0625, -0.0625, -0.5, 0.0625, 0.0625, 0.5}, + {-0.5, -0.0625, -0.0625, 0.5, 0.0625, 0.0625}, + } + }, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes +}) + +minetest.register_node("df_trees:spore_tree_fruiting_body", { + description = S("Spore Tree Fruiting Body"), + _doc_items_longdesc = df_trees.doc.spore_tree_desc, + _doc_items_usagehelp = df_trees.doc.spore_tree_usage, + waving = 1, + tiles = {"dfcaverns_spore_tree.png"}, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, spore_tree_hyphae = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=100}, + walkable = false, + climbable = true, + _mcl_blast_resistance = 0.7, + _mcl_hardness = 0.7, + + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + {-0.0625, -0.0625, -0.5, 0.0625, 0.0625, 0.5}, + {-0.5, -0.0625, -0.0625, 0.5, 0.0625, 0.0625}, + {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + } + }, + + drop = { + max_items = 1, + items = { + { + items = {'df_trees:spore_tree_sapling'}, + rarity = 2, + }, + { + items = {'df_trees:spore_tree_hyphae'}, + } + } + }, + sounds = df_dependencies.sound_leaves(), + + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_trees:spore_tree"}, + leaves = {"df_trees:spore_tree_hyphae", "df_trees:spore_tree_fruiting_body"}, + radius = 3, +}) + +minetest.register_node("df_trees:spore_tree_sapling", { + description = S("Spore Tree Spawn"), + _doc_items_longdesc = df_trees.doc.spore_tree_desc, + _doc_items_usagehelp = df_trees.doc.spore_tree_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_spore_tree_sapling.png"}, + inventory_image = "dfcaverns_spore_tree_sapling.png", + wield_image = "dfcaverns_spore_tree_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + floodable = true, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_construct = function(pos) + if df_trees.spore_tree_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.spore_tree_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.spore_tree_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + minetest.set_node(pos, {name="air"}) + df_trees.spawn_spore_tree(pos) + end, +}) + +local c_air = minetest.get_content_id("air") +local c_ignore = minetest.get_content_id("ignore") +local c_spore_pod = minetest.get_content_id("df_trees:spore_tree_fruiting_body") +local c_tree = minetest.get_content_id("df_trees:spore_tree") +local c_spore_frond = minetest.get_content_id("df_trees:spore_tree_hyphae") + +df_trees.spawn_spore_tree_vm = function(vi, area, data, data_param2, height, size, iters, has_fruiting_bodies) + if height == nil then height = math.random(3,6) end + if size == nil then size = 2 end + if iters == nil then iters = 10 end + if has_fruiting_bodies == nil then has_fruiting_bodies = math.random() < 0.5 end + + local pos = area:position(vi) + local x, y, z = pos.x, pos.y, pos.z + + local has_fruiting_bodies = true + + -- Trunk + for yy = y, y + height - 1 do + local vi = area:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == c_spore_frond or node_id == c_spore_pod then + data[vi] = c_tree + data_param2[vi] = 0 + end + end + + -- Force leaves near the trunk + for z_dist = -1, 1 do + for y_dist = -size, 1 do + local vi = area:index(x - 1, y + height + y_dist, z + z_dist) + for x_dist = -1, 1 do + if data[vi] == c_air or data[vi] == c_ignore then + if has_fruiting_bodies and math.random() < 0.3 then + data[vi] = c_spore_pod + else + data[vi] = c_spore_frond + end + data_param2[vi] = 0 + end + vi = vi + 1 + end + end + end + + -- Randomly add fronds in 2x2x2 clusters. + for i = 1, iters do + local clust_x = x + math.random(-size, size - 1) + local clust_y = y + height + math.random(-size, 0) + local clust_z = z + math.random(-size, size - 1) + + for xi = 0, 1 do + for yi = 0, 1 do + for zi = 0, 1 do + local vi = area:index(clust_x + xi, clust_y + yi, clust_z + zi) + if data[vi] == c_air or data[vi] == c_ignore then + if has_fruiting_bodies and math.random() < 0.3 then + data[vi] = c_spore_pod + else + data[vi] = c_spore_frond + end + data_param2[vi] = 0 + end + end + end + end + end +end + +df_trees.spawn_spore_tree = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local height = math.random(4, 5) + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 2, y = y, z = z - 2}, + {x = x + 2, y = y + height + 1, z = z + 2} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + local data_param_2 = vm:get_param2_data() + + df_trees.spawn_spore_tree_vm(area:indexp(pos), area, data, data_param_2) + + vm:set_data(data) + vm:set_param2_data(data_param_2) + vm:write_to_map() + vm:update_map() +end + + +minetest.register_abm{ + label = "spore tree raining spores", + nodenames = {"df_trees:spore_tree_fruiting_body"}, + interval = 1, + chance = 30, + catch_up = false, + action = function(pos) + minetest.add_particle({ + pos = pos, + velocity = {x=math.random() * 0.2 - 0.1, y=-1, z=math.random() * 0.2 - 0.1}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 3, + size = 10, + collisiondetection = false, + vertical = false, + texture = "dfcaverns_spore_tree_spores.png", + }) + if math.random() < 0.025 then + minetest.sound_play("dfcaverns_spore_tree_pitter_patter", { + pos = pos, + gain = 0.2, + }) + end + end, +} + + +minetest.register_craft({ + output = 'df_trees:spore_tree_ladder 2', + recipe = { + {'group:spore_tree_hyphae'}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:spore_tree_ladder", + burntime = 1, +}) + +minetest.register_node("df_trees:spore_tree_ladder", { + description = S("Spore Tree Ladder"), + drawtype = "signlike", + tiles = {"dfcaverns_spore_tree_ladder.png"}, + inventory_image = "dfcaverns_spore_tree_ladder.png", + wield_image = "dfcaverns_spore_tree_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + }, + groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2, handy=1,axey=1, attached_node=1, deco_block=1, dig_by_piston=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + legacy_wallmounted = true, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, +}) diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_gills.png b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_gills.png new file mode 100644 index 0000000..2f64146 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_gills.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_sapling.png new file mode 100644 index 0000000..6dd87df Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_side.png b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_side.png new file mode 100644 index 0000000..ff3531e Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_side.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_top.png b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_top.png new file mode 100644 index 0000000..ee4ef54 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_top.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_wood.png new file mode 100644 index 0000000..ff0efba Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_black_cap_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_side.png b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_side.png new file mode 100644 index 0000000..c3c7a9f Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_side.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_spike_front.png b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_spike_front.png new file mode 100644 index 0000000..7f67577 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_spike_front.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_spike_side.png b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_spike_side.png new file mode 100644 index 0000000..b554d9b Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_spike_side.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_top.png b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_top.png new file mode 100644 index 0000000..1d25e67 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_top.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_wood.png new file mode 100644 index 0000000..2844a8f Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_blood_thorn_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood.png new file mode 100644 index 0000000..4104c88 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_sapling.png new file mode 100644 index 0000000..f0e5bb3 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_shelf_underside.png b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_shelf_underside.png new file mode 100644 index 0000000..8ba37e4 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_shelf_underside.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_wood.png new file mode 100644 index 0000000..a440144 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_fungiwood_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap.png b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap.png new file mode 100644 index 0000000..d8b23d3 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_gills.png b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_gills.png new file mode 100644 index 0000000..a662082 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_gills.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_sapling.png new file mode 100644 index 0000000..d98575e Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_stem.png b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_stem.png new file mode 100644 index 0000000..aa22e70 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_stem.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_stem_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_stem_wood.png new file mode 100644 index 0000000..d896315 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_stem_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_wood.png new file mode 100644 index 0000000..efc13c0 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_goblin_cap_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap.png b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap.png new file mode 100644 index 0000000..89bf736 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_gills.png b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_gills.png new file mode 100644 index 0000000..8d90d87 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_gills.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_sapling.png new file mode 100644 index 0000000..9ccd25f Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_stem.png b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_stem.png new file mode 100644 index 0000000..f440bf3 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_stem.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_wood.png new file mode 100644 index 0000000..999af36 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_nether_cap_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spindlestem_cap.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spindlestem_cap.png new file mode 100644 index 0000000..ab186d2 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spindlestem_cap.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree.png new file mode 100644 index 0000000..788d4c0 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_ladder.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_ladder.png new file mode 100644 index 0000000..74a6579 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_ladder.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_sapling.png new file mode 100644 index 0000000..153bf18 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_spores.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_spores.png new file mode 100644 index 0000000..a9031fb Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_spores.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_top.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_top.png new file mode 100644 index 0000000..61ac009 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_top.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_wood.png new file mode 100644 index 0000000..f31ac30 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_spore_tree_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_0.5.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_0.5.png new file mode 100644 index 0000000..5cbb530 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_0.5.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1.5.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1.5.png new file mode 100644 index 0000000..e199cd6 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1.5.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1.png new file mode 100644 index 0000000..341c872 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1_lit.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1_lit.png new file mode 100644 index 0000000..dd0f15c Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_1_lit.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_2.5.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_2.5.png new file mode 100644 index 0000000..e59a1b9 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_2.5.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_2.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_2.png new file mode 100644 index 0000000..7cc79d7 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_2.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_3.5.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_3.5.png new file mode 100644 index 0000000..28baee2 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_3.5.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_3.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_3.png new file mode 100644 index 0000000..02d6e42 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_3.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_4.5.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_4.5.png new file mode 100644 index 0000000..20c7b94 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_4.5.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_4.png b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_4.png new file mode 100644 index 0000000..70bd805 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_torchspine_4.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap.png new file mode 100644 index 0000000..8ca90fc Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_gills.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_gills.png new file mode 100644 index 0000000..596de9e Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_gills.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_sapling.png new file mode 100644 index 0000000..638f12b Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_wood.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_wood.png new file mode 100644 index 0000000..32f8bbb Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tower_cap_wood.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube.png new file mode 100644 index 0000000..bf5394e Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_sapling.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_sapling.png new file mode 100644 index 0000000..9a33bc5 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_sapling.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_wood_side.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_wood_side.png new file mode 100644 index 0000000..1122e88 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_wood_side.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_wood_top.png b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_wood_top.png new file mode 100644 index 0000000..f409898 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_tunnel_tube_wood_top.png differ diff --git a/mods/dfcaverns/df_trees/textures/dfcaverns_vessels_glowing_liquid.png b/mods/dfcaverns/df_trees/textures/dfcaverns_vessels_glowing_liquid.png new file mode 100644 index 0000000..ae12065 Binary files /dev/null and b/mods/dfcaverns/df_trees/textures/dfcaverns_vessels_glowing_liquid.png differ diff --git a/mods/dfcaverns/df_trees/textures/license.txt b/mods/dfcaverns/df_trees/textures/license.txt new file mode 100644 index 0000000..7d31ed5 --- /dev/null +++ b/mods/dfcaverns/df_trees/textures/license.txt @@ -0,0 +1,10 @@ +All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. + +dfcaverns_blood_thorn - derived from default cactus +dfcaverns_black_cap - derived from default coal block +dfcaverns_goblin_cap - derived from default red coral +dfcaverns_nether_cap_stem - derived from default red coral +dfcaverns_tower_cap - derived from default dead coral +dfcaverns_tunnel_tube - derived from moretrees palm tree bark +dfcaverns_tower_cap_gills - from caverealms mushroom gills +dfcaverns_spore_tree_spores - derived from farming wheat seed \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/torchspine.lua b/mods/dfcaverns/df_trees/torchspine.lua new file mode 100644 index 0000000..0f28da0 --- /dev/null +++ b/mods/dfcaverns/df_trees/torchspine.lua @@ -0,0 +1,411 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local torchspine_min_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_min_growth_delay +local torchspine_max_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_max_growth_delay + +local looped_node_sound_modpath = minetest.get_modpath("looped_node_sound") + +-- Rather than make this whole mod depend on subterrane just for this, I copied and pasted a chunk of stalactite code. +local x_disp = 0.125 +local z_disp = 0.125 + +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + +local stal_on_place = function(itemstack, placer, pointed_thing) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + if minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.record_protection_violation(pt.above, placer:get_player_name()) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] or not minetest.registered_nodes[above.name] then + return itemstack + end + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + local new_param2 + -- check if pointing at an existing stalactite + if minetest.get_item_group(under.name, "subterrane_stal_align") ~= 0 then + new_param2 = under.param2 + else + new_param2 = math.random(0,3) + end + + -- add the node and remove 1 item from the itemstack + local newnode= {name = itemstack:get_name(), param2 = new_param2, param1=0} + local oldnode= minetest.get_node(pt.above) + minetest.add_node(pt.above, {name = itemstack:get_name(), param2 = new_param2}) + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) and take_item then + itemstack:take_item() + end + return itemstack +end + +local stal_box_1 = {{-0.0625+x_disp, -0.5, -0.0625+z_disp, 0.0625+x_disp, 0.5, 0.0625+z_disp}} +local stal_box_2 = {{-0.125+x_disp, -0.5, -0.125+z_disp, 0.125+x_disp, 0.5, 0.125+z_disp}} +local stal_box_3 = {{-0.25+x_disp, -0.5, -0.25+z_disp, 0.25+x_disp, 0.5, 0.25+z_disp}} +local stal_box_4 = {{-0.375+x_disp, -0.5, -0.375+z_disp, 0.375+x_disp, 0.5, 0.375+z_disp}} + +local torchspine_list = {"df_trees:torchspine_1","df_trees:torchspine_2","df_trees:torchspine_3","df_trees:torchspine_4"} +local grow_torchspine = function(pos) + local param2 = minetest.get_node(pos).param2 + + if param2 > 3 then + return -- tipped over, don't grow + end + + local node_above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) + local node_above_def = minetest.registered_nodes[node_above.name] + if not node_above_def.buildable_to then + -- don't grow, but do continue cycling the torch state + minetest.swap_node(pos, {name = "df_trees:torchspine_1", param2 = param2}) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + return + end + + local pos_base = vector.new(pos) + local height = 1 + for i = 1,3 do + pos_base.y = pos_base.y-1 + if minetest.get_item_group(minetest.get_node(pos_base).name, "df_trees_torchspine") > 0 then + height = height + 1 + else + break + end + end + if height >= 4 then + -- don't grow, but do continue cycling the torch state + minetest.swap_node(pos, {name = "df_trees:torchspine_1", param2 = param2}) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + return + end + + -- place a taller torchspine + pos.y = pos.y + 1 + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + for i = 1, height+1 do + minetest.swap_node(pos, {name=torchspine_list[i], param2 = param2}) + pos.y = pos.y - 1 + end +end + +local torch_node = df_dependencies.node_name_torch + +minetest.register_node("df_trees:torchspine_1", { + description = S("Torchspine Tip"), + _doc_items_longdesc = df_trees.doc.torchspine_desc, + _doc_items_usagehelp = df_trees.doc.torchspine_usage, + tiles = {"dfcaverns_torchspine_0.5.png", "dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_1.png"}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, fall_damage_add_percent = 100, df_trees_torchspine = 1, pickaxey=1, building_block=1, material_stone=1}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = torch_node, + node_box = { + type = "fixed", + fixed = stal_box_1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + + on_place = stal_on_place, + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == torch_node then + minetest.swap_node(pos, {name = "df_trees:torchspine_1_lit", param2 = node.param2}) + end + end, + + on_timer = function(pos) + local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] + if above_def and above_def.buildable_to then + minetest.swap_node(pos, {name="df_trees:torchspine_1_lit", param2=minetest.get_node(pos).param2}) + minetest.sound_play({pos = pos}, {name="dfcaverns_torchspine_ignite"}, true) + end + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, +}) + +minetest.register_node("df_trees:torchspine_1_lit", { + description = S("Torchspine Tip"), + _doc_items_longdesc = df_trees.doc.torchspine_desc, + _doc_items_usagehelp = df_trees.doc.torchspine_usage, + tiles = {df_dependencies.texture_gold_block, "dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_1_lit.png"}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, torch = 1, fall_damage_add_percent = 150, smokey = 4, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1,set_on_fire=3}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + light_source = 8, + is_ground_content = false, + drop = torch_node .. " 2", + node_box = { + type = "fixed", + fixed = stal_box_1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + + on_place = stal_on_place, + + on_timer = function(pos) + grow_torchspine(pos) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, +}) + +if looped_node_sound_modpath then + looped_node_sound.register({ + node_list = {"df_trees:torchspine_1_lit"}, + sound = "dfcaverns_torchspine_loop", + max_gain = 0.5, + gain_per_node = 0.05, + }) +end + +minetest.register_node("df_trees:torchspine_2", { + description = S("Torchspine"), + _doc_items_longdesc = df_trees.doc.torchspine_desc, + _doc_items_usagehelp = df_trees.doc.torchspine_usage, + tiles = {"dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_2.5.png", "dfcaverns_torchspine_2.png"}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, fall_damage_add_percent = 50, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + node_box = { + type = "fixed", + fixed = stal_box_2, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + + drop = { + max_items = 1, + items = { + { + items = {"df_trees:torchspine_ember"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + }, + }, + on_place = stal_on_place, +}) + +minetest.register_node("df_trees:torchspine_3", { + description = S("Torchspine"), + _doc_items_longdesc = df_trees.doc.torchspine_desc, + _doc_items_usagehelp = df_trees.doc.torchspine_usage, + tiles = {"dfcaverns_torchspine_2.5.png", "dfcaverns_torchspine_3.5.png", "dfcaverns_torchspine_3.png"}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + node_box = { + type = "fixed", + fixed = stal_box_3, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + + drop = { + max_items = 1, + items = { + { + items = {"df_trees:torchspine_ember"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + { + items = {"df_trees:torchspine_ember 2"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + }, + }, + on_place = stal_on_place, +}) + +minetest.register_node("df_trees:torchspine_4", { + description = S("Torchspine"), + _doc_items_longdesc = df_trees.doc.torchspine_desc, + _doc_items_usagehelp = df_trees.doc.torchspine_usage, + tiles = {"dfcaverns_torchspine_3.5.png", "dfcaverns_torchspine_4.5.png", "dfcaverns_torchspine_4.png"}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + node_box = { + type = "fixed", + fixed = stal_box_4, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + + drop = { + max_items = 1, + items = { + { + items = {"df_trees:torchspine_ember 2"}, -- Items to drop + rarity = 2, -- Probability of dropping is 1 / rarity + }, + { + items = {"df_trees:torchspine_ember"}, -- Items to drop + rarity = 1, -- Probability of dropping is 1 / rarity + }, + }, + }, on_place = stal_on_place, +}) + +minetest.register_node("df_trees:torchspine_ember", { + description = S("Torchspine Ember"), + _doc_items_longdesc = df_trees.doc.torchspine_desc, + _doc_items_usagehelp = df_trees.doc.torchspine_usage, + tiles = {"dfcaverns_torchspine_0.5.png",}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1,pickaxey=1, building_block=1, material_stone=1,set_on_fire=1}, + drawtype = "nodebox", + paramtype = "light", + light_source = 2, + paramtype2 = "facedir", + walkable = false, + is_ground_content = false, + floodable = true, + node_box = { + type = "fixed", + fixed = { + {-0.0625 + x_disp, -0.5, -0.125 + z_disp, 0.125 + x_disp, -0.375, 0.0625 + z_disp}, + } + }, + _mcl_blast_resistance = 10, + _mcl_hardness = 1, + + on_place = stal_on_place, + + on_construct = function(pos) + if df_trees.torchspine_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + minetest.swap_node(pos, {name="df_trees:torchspine_1", param2=minetest.get_node(pos).param2}) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + minetest.sound_play({pos = pos}, {name="dfcaverns_torchspine_ignite"}, true) + end, +}) + +df_trees.spawn_torchspine = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local stem_height = math.random(1,4) + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x, y = y, z = z}, + {x = x, y = y+height-1, z = z} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + local data_param2 = vm:get_param2_data() + + df_trees.spawn_torchspine_vm(vi, area, data, data_param2, height) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +local torchspine_c = +{ + minetest.get_content_id("df_trees:torchspine_1"), + minetest.get_content_id("df_trees:torchspine_2"), + minetest.get_content_id("df_trees:torchspine_3"), + minetest.get_content_id("df_trees:torchspine_4") +} +local torchspine_lit_c = +{ + minetest.get_content_id("df_trees:torchspine_1_lit"), + minetest.get_content_id("df_trees:torchspine_2"), + minetest.get_content_id("df_trees:torchspine_3"), + minetest.get_content_id("df_trees:torchspine_4") +} + +df_trees.spawn_torchspine_vm = function(vi, area, data, data_param2, height, lit) + if height == nil then height = math.random(1,4) end + if lit == nil then lit = math.random() < 0.3 end + local param2 = math.random(0,3) + local list + if lit then list = torchspine_lit_c else list = torchspine_c end + + for i = 0, height-1 do + if not minetest.registered_nodes[minetest.get_name_from_content_id(data[vi + area.ystride*i])].buildable_to then + height = i + break + end + end + + for i = 0, height-1 do + local index = vi + area.ystride*i + data[index] = list[height-i] + data_param2[index] = param2 + end + + local pos = area:position(vi) + pos.y = pos.y+height-1 + local node = minetest.get_node(pos) + minetest.get_node_timer(pos):start(math.random()*3000) +end + +minetest.register_lbm({ + label = "Start timers for torchspine nodes that used to depend on the ABM", + name = "df_trees:start_torchspine_timers", + nodenames = {"df_trees:torchspine_ember", "df_trees:torchspine_1", "df_trees:torchspine_1_lit"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + end, +}) diff --git a/mods/dfcaverns/df_trees/tower_cap.lua b/mods/dfcaverns/df_trees/tower_cap.lua new file mode 100644 index 0000000..c39200d --- /dev/null +++ b/mods/dfcaverns/df_trees/tower_cap.lua @@ -0,0 +1,187 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +--stem +minetest.register_node("df_trees:tower_cap_stem", { + description = S("Tower Cap Stem"), + _doc_items_longdesc = df_trees.doc.tower_cap_desc, + _doc_items_usagehelp = df_trees.doc.tower_cap_usage, + tiles = {"dfcaverns_tower_cap.png"}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, tower_cap = 1, tower_cap_trunk = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +--cap +minetest.register_node("df_trees:tower_cap", { + description = S("Tower Cap"), + _doc_items_longdesc = df_trees.doc.tower_cap_desc, + _doc_items_usagehelp = df_trees.doc.tower_cap_usage, + tiles = {"dfcaverns_tower_cap.png"}, + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, tower_cap = 1, tower_cap_trunk = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +--gills +minetest.register_node("df_trees:tower_cap_gills", { + description = S("Tower Cap Gills"), + _doc_items_longdesc = df_trees.doc.tower_cap_desc, + _doc_items_usagehelp = df_trees.doc.tower_cap_usage, + tiles = {"dfcaverns_tower_cap_gills.png"}, + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, tower_cap = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + sounds = df_dependencies.sound_leaves(), + drawtype = "plantlike", + paramtype = "light", + drop = { + max_items = 1, + items = { + { + items = {'df_trees:tower_cap_sapling'}, + rarity = 5, + }, + { + items = {'df_trees:tower_cap_gills'}, + } + } + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + after_place_node = df_dependencies.after_place_leaves, +}) + +df_dependencies.register_leafdecay({ + trunks = {"df_trees:tower_cap"}, -- don't need stem nodes here + leaves = {"df_trees:tower_cap_gills"}, + radius = 1, +}) + +--Wood +minetest.register_craft({ + output = 'df_trees:tower_cap_wood 4', + recipe = { + {'group:tower_cap_trunk'}, + } +}) + +minetest.register_node("df_trees:tower_cap_wood", { + description = S("Tower Cap Planks"), + _doc_items_longdesc = df_trees.doc.tower_cap_desc, + _doc_items_usagehelp = df_trees.doc.tower_cap_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_tower_cap_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, +}) + +df_dependencies.register_all_stairs_and_fences("tower_cap_wood", {burntime = 7}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tower_cap_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tower_cap", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tower_cap_stem", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tower_cap_gills", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tower_cap_sapling", + burntime = 2, +}) + +-- sapling +minetest.register_node("df_trees:tower_cap_sapling", { + description = S("Tower Cap Spawn"), + _doc_items_longdesc = df_trees.doc.tower_cap_desc, + _doc_items_usagehelp = df_trees.doc.tower_cap_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_tower_cap_sapling.png"}, + inventory_image = "dfcaverns_tower_cap_sapling.png", + wield_image = "dfcaverns_tower_cap_sapling.png", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + floodable = true, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + + on_construct = function(pos) + if df_trees.tower_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + minetest.set_node(pos, {name="air"}) + df_trees.spawn_tower_cap(pos) + end, +}) + +local c_stem = minetest.get_content_id("df_trees:tower_cap_stem") +local c_cap = minetest.get_content_id("df_trees:tower_cap") +local c_gills = minetest.get_content_id("df_trees:tower_cap_gills") + +df_trees.spawn_tower_cap = function(pos) + local x, y, z = pos.x, pos.y, pos.z + local stem_height = math.random(4,10) + local cap_radius = math.random(4,6) + local maxy = y + stem_height + 3 + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - cap_radius, y = y, z = z - cap_radius}, + {x = x + cap_radius, y = maxy + 3, z = z + cap_radius} + ) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + subterrane.giant_mushroom(area:indexp(pos), area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +df_trees.spawn_tower_cap_vm = function(vi, area, data) + local stem_height = math.random(4,10) + local cap_radius = math.random(4,6) + subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_trees/tunnel_tube.lua b/mods/dfcaverns/df_trees/tunnel_tube.lua new file mode 100644 index 0000000..07369e6 --- /dev/null +++ b/mods/dfcaverns/df_trees/tunnel_tube.lua @@ -0,0 +1,461 @@ +-------------------------------------------------- +-- Tunnel tube + +-- Magenta +-- curving trunk +-- Max trunk height 8 +-- depth 2-3 + +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_trees:tunnel_tube", { + description = S("Tunnel Tube"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png"}, + paramtype2 = "facedir", + drawtype = "nodebox", + is_ground_content = false, + paramtype = "light", + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + + node_box = { + type = "fixed", + fixed = { + {-8/16,-8/16,-8/16,-4/16,8/16,8/16}, + {4/16,-8/16,-8/16,8/16,8/16,8/16}, + {-4/16,-8/16,-8/16,4/16,8/16,-4/16}, + {-4/16,-8/16,8/16,4/16,8/16,4/16}, + }, + }, +}) + +minetest.register_node("df_trees:tunnel_tube_slant_bottom", { + description = S("Tunnel Tube"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png"}, + paramtype2 = "facedir", + drawtype = "mesh", + is_ground_content = false, + mesh = "tunnel_tube_slant.obj", + paramtype = "light", + drop = "df_trees:tunnel_tube", + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375}, + {-0.5, 0.0, -0.875, 0.5, 0.5, 0.125}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.625, 0.5, 0.0, 0.375}, + {-0.5, 0.0, -0.875, 0.5, 0.5, 0.125}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_trees:tunnel_tube_slant_top", { + description = S("Tunnel Tube"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png"}, + paramtype2 = "facedir", + drawtype = "mesh", + is_ground_content = false, + mesh = "tunnel_tube_slant_2.obj", + paramtype = "light", + drop = "df_trees:tunnel_tube", + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.0, 0.875}, + {-0.5, 0.0, -0.375, 0.5, 0.5, 0.625}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.0, 0.875}, + {-0.5, 0.0, -0.375, 0.5, 0.5, 0.625}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +minetest.register_node("df_trees:tunnel_tube_slant_full", { + description = S("Tunnel Tube"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png", "dfcaverns_tunnel_tube.png"}, + paramtype2 = "facedir", + drawtype = "mesh", + is_ground_content = false, + mesh = "tunnel_tube_slant_full.obj", + paramtype = "light", + drop = "df_trees:tunnel_tube", + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.75, 0.5, 0, 0.25}, + {-0.5, 0, -1.25, 0.5, 0.5, -0.25}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.75, 0.5, 0, 0.25}, + {-0.5, 0, -1.25, 0.5, 0.5, -0.25}, + }, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, +}) + +--Wood +minetest.register_craft({ + output = 'df_trees:tunnel_tube_wood 4', + recipe = { + {'df_trees:tunnel_tube'}, + } +}) + +-- Paper +minetest.register_craft({ + output = df_dependencies.node_name_paper .. " 3", + type = "shapeless", + recipe = {'df_trees:tunnel_tube', 'bucket:bucket_water'}, + replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, +}) + +minetest.register_node("df_trees:tunnel_tube_wood", { + description = S("Tunnel Tube Plies"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"dfcaverns_tunnel_tube_wood_top.png", "dfcaverns_tunnel_tube_wood_top.png", "dfcaverns_tunnel_tube_wood_side.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 10, + _mcl_hardness = 2, +}) + +df_dependencies.register_all_stairs_and_fences("tunnel_tube_wood", {burntime = 9}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tunnel_tube_wood", + burntime = 9, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tunnel_tube", + burntime = 36, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_trees:tunnel_tube_sapling", + burntime = 3, +}) + +-- TNT +----------------------------------------------------------------------------------------------------------- + +local gunpowder = df_dependencies.node_name_gunpowder +local tnt_ignite_sound = df_dependencies.soundfile_tnt_ignite +local tnt_boom = df_dependencies.tnt_boom + +if df_trees.config.enable_tnt then + + local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3) * 2/3 + local tnt_def = {radius = tnt_radius, damage_radius = tnt_radius * 2} + local torch_item = df_dependencies.node_name_torch + + local drop_items = { + max_items = 1, + items = { + { + items = {'df_trees:tunnel_tube_sapling'}, + rarity = 2, + }, + } + } + if gunpowder then + drop_items.max_items = 3 + table.insert(drop_items.items, { + items = {'df_trees:tunnel_tube_sapling', gunpowder}, + rarity = 2, + }) + table.insert(drop_items.items, { + items = {'df_trees:tunnel_tube_sapling', gunpowder .. ' 2'}, + rarity = 2, + }) + end + + local on_burn = function(pos) + minetest.swap_node(pos, {name = "df_trees:tunnel_tube_fruiting_body_burning"}) + minetest.registered_nodes["df_trees:tunnel_tube_fruiting_body_burning"].on_construct(pos) + end + + minetest.register_node("df_trees:tunnel_tube_fruiting_body", { + description = S("Tunnel Tube Fruiting Body"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png^[multiply:#b09090"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2, tnt = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + drop = drop_items, + _mcl_blast_resistance = 12, + _mcl_hardness = 2, + + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == torch_item then + minetest.swap_node(pos, {name = "df_trees:tunnel_tube_fruiting_body_burning"}) + minetest.registered_nodes["df_trees:tunnel_tube_fruiting_body_burning"].on_construct(pos) + minetest.log("action", puncher:get_player_name() .. " ignites " .. node.name .. " at " .. minetest.pos_to_string(pos)) + end + end, + on_blast = function(pos, intensity) + minetest.swap_node(pos, {name="air"}) + minetest.after(0.1, function() + tnt_boom(pos, tnt_def) + end) + end, + mesecons = {effector = + {action_on = + function(pos) + minetest.swap_node(pos, {name="air"}) + tnt_boom(pos, tnt_def) + end + } + }, + on_burn = on_burn, + on_ignite = on_burn, + _on_burn = on_burn, + }) + + minetest.register_node("df_trees:tunnel_tube_fruiting_body_burning", { + description = S("Tunnel Tube Fruiting Body"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png^[multiply:#b09090"}, + is_ground_content = false, + groups = {not_in_creative_inventory = 1,}, + light_source = 5, + drop = "", + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 0, + _mcl_hardness = 2, + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="air"}) + tnt_boom(pos, tnt_def) + end, + on_blast = function(pos) + minetest.swap_node(pos, {name="air"}) + minetest.after(0.1, function() + tnt_boom(pos, tnt_def) + end) + end, + on_construct = function(pos) + minetest.sound_play(tnt_ignite_sound, {pos = pos}) + minetest.get_node_timer(pos):start(4) + end, + }) +else + minetest.register_node("df_trees:tunnel_tube_fruiting_body", { + description = S("Tunnel Tube Fruiting Body"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + tiles = {"dfcaverns_tunnel_tube.png^[multiply:#b09090"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 12, + _mcl_hardness = 2, + + drop = { + max_items = 3, + items = { + { + items = {'df_trees:tunnel_tube_sapling'}, + rarity = 2, + }, + { + items = {'df_trees:tunnel_tube_sapling'}, + rarity = 2, + }, + { + items = {'df_trees:tunnel_tube_sapling'}, + rarity = 2, + }, + }, + }, + }) +end +----------------------------------------------------------------------------------------------------------- + +minetest.register_node("df_trees:tunnel_tube_sapling", { + description = S("Tunnel Tube Spawn"), + _doc_items_longdesc = df_trees.doc.tunnel_tube_desc, + _doc_items_usagehelp = df_trees.doc.tunnel_tube_usage, + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"dfcaverns_tunnel_tube_sapling.png"}, + inventory_image = "dfcaverns_tunnel_tube_sapling.png", + wield_image = "dfcaverns_tunnel_tube_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + floodable = true, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 10, + _mcl_hardness = 0.2, + + on_construct = function(pos) + if df_trees.tunnel_tube_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tunnel_tube_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.tunnel_tube_delay_multiplier*df_trees.config.tree_max_growth_delay)) + end + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end + minetest.set_node(pos, {name="air"}) + df_trees.spawn_tunnel_tube(pos) + end, +}) + +local tunnel_tube_directions = { + [0] = {x=0,y=0,z=-1}, + [1] = {x=-1,y=0,z=0}, + [2] = {x=0,y=0,z=1}, + [3] = {x=1,y=0,z=0}, +} + +local tunnel_tube_displacement = +{ + [4] = 1, + [5] = 1, + [6] = 2, + [7] = 2, + [8] = 3, + [9] = 3, +} + +df_trees.spawn_tunnel_tube = function(pos) + local direction = math.random(1,4)-1 -- serves as both the facedir and the lookup in the direction table + local height = math.random(4,9) + local top_pos = vector.add(pos, vector.multiply(tunnel_tube_directions[direction], tunnel_tube_displacement[height])) + top_pos.y = pos.y + height - 1 + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map(pos, top_pos) + local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + + df_trees.spawn_tunnel_tube_vm(area:indexp(pos), area, data, param2_data, height, direction) + + vm:set_data(data) + vm:set_param2_data(param2_data) + vm:write_to_map() + vm:update_map() +end + +local c_air = minetest.get_content_id("air") +local c_ignore = minetest.get_content_id("ignore") +local c_tunnel_tube = minetest.get_content_id("df_trees:tunnel_tube") +local c_tunnel_tube_bottom = minetest.get_content_id("df_trees:tunnel_tube_slant_bottom") +local c_tunnel_tube_top = minetest.get_content_id("df_trees:tunnel_tube_slant_top") +local c_tunnel_tube_full = minetest.get_content_id("df_trees:tunnel_tube_slant_full") +local c_tunnel_tube_fruiting_body = minetest.get_content_id("df_trees:tunnel_tube_fruiting_body") + +-- was simplest to just hardcode these patterns for each height from 4 to 9 +-- pattern is displacement, node +local tunnel_tube_patterns = +{ + [4] = {{0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_fruiting_body}}, + [5] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_fruiting_body}}, + [6] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_fruiting_body}}, + [7] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_fruiting_body}}, + [8] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_full}, {3, c_tunnel_tube_fruiting_body}}, + [9] = {{0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube}, {0, c_tunnel_tube_bottom}, {1, c_tunnel_tube_top}, {1, c_tunnel_tube_full}, {2, c_tunnel_tube_full}, {3, c_tunnel_tube_fruiting_body}}, +} + +df_trees.spawn_tunnel_tube_vm = function(vi, area, data, param2_data, height, direction) + if height == nil then height = math.random(4,9) end + if direction == nil then direction = math.random(1,4)-1 end + + local increment + if direction == 0 then + increment = -area.zstride + elseif direction == 1 then + increment = -1 + elseif direction == 2 then + increment = area.zstride + elseif direction == 3 then + increment = 1 + else + return + end + + local previous_vi = vi + local pattern = tunnel_tube_patterns[height] + if pattern == nil then + minetest.log("error", "Tunnel tube pattern was nil somehow. height: " .. string(height) .. " location: " .. minetest.pos_to_string(area:position(vi))) + return nil + end + for i, nodepattern in ipairs(pattern) do + local current_vi = vi + nodepattern[1] * increment + if data[current_vi] == c_air or data[current_vi] == c_ignore then + previous_vi = current_vi + data[current_vi] = nodepattern[2] + param2_data[current_vi] = direction + else + data[previous_vi] = c_tunnel_tube_fruiting_body + param2_data[previous_vi] = direction + break + end + vi = vi + area.ystride + end +end + diff --git a/mods/dfcaverns/df_underworld_items/LICENSE.txt b/mods/dfcaverns/df_underworld_items/LICENSE.txt new file mode 100644 index 0000000..11ce895 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/LICENSE.txt @@ -0,0 +1,26 @@ +Dwarf Fortress is copyright 2018 by Tarn Adams. This mod uses no assets or other copyrighted materials from Dwarf Fortress. + +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/ancient_lanterns.lua b/mods/dfcaverns/df_underworld_items/ancient_lanterns.lua new file mode 100644 index 0000000..a2782f2 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/ancient_lanterns.lua @@ -0,0 +1,149 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local lantern_nodebox = { + {-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125}, + {-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5}, + {0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5}, + {0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125}, + {-0.3125, 0.3125, -0.5, 0.3125, 0.5, -0.3125}, + {-0.3125, 0.3125, 0.3125, 0.3125, 0.5, 0.5}, + {0.3125, 0.3125, -0.3125, 0.5, 0.5, 0.3125}, + {-0.5, 0.3125, -0.3125, -0.3125, 0.5, 0.3125}, + {-0.5, -0.5, -0.3125, -0.3125, -0.3125, 0.3125}, + {0.3125, -0.5, -0.3125, 0.5, -0.3125, 0.3125}, + {-0.3125, -0.5, 0.3125, 0.3125, -0.3125, 0.5}, + {-0.3125, -0.5, -0.5, 0.3125, -0.3125, -0.3125}, + {-0.375, -0.375, -0.375, 0.375, 0.375, 0.375}, +} + +local mese_crystal_node = df_dependencies.node_name_mese_crystal +local brick_texture = "dfcaverns_slade_brick.png" +local lantern_texture = df_dependencies.texture_meselamp +local ancient_lantern_sound = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }) + +local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode") + +local can_dig +if invulnerable then + can_dig = function(pos, player) + return minetest.check_player_privs(player, "server") + end +end + +local slade_mcl_blast_resistance = 1200 +local slade_mcl_hardness = 50 +local slade_groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, creative_breakable=1, building_block=1, material_stone=1} +if invulnerable then + slade_groups.immortal = 1 + slade_mcl_blast_resistance = 3600000 + slade_mcl_hardness = -1 +end + +-- override this to allow achievements to be recorded without requiring a dependency +df_underworld_items.ancient_lantern_fixed = function(pos, player) end + +local punch_fix = function(pos, node, puncher, pointed_thing) + local wielded = puncher:get_wielded_item() + if wielded:get_name() == mese_crystal_node then + minetest.set_node(pos, {name="df_underworld_items:ancient_lantern_slade"}) + minetest.get_node_timer(pos):stop() + if not minetest.is_creative_enabled(puncher:get_player_name()) then + wielded:take_item() + puncher:set_wielded_item(wielded) + end + df_underworld_items.ancient_lantern_fixed(pos, puncher) + return + end + minetest.node_punch(pos, node, puncher, pointed_thing) +end + +minetest.register_node("df_underworld_items:ancient_lantern_slade", { + description = S("Ancient Lantern"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {brick_texture .. "^(" .. lantern_texture .. "^[mask:dfcaverns_lantern_mask.png)"}, + is_ground_content = false, + groups = slade_groups, + sounds = ancient_lantern_sound, + drawtype= "nodebox", + light_source = minetest.LIGHT_MAX, + node_box = { + type = "fixed", + fixed = lantern_nodebox, + }, + can_dig = can_dig, + _mcl_blast_resistance = slade_mcl_blast_resistance, + _mcl_hardness = slade_mcl_hardness, +}) + +minetest.register_node("df_underworld_items:ancient_lantern_slade_worn", { + description = S("Ancient Lantern"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {brick_texture .. "^(" .. lantern_texture .. "^[multiply:#FF8888^[mask:dfcaverns_lantern_mask.png)"}, + is_ground_content = false, + groups = slade_groups, + sounds = ancient_lantern_sound, + drawtype= "nodebox", + light_source = 6, + node_box = { + type = "fixed", + fixed = lantern_nodebox, + }, + _mcl_blast_resistance = slade_mcl_blast_resistance, + _mcl_hardness = slade_mcl_hardness, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(100, 200)) + end, + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="df_underworld_items:ancient_lantern_slade_burnt_out"}) + if math.random() < 0.1 then + minetest.get_node_timer(pos):start(math.random(30, 60)) + else + minetest.get_node_timer(pos):start(0.25) + end + end, + on_punch = punch_fix, + can_dig = can_dig, +}) + +minetest.register_node("df_underworld_items:ancient_lantern_slade_burnt_out", { + description = S("Ancient Lantern"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {brick_texture .. "^(" .. lantern_texture .. "^[multiply:#884444^[mask:dfcaverns_lantern_mask.png)"}, + is_ground_content = false, + groups = slade_groups, + sounds = ancient_lantern_sound, + drawtype= "nodebox", + light_source = 0, + node_box = { + type = "fixed", + fixed = lantern_nodebox, + }, + drops = "df_underworld_items:ancient_lantern_slade_worn", + _mcl_blast_resistance = slade_mcl_blast_resistance, + _mcl_hardness = slade_mcl_hardness, + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(100, 200)) + end, + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="df_underworld_items:ancient_lantern_slade_worn"}) + if math.random() < 0.1 then + minetest.get_node_timer(pos):start(math.random(300, 600)) + else + minetest.get_node_timer(pos):start(0.25) + end + end, + on_punch = punch_fix, + can_dig = can_dig, +}) + +--minetest.register_craft({ +-- output = "df_underworld_items:ancient_lantern_slade", +-- type = "shapeless", +-- recipe = { +-- "group:df_underworld_items_ancient_lantern", +-- mese_crystal_node, +-- } +--}) \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/config.lua b/mods/dfcaverns/df_underworld_items/config.lua new file mode 100644 index 0000000..4129a5c --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/config.lua @@ -0,0 +1,29 @@ +local CONFIG_FILE_PREFIX = "dfcaverns_" + +df_underworld_items.config = {} + +local print_settingtypes = false + +local function setting(stype, name, default, description) + local value + if stype == "bool" then + value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default) + elseif stype == "string" then + value = minetest.settings:get(CONFIG_FILE_PREFIX..name) + elseif stype == "int" or stype == "float" then + value = tonumber(minetest.setting:get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + df_underworld_items.config[name] = value + + if print_settingtypes then + minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default)) + end +end + +setting("bool", "invulnerable_slade", true, "Slade is invulnerable to players") +setting("bool", "destructive_pit_plasma", true, "Pit plasma destroys adjacent nodes") +setting("bool", "underworld_hunter_statues", true, "Enable hunter statues in the underworld") +setting("bool", "enable_slade_drill", true, "Enable slade drills") \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/crystals_amethyst.lua b/mods/dfcaverns/df_underworld_items/crystals_amethyst.lua new file mode 100644 index 0000000..c64898d --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/crystals_amethyst.lua @@ -0,0 +1,79 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("df_underworld_items:glow_amethyst", { + description = S("Glowing Amethyst Block"), + _doc_items_longdesc = df_underworld_items.doc.glow_amethyst_desc, + _doc_items_usagehelp = df_underworld_items.doc.glow_amethyst_usage, + tiles = {"dfcaverns_glow_amethyst.png"}, + is_ground_content = false, + groups = {cracky=3, pit_plasma_resistant=1, pickaxey = 4, building_block = 1,}, -- deliberately not in material_stone group to keep pit plasma ABM efficient + sounds = df_dependencies.sound_glass(), + light_source = 6, + paramtype = "light", + use_texture_alpha = "blend", + drawtype = "glasslike", + sunlight_propagates = true, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, +}) + +if minetest.get_modpath("radiant_damage") and radiant_damage.override_radiant_damage and radiant_damage.config.enable_mese_damage then + radiant_damage.override_radiant_damage("mese", {emitted_by={["df_underworld_items:glow_amethyst"] = radiant_damage.config.mese_damage*0.25}}) +end + +local c_amethyst = minetest.get_content_id("df_underworld_items:glow_amethyst") + +local safe_write = function(data, area, vi, c_node) + if area:containsi(vi) then data[vi] = c_node end +end + +-- x_slant and z_slant can be 1, 0 or -1 +-- rotated is true or false +-- length is 1 or more +df_underworld_items.underworld_shard = function(data, area, vi, x_slant, z_slant, rotated, length) + if x_slant == nil then x_slant = math.random(-1,1) end + if z_slant == nil then z_slant = math.random(-1,1) end + if rotated == nil then rotated = math.random() > 0.5 end + if length == nil then length = math.random(4, 12) end + + length = math.ceil(length/2) * 2 -- make it an even multiple of 2 + + local xstride, ystride, zstride + ystride = area.ystride + if rotated then + xstride = area.zstride + zstride = 1 + else + xstride = 1 + zstride = area.zstride + end + + -- bottom end + safe_write(data, area, vi, c_amethyst) + safe_write(data, area, vi+xstride, c_amethyst) + + for i = 1, length do + vi = vi + ystride + + safe_write(data, area, vi-xstride, c_amethyst) + + safe_write(data, area, vi+zstride, c_amethyst) + safe_write(data, area, vi, c_amethyst) + safe_write(data, area, vi-zstride, c_amethyst) + + safe_write(data, area, vi+zstride+xstride, c_amethyst) + safe_write(data, area, vi+xstride, c_amethyst) + safe_write(data, area, vi-zstride+xstride, c_amethyst) + + safe_write(data, area, vi+2*xstride, c_amethyst) + + if i % 2 == 0 and i ~= length then + vi = vi + xstride * x_slant + zstride * z_slant + end + end + + vi = vi + ystride + + safe_write(data, area, vi, c_amethyst) + safe_write(data, area, vi+xstride, c_amethyst) +end \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/doc.lua b/mods/dfcaverns/df_underworld_items/doc.lua new file mode 100644 index 0000000..720d9d8 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/doc.lua @@ -0,0 +1,27 @@ +df_underworld_items.doc = {} + +if not minetest.get_modpath("doc") then + return +end + +local S = minetest.get_translator(minetest.get_current_modname()) + +df_underworld_items.doc.glowstone_desc = S("Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.") +df_underworld_items.doc.glowstone_usage = S("These stones are highly volatile and should not be disturbed.") + +df_underworld_items.doc.slade_desc = S("The very foundation of the world, Slade is a mysterious ultra-dense substance.") +df_underworld_items.doc.slade_usage = S("Slade is extremely hard to work with so it has little use.") +if df_underworld_items.config.invulnerable_slade then + df_underworld_items.doc.slade_usage = df_underworld_items.doc.slade_usage .. " " .. S("In fact, Slade is impervious to conventional mining entirely.") +end + +df_underworld_items.doc.slade_seal_desc = S("This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: \"This place is not a place of honor.\"") + +df_underworld_items.doc.glow_amethyst_desc = S("Glowing purple crystals that grow through holes in the foundation of the world.") +df_underworld_items.doc.glow_amethyst_usage = S("These crystals have no known use.") + +df_underworld_items.doc.pit_plasma_desc = S("The liquid found in the deepest pits in the underworld is highly dangerous and damaging.") +df_underworld_items.doc.pit_plasma_usage = S("The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.") + +df_underworld_items.doc.slade_drill_desc = S("This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.") +df_underworld_items.doc.slade_drill_usage = S("Use this on a target to unleash the energies used to dig through the foundations of the world.") diff --git a/mods/dfcaverns/df_underworld_items/glow_stone.lua b/mods/dfcaverns/df_underworld_items/glow_stone.lua new file mode 100644 index 0000000..f3699ea --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/glow_stone.lua @@ -0,0 +1,38 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local glowstone_def = { + _doc_items_longdesc = df_underworld_items.doc.glowstone_desc, + _doc_items_usagehelp = df_underworld_items.doc.glowstone_usage, + light_source = minetest.LIGHT_MAX, + description = S("Lightseam"), + tiles = { + { + name = "dfcaverns_glowstone_anim.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 8, + }, + }, + }, + is_ground_content = false, + groups = {cracky=3, pickaxey = 1, building_block = 1, material_stone =1}, + sounds = df_dependencies.sound_glass(), + paramtype = "light", + drawtype = "glasslike", + drop = "", + sunlight_propagates = true, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +} +local tnt_boom = df_dependencies.tnt_boom +if tnt_boom then + glowstone_def.on_dig = function(pos, node, digger) + if minetest.node_dig(pos, node, digger) then + tnt_boom(pos, {radius=3}) + end + end +end +minetest.register_node("df_underworld_items:glowstone", glowstone_def) \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/glowing_pit_plasma.lua b/mods/dfcaverns/df_underworld_items/glowing_pit_plasma.lua new file mode 100644 index 0000000..f12af38 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/glowing_pit_plasma.lua @@ -0,0 +1,181 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local lava_source = df_dependencies.node_name_lava_source + +minetest.register_node("df_underworld_items:pit_plasma", { + description = S("Glowing Pit Plasma"), + _doc_items_longdesc = df_underworld_items.doc.pit_plasma_desc, + _doc_items_usagehelp = df_underworld_items.doc.pit_plasma_usage, + tiles = { + { + name = "dfcaverns_pit_plasma.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.5, + }, + }, + }, + + groups={pit_plasma=1, pit_plasma_resistant=1,destroys_items=1, set_on_fire=15, fire_damage=1, liquid=1}, + walkable = false, + pointable = false, + diggable = false, + sunlight_propagates = false, + buildable_to = true, + drop = "", + drowning = 1, + liquid_viscosity = 7, + damage_per_second = 4 * 2, + post_effect_color = {a = 200, r = 245, g = 211, b = 251}, + drawtype="liquid", + liquidtype="source", + liquid_alternative_flowing = "df_underworld_items:pit_plasma_flowing", + liquid_alternative_source = "df_underworld_items:pit_plasma", + liquid_renewable = false, + is_ground_content = false, + light_source = minetest.LIGHT_MAX, + paramtype = "light", + _mcl_blast_resistance = 3600000, + _mcl_hardness = -1, +}) + +minetest.register_node("df_underworld_items:pit_plasma_flowing", { + description = S("Glowing Pit Plasma"), + _doc_items_longdesc = df_underworld_items.doc.pit_plasma_desc, + _doc_items_usagehelp = df_underworld_items.doc.pit_plasma_usage, + tiles = {"dfcaverns_pit_plasma_static.png"}, + special_tiles = { + { + name = "dfcaverns_pit_plasma.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.5, + }, + }, + { + name = "dfcaverns_pit_plasma.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.5, + }, + }, + }, + groups={pit_plasma=1, pit_plasma_resistant=1, not_in_creative_inventory=1,destroys_items=1, set_on_fire=15, fire_damage=1, liquid=1}, + walkable = false, + pointable = false, + diggable = false, + sunlight_propagates = false, + buildable_to = true, + drop = "", + drowning = 1, + liquid_viscosity = 7, + damage_per_second = 4 * 2, + post_effect_color = {a = 200, r = 245, g = 211, b = 251}, + liquidtype = "flowing", + drawtype = "flowingliquid", + paramtype2 = "flowingliquid", + liquid_alternative_flowing = "df_underworld_items:pit_plasma_flowing", + liquid_alternative_source = "df_underworld_items:pit_plasma", + liquid_renewable = false, + is_ground_content = false, + light_source = minetest.LIGHT_MAX, + paramtype = "light", + _mcl_blast_resistance = 3600000, + _mcl_hardness = -1, +}) + +if minetest.get_modpath("radiant_damage") and radiant_damage.override_radiant_damage then + if radiant_damage.config.enable_mese_damage then + radiant_damage.override_radiant_damage("mese", {emitted_by={["group:pit_plasma"] = radiant_damage.config.mese_damage*2}}) + end + if radiant_damage.config.enable_heat_damage then + radiant_damage.override_radiant_damage("heat", {emitted_by={["group:pit_plasma"] = radiant_damage.config.lava_damage}}) + end +end + +local sparkle = function(sparkle_pos) + minetest.add_particlespawner({ + amount = 10, + time = 2, + minpos = {x=sparkle_pos.x-5, y=sparkle_pos.y-0.5, z=sparkle_pos.z-5}, + maxpos = {x=sparkle_pos.x+5, y=sparkle_pos.y+0.5, z=sparkle_pos.z+5}, + minvel = {x=-0.1, y=2, z=-0.1}, + maxvel = {x=0.1, y=2, z=0.1}, + minacc = {x=0, y=2, z=0}, + maxacc = {x=0, y=2, z=0}, + minexptime = 5, + maxexptime = 10, + minsize = 1, + maxsize = 1, + collisiondetection = true, + collision_removal = true, + vertical = false, + glow = minetest.LIGHT_MAX, + texture = "dfcaverns_glowpit_particle.png", + }) + minetest.sound_play({name="dfcaverns_arcing"}, { + pos = sparkle_pos, + gain = 1, + max_hear_distance = 32, + }) +end + +if df_underworld_items.config.destructive_pit_plasma then + minetest.register_abm({ + label = "glowing pit matter degradation", + nodenames = {"group:pit_plasma"}, + neighbors = df_dependencies.abm_pit_plasma_neighbors, + interval = 2, + chance = 30, + catch_up = false, + action = function(pos) + local sparkle_pos + for x = pos.x-1, pos.x+1 do + for y = pos.y-1, pos.y+1 do + for z = pos.z-1, pos.z+1 do + local test_pos = {x=x, y=y, z=z} + local node_name = minetest.get_node(test_pos).name + if minetest.get_item_group(node_name, "pit_plasma_resistant") == 0 then + sparkle_pos = test_pos + if minetest.get_item_group(node_name, "stone") > 0 then + if math.random() < 0.66 then + minetest.set_node(test_pos, {name="df_underworld_items:glow_amethyst"}) + else + minetest.set_node(test_pos, {name=lava_source}) + end + else + minetest.set_node(test_pos, {name="air"}) + end + end + end + end + end + if sparkle_pos then + sparkle(sparkle_pos) + end + end, + }) +end +minetest.register_abm({ + label = "glowing pit sparkle", + nodenames = {"group:pit_plasma"}, + neighbors = {"air"}, + interval = 2, + chance = 30, + catch_up = false, + action = function(pos) + local air_pos = minetest.find_node_near(pos, 1, "air") + if air_pos then + sparkle(air_pos) + end + end, +}) diff --git a/mods/dfcaverns/df_underworld_items/hunter_statue.lua b/mods/dfcaverns/df_underworld_items/hunter_statue.lua new file mode 100644 index 0000000..6068837 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/hunter_statue.lua @@ -0,0 +1,29 @@ +if minetest.get_modpath("hunter_statue") and df_underworld_items.config.underworld_hunter_statues then + + local S = minetest.get_translator(minetest.get_current_modname()) + + hunter_statue.register_hunter_statue("df_underworld_items:hunter_statue", { + description = S("Guardian Statue"), + chance = 2, + tiles = { + { name = "dfcaverns_slade.png", backface_culling = true }, + { name = "dfcaverns_slade.png^(dfcaverns_statue_eyes.png^[opacity:128)", backface_culling = true }, + { name = "dfcaverns_slade.png^(dfcaverns_statue_fang_overlay.png^[opacity:128)", backface_culling = true }, + }, + tnt_vulnerable = true, + tnt_debris = "df_underworld_items:slade_sand", + groups = {hunter_statue = 1, falling_node = 1, immortal = 1}, + hunters_allowed_here = function(pos) + return not minetest.find_node_near(pos, 6, "df_underworld_items:ancient_lantern_slade", true) + end, + other_overrides = { + can_dig = function(pos, player) + if player then + return minetest.check_player_privs(player, "server") + end + return false + end, + } + }) + +end \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/init.lua b/mods/dfcaverns/df_underworld_items/init.lua new file mode 100644 index 0000000..d660e76 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/init.lua @@ -0,0 +1,20 @@ +df_underworld_items = {} + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +dofile(modpath.."/config.lua") +dofile(modpath.."/doc.lua") + +dofile(modpath.."/crystals_amethyst.lua") +dofile(modpath.."/glow_stone.lua") +dofile(modpath.."/slade.lua") +dofile(modpath.."/hunter_statue.lua") +dofile(modpath.."/glowing_pit_plasma.lua") + +dofile(modpath.."/puzzle_seal.lua") +dofile(modpath.."/puzzle_chest.lua") +dofile(modpath.."/ancient_lanterns.lua") +if df_underworld_items.config.enable_slade_drill then + dofile(modpath.."/slade_drill.lua") +end diff --git a/mods/dfcaverns/df_underworld_items/locale/df_underworld_items.de.tr b/mods/dfcaverns/df_underworld_items/locale/df_underworld_items.de.tr new file mode 100644 index 0000000..7031666 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/locale/df_underworld_items.de.tr @@ -0,0 +1,103 @@ +# textdomain: df_underworld_items + + +### ancient_lanterns.lua ### + +Ancient Lantern= + +### crystals_amethyst.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing Amethyst Block=Glühender Amethystblock + +### doc.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.=Hell leuchtende Steine ​​unbekannter Herkunft wurden in den Spalten der Decke der Unterwelt gefunden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing purple crystals that grow through holes in the foundation of the world.=Glühende lila Kristalle, die durch Löcher im Fundament der Welt wachsen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +In fact, Slade is impervious to conventional mining entirely.=Tatsächlich ist Slade für den konventionellen Bergbau völlig undurchlässig. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Slade is extremely hard to work with so it has little use.=Slade ist extrem schwer zu bearbeiten, daher hat es wenig Sinn. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The liquid found in the deepest pits in the underworld is highly dangerous and damaging.=Die Flüssigkeit in den tiefsten Gruben der Unterwelt ist äußerst gefährlich und schädlich. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.=Die einzige Verwendung für dieses Material ist, dass es alles zerstört, was hineingeworfen wird. Es kann nicht anders manipuliert werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The very foundation of the world, Slade is a mysterious ultra-dense substance.=Slade ist das Fundament der Welt und eine mysteriöse, ultradichte Substanz. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These crystals have no known use.=Diese Kristalle haben keine bekannte Verwendung. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These stones are highly volatile and should not be disturbed.=Diese Steine ​​sind sehr flüchtig und sollten nicht gestört werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: "This place is not a place of honor."=Dieser von einer unbekannten Hand geschnitzte Slade-Block ist mit mysteriösen Symbolen versehen. Der größte Teil der Bedeutung der Gravur geht den Nebeln der Zeit verloren, aber ein Frament in der ältesten bekannten Sprache kann übersetzt werden: "Dieser Ort ist kein Ehrenplatz." + +This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.= + +Use this on a target to unleash the energies used to dig through the foundations of the world.= + + +### glow_stone.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Lightseam=Lichtnaht + +### glowing_pit_plasma.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing Pit Plasma=Glühendes Grubenplasma + +### hunter_statue.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Guardian Statue=Wächterstatue + +### puzzle_chest.lua ### + +Puzzle Chest= + +### puzzle_seal.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Active Slade Breacher=Aktiver Slade Breacher +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Breach in the Slade=Brich den Slade ein +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Inscribed Slade Block=Beschrifteter Slade-Block +Slade Capstone= +Slade Puzzle Seal= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Turn=Wende + +### slade.lua ### + +Slade= +Slade Block= +Slade Brick= +Slade Sand= +Slade Seal= +Slade Wall= + +### slade_drill.lua ### + +Slade Drill= + + +##### not used anymore ##### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Slade Block Slab=Slade Block Platte +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Slade Block Stair=Slade Block Treppe +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Slade Slab=Slade-Platte diff --git a/mods/dfcaverns/df_underworld_items/locale/df_underworld_items.it.tr b/mods/dfcaverns/df_underworld_items/locale/df_underworld_items.it.tr new file mode 100644 index 0000000..cc46b35 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/locale/df_underworld_items.it.tr @@ -0,0 +1,91 @@ +# textdomain: df_underworld_items + + +### ancient_lanterns.lua ### + +Ancient Lantern= + +### crystals_amethyst.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing Amethyst Block=Blocco di ametista incandescente + +### doc.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.=Pietre luminose e luminose di origine sconosciuta trovate alloggiate nelle fessure del soffitto del mondo sotterraneo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Glowing purple crystals that grow through holes in the foundation of the world.=Cristalli viola luminosi che crescono attraverso i buchi nelle fondamenta del mondo. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +In fact, Slade is impervious to conventional mining entirely.=In effetti, Slade è completamente impermeabile al mining convenzionale. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Slade is extremely hard to work with so it has little use.=Slade è estremamente difficile da lavorare, quindi è poco utile. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The liquid found in the deepest pits in the underworld is highly dangerous and damaging.=Il liquido trovato nelle fosse più profonde degli inferi è altamente pericoloso e dannoso. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.=L'unico uso di questo materiale è che distrugge tutto ciò che viene gettato al suo interno. Non può essere altrimenti manipolato. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +The very foundation of the world, Slade is a mysterious ultra-dense substance.=Il fondamento stesso del mondo, Slade è una misteriosa sostanza ultra-densa. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These crystals have no known use.=Questi cristalli non hanno alcun uso noto. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +These stones are highly volatile and should not be disturbed.=Queste pietre sono altamente volatili e non dovrebbero essere disturbate. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: "This place is not a place of honor."=Questo blocco di Slade, scolpito da una mano sconosciuta, è inciso con simboli misteriosi. La maggior parte del significato dell'incisione si perde nella notte dei tempi, ma un frammento nella più antica lingua conosciuta può essere tradotto: "Questo posto non è un posto d'onore". + +This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.= + +Use this on a target to unleash the energies used to dig through the foundations of the world.= + + +### glow_stone.lua ### + +Lightseam= + +### glowing_pit_plasma.lua ### + +Glowing Pit Plasma= + +### hunter_statue.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Guardian Statue=Statua del guardiano + +### puzzle_chest.lua ### + +Puzzle Chest= + +### puzzle_seal.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Active Slade Breacher=Attivo Slade Breacher +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Breach in the Slade=Violazione nello Slade +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Inscribed Slade Block=Inscritto Slade Block +Slade Capstone= +Slade Puzzle Seal= +Turn= + +### slade.lua ### + +Slade= +Slade Block= +Slade Brick= +Slade Sand= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Slade Seal=Sigillo Slade +Slade Wall= + +### slade_drill.lua ### + +Slade Drill= diff --git a/mods/dfcaverns/df_underworld_items/locale/template.txt b/mods/dfcaverns/df_underworld_items/locale/template.txt new file mode 100644 index 0000000..200eb9f --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/locale/template.txt @@ -0,0 +1,75 @@ +# textdomain: df_underworld_items + + +### ancient_lanterns.lua ### + +Ancient Lantern= + +### crystals_amethyst.lua ### + +Glowing Amethyst Block= + +### doc.lua ### + +Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.= + +Glowing purple crystals that grow through holes in the foundation of the world.= + +In fact, Slade is impervious to conventional mining entirely.= + +Slade is extremely hard to work with so it has little use.= + +The liquid found in the deepest pits in the underworld is highly dangerous and damaging.= + +The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.= + +The very foundation of the world, Slade is a mysterious ultra-dense substance.= + +These crystals have no known use.= + +These stones are highly volatile and should not be disturbed.= + +This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: "This place is not a place of honor."= + +This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.= + +Use this on a target to unleash the energies used to dig through the foundations of the world.= + + +### glow_stone.lua ### + +Lightseam= + +### glowing_pit_plasma.lua ### + +Glowing Pit Plasma= + +### hunter_statue.lua ### + +Guardian Statue= + +### puzzle_chest.lua ### + +Puzzle Chest= + +### puzzle_seal.lua ### + +Active Slade Breacher= +Breach in the Slade= +Inscribed Slade Block= +Slade Capstone= +Slade Puzzle Seal= +Turn= + +### slade.lua ### + +Slade= +Slade Block= +Slade Brick= +Slade Sand= +Slade Seal= +Slade Wall= + +### slade_drill.lua ### + +Slade Drill= diff --git a/mods/dfcaverns/df_underworld_items/mod.conf b/mods/dfcaverns/df_underworld_items/mod.conf new file mode 100644 index 0000000..b55a106 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/mod.conf @@ -0,0 +1,4 @@ +name = df_underworld_items +description = Various node types used by the dfcaverns mapgen mod for its underworld layer. +depends = df_dependencies +optional_depends = doc, radiant_damage, mesecons_mvps, hunter_statue diff --git a/mods/dfcaverns/df_underworld_items/models/LICENSE.txt b/mods/dfcaverns/df_underworld_items/models/LICENSE.txt new file mode 100644 index 0000000..f7064b9 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/models/LICENSE.txt @@ -0,0 +1,142 @@ +dfcaverns_open_chest.obj is copied from minetest_game's default mod, whose media license doesn't specify who in particular created it. The media license for the default mod is as follows: + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2018: + + celeron55, Perttu Ahola + Cisoun + G4JC + VanessaE + RealBadAngel + Calinou + MirceaKitsune + Jordach + PilzAdam + jojoa1997 + InfinityProject + Splizard + Zeg9 + paramat + BlockMen + sofar + Neuromancer + Gambit + asl97 + KevDoy + Mito551 + GreenXenith + kaeza + kilbith + tobyplowy + CloudyProton + TumeniNodes + Mossmanikin + random-geek + Extex101 + An0n3m0us + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) + +Copyright (C) 2009 cmusounddesign +Copyright (C) 2010 Tomlija +Copyright (C) 2010 lsprice +Copyright (C) 2014 sonictechtonic +Copyright (C) 2015 yadronoff +Copyright (C) 2007 HerbertBoland +Copyright (C) 2006 AGFX + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + +Iwan Gabovitch +Ottomaani138 +Ogrebane +blukotek +Sevin7 +Yoyodaman234 +Ryding + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/models/dfcaverns_chest_open.obj b/mods/dfcaverns/df_underworld_items/models/dfcaverns_chest_open.obj new file mode 100644 index 0000000..72ba175 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/models/dfcaverns_chest_open.obj @@ -0,0 +1,79 @@ +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' +# www.blender.org +o Top_Cube.002_None_Top_Cube.002_None_bottom +v -0.500000 0.408471 0.720970 +v -0.500000 1.115578 0.013863 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 +v 0.500000 1.115578 0.013863 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top +s off +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/mods/dfcaverns/df_underworld_items/models/underworld_capstone.obj b/mods/dfcaverns/df_underworld_items/models/underworld_capstone.obj new file mode 100644 index 0000000..fd987cc --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/models/underworld_capstone.obj @@ -0,0 +1,34 @@ +# Blender v2.81 (sub 16) OBJ File: 'capstone.blend' +# www.blender.org +mtllib underworld_capstone.mtl +o Cube +v 0.000000 0.500000 0.000000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.4472 0.8944 +vn -0.8944 0.4472 0.0000 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 -0.8944 +g Cube_Cube_Material +usemtl Material +s off +f 2/1/1 5/2/1 4/3/1 +f 2/1/1 3/4/1 5/2/1 +g Cube_Cube_side +usemtl side +f 3/4/2 1/5/2 5/2/2 +f 5/2/3 1/5/3 4/6/3 +f 2/7/4 1/5/4 3/8/4 +f 4/9/5 1/5/5 2/7/5 diff --git a/mods/dfcaverns/df_underworld_items/models/underworld_seal.obj b/mods/dfcaverns/df_underworld_items/models/underworld_seal.obj new file mode 100644 index 0000000..1abb6da --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/models/underworld_seal.obj @@ -0,0 +1,386 @@ +# Blender v2.81 (sub 16) OBJ File: 'seal.blend' +# www.blender.org +mtllib underworld_seal.mtl +o Cylinder +v -0.292175 -0.501653 -0.705374 +v -0.292175 0.501653 -0.705374 +v 0.292175 -0.501653 -0.705374 +v 0.292175 0.501653 -0.705374 +v 0.705374 -0.501653 -0.292175 +v 0.705374 0.501653 -0.292175 +v 0.705374 -0.501653 0.292175 +v 0.705374 0.501653 0.292175 +v 0.292175 -0.501653 0.705374 +v 0.292175 0.501653 0.705374 +v -0.292175 -0.501653 0.705374 +v -0.292175 0.501653 0.705374 +v -0.705374 -0.501653 0.292175 +v -0.705374 0.501653 0.292175 +v -0.705374 -0.501653 -0.292175 +v -0.705374 0.501653 -0.292175 +v -0.146088 -0.752480 -0.352687 +v 0.146088 -0.752480 -0.352687 +v 0.146088 0.752480 -0.352687 +v -0.146088 0.752480 -0.352687 +v 0.352687 -0.752480 -0.146088 +v 0.352687 0.752480 -0.146088 +v 0.352687 -0.752480 0.146088 +v 0.352687 0.752480 0.146088 +v 0.146088 -0.752480 0.352687 +v 0.146088 0.752480 0.352687 +v -0.146088 -0.752480 0.352687 +v -0.146088 0.752480 0.352687 +v -0.352687 -0.752480 0.146088 +v -0.352687 0.752480 0.146088 +v -0.352687 -0.752480 -0.146088 +v -0.352687 0.752480 -0.146088 +v -0.000000 0.501653 -0.705374 +v 0.498774 0.501653 -0.498774 +v 0.705374 0.501653 0.000000 +v 0.498774 0.501653 0.498774 +v -0.000000 0.501653 0.705374 +v -0.498775 0.501653 0.498775 +v -0.705374 0.501653 0.000000 +v -0.498775 0.501653 -0.498774 +v -0.093326 0.852022 -0.690234 +v -0.000000 -0.501653 -0.705374 +v 0.498774 -0.501653 -0.498774 +v 0.705374 -0.501653 0.000000 +v 0.498774 -0.501653 0.498774 +v -0.000000 -0.501653 0.705374 +v -0.498775 -0.501653 0.498775 +v -0.705374 -0.501653 0.000000 +v -0.498775 -0.501653 -0.498774 +v -0.000000 -0.501653 -0.705374 +v 0.292175 -0.501653 -0.705374 +v 0.292175 -0.501653 -0.705374 +v -0.000000 0.501653 -0.705374 +v -0.292175 0.501653 -0.705374 +v -0.292175 0.501653 -0.705374 +v -0.292175 -0.501653 -0.705374 +v -0.292175 -0.501653 -0.705374 +v 0.292175 0.501653 -0.705374 +v 0.292175 0.501653 -0.705374 +v 0.498774 -0.501653 -0.498774 +v 0.705374 -0.501653 -0.292175 +v 0.705374 -0.501653 -0.292175 +v 0.498774 0.501653 -0.498774 +v 0.705374 0.501653 -0.292175 +v 0.705374 0.501653 -0.292175 +v 0.705374 -0.501653 0.000000 +v 0.705374 -0.501653 0.292175 +v 0.705374 -0.501653 0.292175 +v 0.705374 0.501653 0.000000 +v 0.705374 0.501653 0.292175 +v 0.705374 0.501653 0.292175 +v 0.498774 -0.501653 0.498774 +v 0.292175 -0.501653 0.705374 +v 0.292175 -0.501653 0.705374 +v 0.498774 0.501653 0.498774 +v 0.292175 0.501653 0.705374 +v 0.292175 0.501653 0.705374 +v -0.000000 -0.501653 0.705374 +v -0.292175 -0.501653 0.705374 +v -0.292175 -0.501653 0.705374 +v -0.000000 0.501653 0.705374 +v -0.292175 0.501653 0.705374 +v -0.292175 0.501653 0.705374 +v -0.498775 -0.501653 0.498775 +v -0.705374 -0.501653 0.292175 +v -0.705374 -0.501653 0.292175 +v -0.498775 0.501653 0.498775 +v -0.705374 0.501653 0.292175 +v -0.705374 0.501653 0.292175 +v -0.705374 -0.501653 0.000000 +v -0.705374 -0.501653 -0.292175 +v -0.705374 -0.501653 -0.292175 +v -0.705374 0.501653 0.000000 +v -0.705374 0.501653 -0.292175 +v -0.705374 0.501653 -0.292175 +v -0.498775 -0.501653 -0.498774 +v -0.498775 0.501653 -0.498774 +v -0.146088 -0.752480 -0.352687 +v 0.146088 -0.752480 -0.352687 +v 0.146088 0.752480 -0.352687 +v -0.146088 0.752480 -0.352687 +v 0.352687 -0.752480 -0.146088 +v 0.352687 0.752480 -0.146088 +v 0.352687 -0.752480 0.146088 +v 0.352687 0.752480 0.146088 +v 0.146088 -0.752480 0.352687 +v 0.146088 0.752480 0.352687 +v -0.146088 -0.752480 0.352687 +v -0.146088 0.752480 0.352687 +v -0.352687 -0.752480 0.146088 +v -0.352687 0.752480 0.146088 +v -0.352687 -0.752480 -0.146088 +v -0.352687 0.752480 -0.146088 +vt 0.500000 1.000000 +vt 0.250000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 0.250000 1.000000 +vt 0.250000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 1.250000 0.000000 +vt 1.250000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.000000 +vt 0.500000 1.000000 +vt 0.750000 1.000000 +vt 1.250000 0.000000 +vt 1.250000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 1.250000 0.000000 +vt 1.250000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 1.250000 0.000000 +vt 1.250000 1.000000 +vt 0.750000 1.000000 +vt 0.000000 0.292893 +vt 0.707106 0.000000 +vt 1.000000 0.707107 +vt 1.000000 0.292893 +vt 0.292893 0.000000 +vt 0.000000 0.707106 +vt 0.707107 1.000000 +vt 0.292893 1.000000 +vt 0.000000 0.707106 +vt 0.292893 0.000000 +vt 1.000000 0.292893 +vt 0.292893 1.000000 +vt 0.707107 1.000000 +vt 1.000000 0.707107 +vt 0.707106 0.000000 +vt 0.000000 0.292893 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.7071 0.0000 0.7071 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.4098 -0.8149 -0.4098 +vn 0.4098 0.8149 0.4098 +vn -0.5796 -0.8149 0.0000 +vn 0.4098 0.8149 -0.4098 +vn -0.5796 0.8149 0.0000 +vn 0.0000 -0.8149 0.5796 +vn 0.0000 0.8149 0.5796 +vn 0.5796 -0.8149 0.0000 +vn -0.4098 -0.8149 -0.4098 +vn 0.0000 -0.8149 -0.5796 +vn 0.5796 0.8149 0.0000 +vn -0.4098 0.8149 -0.4098 +vn 0.0000 0.8149 -0.5796 +vn -0.4098 -0.8149 0.4098 +vn -0.4098 0.8149 0.4098 +vn 0.4098 -0.8149 0.4098 +g Cylinder_Cylinder_Sides +usemtl Sides +s off +f 53/1/1 51/2/1 50/3/1 +f 63/4/2 61/5/2 60/6/2 +f 70/7/3 67/8/3 66/9/3 +f 75/10/4 73/11/4 72/12/4 +f 81/13/5 79/14/5 78/15/5 +f 87/16/6 85/17/6 84/18/6 +f 93/19/7 91/20/7 90/21/7 +f 97/22/8 57/23/8 96/24/8 +f 50/3/1 56/25/1 54/26/1 +f 53/1/1 58/27/1 51/2/1 +f 50/3/1 54/26/1 53/1/1 +f 60/6/2 3/28/2 59/29/2 +f 63/4/2 64/30/2 61/5/2 +f 60/6/2 59/29/2 63/4/2 +f 66/9/3 5/31/3 69/32/3 +f 5/31/3 65/33/3 69/32/3 +f 69/32/3 70/7/3 66/9/3 +f 72/12/4 7/34/4 71/35/4 +f 75/10/4 76/36/4 73/11/4 +f 72/12/4 71/35/4 75/10/4 +f 78/15/5 9/37/5 77/38/5 +f 81/13/5 82/39/5 79/14/5 +f 78/15/5 77/38/5 81/13/5 +f 84/18/6 11/40/6 83/41/6 +f 87/16/6 88/42/6 85/17/6 +f 84/18/6 83/41/6 87/16/6 +f 90/21/7 13/43/7 89/44/7 +f 93/19/7 94/45/7 91/20/7 +f 90/21/7 89/44/7 93/19/7 +f 96/24/8 15/46/8 95/47/8 +f 97/22/8 2/48/8 57/23/8 +f 96/24/8 95/47/8 97/22/8 +g Cylinder_Cylinder_Caps +usemtl Caps +f 111/49/9 26/50/9 103/51/9 +f 104/52/10 108/53/10 112/54/10 +f 103/51/9 100/55/9 111/49/9 +f 100/55/9 101/56/9 111/49/9 +f 101/56/9 113/57/9 111/49/9 +f 111/49/9 109/58/9 26/50/9 +f 26/50/9 105/59/9 103/51/9 +f 112/54/10 98/60/10 99/61/10 +f 99/61/10 21/62/10 104/52/10 +f 104/52/10 106/63/10 108/53/10 +f 108/53/10 110/64/10 112/54/10 +f 112/54/10 99/61/10 104/52/10 +g Cylinder_Cylinder_Edges +usemtl Edges +f 43/65/11 102/66/11 18/67/11 +f 36/68/12 24/69/12 107/70/12 +f 48/71/13 31/72/13 29/73/13 +f 34/74/14 19/75/14 22/76/14 +f 39/77/15 30/78/15 32/79/15 +f 46/80/16 27/81/16 25/82/16 +f 37/83/17 107/84/17 28/85/17 +f 44/86/18 23/87/18 102/88/18 +f 49/89/19 17/90/19 31/91/19 +f 42/92/20 18/93/20 17/94/20 +f 35/95/21 22/96/21 24/97/21 +f 40/98/22 32/99/22 20/100/22 +f 33/101/23 20/102/23 19/103/23 +f 47/104/24 29/105/24 27/106/24 +f 38/107/25 28/108/25 30/109/25 +f 45/110/26 25/111/26 23/112/26 +f 107/70/12 10/113/12 36/68/12 +f 36/68/12 8/114/12 24/69/12 +f 22/76/14 6/115/14 34/74/14 +f 34/74/14 4/116/14 19/75/14 +f 32/79/15 16/117/15 39/77/15 +f 39/77/15 14/118/15 30/78/15 +f 28/85/17 12/119/17 37/83/17 +f 37/83/17 10/120/17 107/84/17 +f 24/97/21 8/121/21 35/95/21 +f 35/95/21 6/122/21 22/96/21 +f 20/100/22 55/123/22 40/98/22 +f 40/98/22 16/124/22 32/99/22 +f 19/103/23 4/125/23 33/101/23 +f 33/101/23 55/126/23 20/102/23 +f 30/109/25 14/127/25 38/107/25 +f 38/107/25 12/128/25 28/108/25 +f 18/67/11 52/129/11 43/65/11 +f 43/65/11 62/130/11 102/66/11 +f 29/73/13 86/131/13 48/71/13 +f 48/71/13 92/132/13 31/72/13 +f 25/82/16 74/133/16 46/80/16 +f 46/80/16 80/134/16 27/81/16 +f 102/88/18 62/135/18 44/86/18 +f 44/86/18 68/136/18 23/87/18 +f 31/91/19 92/137/19 49/89/19 +f 49/89/19 1/138/19 17/90/19 +f 17/94/20 1/139/20 42/92/20 +f 42/92/20 52/140/20 18/93/20 +f 27/106/24 80/141/24 47/104/24 +f 47/104/24 86/142/24 29/105/24 +f 23/112/26 68/143/26 45/110/26 +f 45/110/26 74/144/26 25/111/26 diff --git a/mods/dfcaverns/df_underworld_items/puzzle_chest.lua b/mods/dfcaverns/df_underworld_items/puzzle_chest.lua new file mode 100644 index 0000000..2579f98 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/puzzle_chest.lua @@ -0,0 +1,172 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local sum_square = function(input) + return {input[1] + input[2], input[3] + input[4], input[1] + input[3], input[2] + input[4]} +end + +local initialize = function(pos, meta) + if not meta:contains("key") then + local inv = meta:get_inventory() + inv:set_size("main", 8) + local next_seed = math.random() * 2^21 + math.randomseed(pos.x + pos.y^8 + pos.z^16) + -- Key is consistent with location + local key = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7)} + math.randomseed(next_seed) + local state = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7)} + local key_sum = sum_square(key) + local state_sum = sum_square(state) + if (key_sum[1] == state_sum[1] and key_sum[2] == state_sum[2] and key_sum[3] == state_sum[3] and key_sum[4] == state_sum[4]) then + -- if we randomly start off solved change one of the states to make it unsolved. + -- lucky player gets an easy one. + state[1] = (state[1] + 1) % 8 + end + meta:set_string("key", minetest.serialize(key)) + meta:set_string("state", minetest.serialize(state)) + meta:mark_as_private("key") + meta:mark_as_private("state") -- not really necessary, but for consistency + end +end + +-- 1 2 +-- 3 4 + +local formspec_dial = function(identifier, state) + return "image[0.5,0;2,1;dfcaverns_chest_dial_"..tostring(state)..".png]" + .. "button[0,0.25;0.5,0.5;"..identifier.."+;<]" + .. "button[2.5,0.25;0.5,0.5;"..identifier.."-;>]" +end + +local formspec_bar = function(horizontal, state, key) + if horizontal then + return "box[0,0;".. tostring(key/14 * 2 + 0.1) ..",1;#222222ff]box[0.1,0.1;".. tostring(state/14 * 2)..",0.85;#ff00ff44]" + end + return "box[0,0;1,".. tostring(key/14 * 2 + 0.1) ..";#222222ff]box[0.1,0.1;0.85,".. tostring(state/14 * 2)..";#ff00ff44]" +end + +local prefix = "df_underworld_items:puzzle_chest" +local prefix_len = string.len("df_underworld_items:puzzle_chest") + +local itemslot_bg = df_dependencies.get_itemslot_bg_padded + +local show_formspec = function(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + initialize(pos, meta) + local key = minetest.deserialize(meta:get_string("key")) + local state = minetest.deserialize(meta:get_string("state")) + local key_sum = sum_square(key) + local state_sum = sum_square(state) + local solved = key_sum[1] == state_sum[1] and key_sum[2] == state_sum[2] and key_sum[3] == state_sum[3] and key_sum[4] == state_sum[4] + local playername = clicker:get_player_name() + local formname = prefix .. minetest.pos_to_string(pos) + local formspec = "formspec_version[6]" + .. "size[11,12]" + .. "container[1.5,0.5]" + .. "container[0,0]" .. formspec_dial("dial1", state[1]) .. "container_end[]" + .. "container[3,0]" .. formspec_dial("dial2", state[2]) .. "container_end[]" + .. "container[0,1.5]" .. formspec_dial("dial3", state[3]) .. "container_end[]" + .. "container[3,1.5]" .. formspec_dial("dial4", state[4]) .. "container_end[]" + .. "container[6.1,0]" .. formspec_bar(true, state_sum[1], key_sum[1]) .. "container_end[]" + .. "container[6.1,1.5]" .. formspec_bar(true, state_sum[2], key_sum[2]) .. "container_end[]" + .. "container[1,2.75]" .. formspec_bar(false, state_sum[3], key_sum[3]) .. "container_end[]" + .. "container[4,2.75]" .. formspec_bar(false, state_sum[4], key_sum[4]) .. "container_end[]" + .. "container_end[]" + .. itemslot_bg(0.6,6.7,8,4,0.25) + .. "list[current_player;main;0.6,6.7;8,4;]" + if solved then + local nodemeta = "nodemeta:"..pos.x..","..pos.y..","..pos.z + formspec = formspec + .. itemslot_bg(0.6,5.4,8,1,0.25) + .. "list["..nodemeta..";main;0.6,5.4;8,1;]" + .. "listring[]" + if meta:get_string("solved") ~= "true" then + minetest.sound_play("dfcaverns_puzzle_chest_open", {pos = pos}) + meta:set_string("solved", "true") + local old_node = minetest.get_node(pos) + minetest.swap_node(pos, {name="df_underworld_items:puzzle_chest_opened", param2=old_node.param2}) + end + elseif meta:get_string("solved") == "true" then + minetest.sound_play("dfcaverns_puzzle_chest_close", {pos = pos}) + meta:set_string("solved", "") + local old_node = minetest.get_node(pos) + minetest.swap_node(pos, {name="df_underworld_items:puzzle_chest_closed", param2=old_node.param2}) + end + + minetest.show_formspec(playername, formname, formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if string.sub(formname, 1, prefix_len) ~= prefix then return end + if fields.quit then return end + local pos = minetest.string_to_pos(string.sub(formname, prefix_len+1, -1)) + local meta = minetest.get_meta(pos) + local state = minetest.deserialize(meta:get_string("state")) + for i = 1,4 do + if fields["dial"..tostring(i).."+"] then + state[i] = (state[i] + 1) % 8 + break + elseif fields["dial"..tostring(i).."-"] then + state[i] = (state[i] - 1) % 8 + break + end + end + meta:set_string("state", minetest.serialize(state)) + show_formspec(pos, nil, player) +end) + +local puzzle_chest_can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + initialize(pos, meta) + local inv = meta:get_inventory() + return inv:is_empty("main") +end + +minetest.register_node("df_underworld_items:puzzle_chest_closed", { + description = S("Puzzle Chest"), + _doc_items_longdesc = df_underworld_items.doc.puzzle_chest_desc, + _doc_items_usagehelp = df_underworld_items.doc.puzzle_chest_usage, + tiles = { + "dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png", + "dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png", + "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", + "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", + "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", + "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png^dfcaverns_chest_lock_plate.png^dfcaverns_chest_lock_colours.png", + }, + paramtype2="facedir", + is_ground_content = false, + groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + + on_rightclick = show_formspec, + can_dig = puzzle_chest_can_dig, +}) + +minetest.register_node("df_underworld_items:puzzle_chest_opened", { + description = S("Puzzle Chest"), + _doc_items_longdesc = df_underworld_items.doc.puzzle_chest_desc, + _doc_items_usagehelp = df_underworld_items.doc.puzzle_chest_usage, + tiles = { + {name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png", backface_culling = true}, + {name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png", backface_culling = true}, + {name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", backface_culling = true}, + {name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", backface_culling = true}, + {name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png^dfcaverns_chest_lock_plate.png^dfcaverns_chest_lock_colours.png", backface_culling = true}, + {name = "([combine:16x32:0,0=dfcaverns_slade_block.png:0,16=dfcaverns_slade_block.png)^dfcaverns_chest_mask_interior.png", backface_culling = true}, + }, + is_ground_content = false, + mesh = "dfcaverns_chest_open.obj", + drawtype= "mesh", + visual = "mesh", + paramtype2="facedir", + groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, building_block=1, material_stone=1, not_in_creative_inventory=1}, + drop = "df_underworld_items:puzzle_chest_closed", + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + + on_rightclick = show_formspec, + can_dig = puzzle_chest_can_dig, +}) diff --git a/mods/dfcaverns/df_underworld_items/puzzle_seal.lua b/mods/dfcaverns/df_underworld_items/puzzle_seal.lua new file mode 100644 index 0000000..28cd619 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/puzzle_seal.lua @@ -0,0 +1,585 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local named_waypoints_path = minetest.get_modpath("named_waypoints") + +-- override these to allow achievements to be recorded without requiring a dependency +df_underworld_items.slade_breacher_triggered = function(pos, player) end +df_underworld_items.puzzle_seal_solved = function(pos, player) end -- player can be nil + +local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode") + +local can_dig +if invulnerable then + can_dig = function(pos, player) + return minetest.check_player_privs(player, "server") + end +end + +local slade_mcl_blast_resistance = 1200 +local slade_mcl_hardness = 50 +local slade_groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, not_in_creative_inventory=1,creative_breakable=1, building_block=1, material_stone=1} +if invulnerable then + slade_groups.immortal = 1 + slade_mcl_blast_resistance = 3600000 + slade_mcl_hardness = -1 +end + +local lava_source = df_dependencies.node_name_lava_source + +-- Ensures that the node is functioning correctly +local ensure_meta = function(pos) + local meta = minetest.get_meta(pos) + if not meta:contains("key") then + local inv = meta:get_inventory() + inv:set_size("main", 8) + local next_seed = math.random() * 2^21 + math.randomseed(pos.x + pos.z^16) + -- Key is consistent with location + local key = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7),math.random(0,7), math.random(0,7)} + math.randomseed(next_seed) + meta:set_string("key", minetest.serialize(key)) + meta:mark_as_private("key") + end + + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(4) + end +end + +local colour_groups = { + {"color_black", "basecolor_black", "excolor_black", "excolor_darkgrey", "color_dark_grey"}, -- 0 + {"color_red", "basecolor_red", "excolor_red"}, -- 1 + {"color_orange", "basecolor_orange", "excolor_orange"}, -- 2 + {"color_yellow", "basecolor_yellow", "excolor_yellow"}, -- 3 + {"color_green", "basecolor_green", "excolor_green", "excolor_lime", "color_dark_green"}, -- 4 + {"color_blue", "basecolor_blue", "excolor_blue", "excolor_sky_blue"}, -- 5 + {"color_violet", "excolor_violet",}, -- 6 + {"color_white", "basecolor_white", "excolor_white", "excolor_lightgrey", "color_grey"}, -- 7 +} + +df_underworld_items.colour_items = {} + +local cull_colour_groups = function() + local culled_colour_groups = {} + for _, groups in ipairs(colour_groups) do + local new_set = {} + for _, colour_group in pairs(groups) do + for itemname, def in pairs(minetest.registered_items) do + if minetest.get_item_group(itemname, colour_group) ~= 0 then + table.insert(new_set, colour_group) + break + end + end + end + assert(#new_set > 0, "Unsolvable puzzle seals due to lack of any registered items belonging to one of " .. dump(groups)) + table.insert(culled_colour_groups, new_set) + end + colour_groups = culled_colour_groups + + -- collect a list of all items with useful colour groups + -- to be used for treasure generation + local colour_item_set = {} + for itemname, def in pairs(minetest.registered_items) do + for _, groups in ipairs(colour_groups) do + for _, colour in ipairs(groups) do + if minetest.get_item_group(itemname, colour) ~= 0 then + colour_item_set[itemname] = true + end + end + end + end + for colour_item, _ in pairs(colour_item_set) do + table.insert(df_underworld_items.colour_items, colour_item) + end +end +minetest.after(0, cull_colour_groups) + +local item_represents_number = function(itemname, number) + for _, group in pairs(colour_groups[number+1]) do + if minetest.get_item_group(itemname, group) ~= 0 then + return true + end + end + return false +end + +local test_key = function(pos, player) + local meta = minetest.get_meta(pos) + if not meta:contains("key") then + return false + end + + local keystring = meta:get_string("key") + local key = minetest.deserialize(keystring) + local inv = meta:get_inventory() + for offset = 0, 7 do + local valid + for i = 0, 7 do + valid = true + local keyval = (i + offset) % 8 + 1 + local item = inv:get_stack("main", i+1) + if not item_represents_number(item:get_name(), key[keyval]) then + valid = false + break + end + end + if valid then + local unlocked = meta:get_int("unlocked") + if unlocked == 0 then + df_underworld_items.puzzle_seal_solved(pos, player) + meta:set_int("unlocked", 1) + end + return true + end + end + meta:set_int("unlocked", 0) + return false +end + + +--We were a powerful culture. +--This place is not a place of honor. +--No esteemed deed is commemorated here. +--What is here is dangerous and repulsive. +--This message is a warning about danger. +--The danger is still present. +--The danger is unleashed if you disturb this place. +--This place is best shunned and left uninhabited. + +local formspec_prefix = "df_underworld_items_puzzle_seal:" +local itemslot_bg = df_dependencies.get_itemslot_bg +local get_formspec = function(pos, unlocked) + local formspec = + "size[8,8]" + .."image[0,0;2.5,4;dfcaverns_puzzle_inscription_background.png^dfcaverns_puzzle_inscription_1.png]" + .."image[5.8,0;2.5,4;dfcaverns_puzzle_inscription_background.png^[transformR180^dfcaverns_puzzle_inscription_2.png]" + .."container[2.25,0]" + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0.25,0.25;1,1;0]" + ..itemslot_bg(0.25,0.25,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1.25,0;1,1;1]" + ..itemslot_bg(1.25,0,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.25,0.25;1,1;2]" + ..itemslot_bg(2.25,0.25,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.5,1.25;1,1;3]" + ..itemslot_bg(2.5,1.25,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.25,2.25;1,1;4]" + ..itemslot_bg(2.25,2.25,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1.25,2.5;1,1;5]" + ..itemslot_bg(1.25,2.5,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0.25,2.25;1,1;6]" + ..itemslot_bg(0.25,2.25,1,1) + .."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,1.25;1,1;7]" + ..itemslot_bg(0,1.25,1,1) + if unlocked then + formspec = formspec .. "image_button[1.25,1.25;1,1;dfcaverns_seal.png;open;"..S("Turn").."]" + else + formspec = formspec .. "image[1.25,1.25;1,1;dfcaverns_seal.png]" + end + + formspec = formspec + .."container_end[]" +-- .."container[5,0.5]" +-- .."box[0,0;1,5;#0A0000]box[0.1,0.1;0.8,4.8;#000000]box[0.1," .. 0.1 + 4.8*completion ..";0.8,".. 4.8*completion ..";#FFCC22]" +-- .."container_end[]" + .."container[0,4]list[current_player;main;0,0;8,1;]listring[]" + ..itemslot_bg(0,0,8,1) + .."list[current_player;main;0,1.25;8,3;8]" + ..itemslot_bg(0,1.25,8,3) + .."container_end[]" + return formspec +end +local refresh_formspec = function(pos, player) + local player_name = player:get_player_name() + local unlocked = test_key(pos, player) + local formspec = get_formspec(pos, unlocked) + minetest.show_formspec(player_name, formspec_prefix..minetest.pos_to_string(pos), formspec) +end + +local show_key = function(pos, index) + minetest.sound_play("dfcaverns_seal_key", { + pos = pos, + gain = 0.125, + max_hear_distance = 32, + }) + local meta = minetest.get_meta(pos) + local keystring = meta:get_string("key") + local key = minetest.deserialize(keystring) + --minetest.chat_send_all(keystring) + local minpos = vector.add(pos, {x=-1, y=1, z=-1}) + local maxpos = vector.add(pos, {x=1, y=3, z=1}) + minetest.add_particlespawner({ + amount = key[index+1], + time = 0.5, + minpos = minpos, + maxpos = maxpos, + minvel = {x=-0.25, y=0, z=-0.25}, + maxvel = {x=0.25, y=0.25, z=0.25}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 3, + maxexptime = 3, + minsize = 1, + maxsize = 1, + texture = "dfcaverns_puzzle_particle.png", + glow = 8, + }) +end + +local show_unlocked = function(pos, global) + -- Plays globally. This is deliberate. + if global then + minetest.sound_play("dfcaverns_seal_unlocked", {}) + else + minetest.sound_play("dfcaverns_seal_unlocked", {pos = pos, max_hear_distance = 128,}) + end + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=1, z=0}, + expirationtime = 30, + size = 20, + texture = "dfcaverns_seal.png^[invert:rgb^[brighten", + glow = 15, +-- vertical = true, + }) +end + +local puzzle_seal_def = { + description = S("Slade Puzzle Seal"), + _doc_items_longdesc = nil, + _doc_items_usagehelp = nil, + drawtype = "mesh", + mesh = "underworld_seal.obj", + tiles = {"dfcaverns_slade_block.png", "dfcaverns_slade_block.png^dfcaverns_seal.png", "dfcaverns_slade_block.png^(dfcaverns_inscription_1.png^[opacity:128)"}, + paramtype = "light", + paramtype2 = "facedir", + light_source = 8, + groups = slade_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + selection_box = { + type = "fixed", + fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625}, + }, + collision_box = { + type = "fixed", + fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625}, + }, + is_ground_content = false, + can_dig = can_dig, + _mcl_blast_resistance = slade_mcl_blast_resistance, + _mcl_hardness = slade_mcl_hardness, + on_blast = function() end, + on_rotate = function() return false end, + on_construct = function(pos) + ensure_meta(pos) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + ensure_meta(pos) + refresh_formspec(pos, clicker) + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local unlocked = meta:get_int("unlocked") + if unlocked > 0 then + meta:set_int("unlocked", unlocked + 1) + show_unlocked(pos, unlocked <= 13) + else + local index = meta:get_int("key_index") + show_key(pos, index) + meta:set_int("key_index", (index+1) % 8) + end + minetest.get_node_timer(pos):start(4) + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + refresh_formspec(pos, player) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + refresh_formspec(pos, player) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + refresh_formspec(pos, player) + end, +} + + +minetest.register_node("df_underworld_items:puzzle_seal", puzzle_seal_def) + +-------------------------------------------------------------------------------- +-- Once the seal is opened, it turns into this and digs its way down through the slade. + +local tnt_boom = df_dependencies.tnt_boom + +local digging_seal_def = { + description = S("Active Slade Breacher"), + _doc_items_longdesc = nil, + _doc_items_usagehelp = nil, + drawtype = "mesh", + mesh = "underworld_seal.obj", + tiles = {"dfcaverns_pit_plasma_static.png", "dfcaverns_pit_plasma_static.png^dfcaverns_seal.png", "dfcaverns_pit_plasma_static.png"}, + paramtype = "light", + paramtype2 = "facedir", + light_source = minetest.LIGHT_MAX, + groups = {immortal=1, stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, not_in_creative_inventory=1,building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + selection_box = { + type = "fixed", + fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625}, + }, + collision_box = { + type = "fixed", + fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625}, + }, + is_ground_content = false, + _mcl_blast_resistance = 3600000, + _mcl_hardness = -1, + can_dig = can_dig, + on_blast = function() end, + on_rotate = function() return false end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(0) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + local below_node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if below_node.name == "ignore" then + -- map's not loaded below, try again later + minetest.get_node_timer(pos):start(4) + return + end + + minetest.sound_play("dfcaverns_massive_digging", { + pos = pos, + gain = 1.0, + max_hear_distance = 32, + }) + + local minpos = vector.add(pos, {x=0, y=-1, z=0}) + minetest.add_particlespawner({ + amount = 100, + time = 4, + minpos = minpos, + maxpos = minpos, + minvel = {x=-5, y=0, z=-5}, + maxvel = {x=5, y=20, z=5}, + minacc = {x=0, y=-10, z=0}, + maxacc = {x=0, y=-10, z=0}, + minexptime = 5, + maxexptime = 15, + minsize = 1, + maxsize = 5, + texture = "dfcaverns_glowpit_particle.png", + collisiondetection = true, + collision_removal = true, + glow = 15, + }) + + if minetest.get_item_group(below_node.name, "slade") == 0 then + if df_underworld_items.config.enable_slade_drill then + minetest.set_node(pos, {name="air"}) + if tnt_boom then + tnt_boom({x=pos.x, y=pos.y-2, z=pos.z}, {radius=3}) + end + minetest.add_item(pos, "df_underworld_items:slade_drill") + else + minetest.set_node(pos, {name=lava_source}) + end + return + end + + local rot = node.param2 + if rot == 0 then + minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 0, {}, true) + node.param2 = 1 + elseif rot == 1 then + minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 90, {}, true) + node.param2 = 2 + elseif rot == 2 then + minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 180, {}, true) + node.param2 = 3 + elseif rot == 3 then + minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 270, {}, true) + node.param2 = 0 + else + if tnt_boom then + tnt_boom(pos, {radius=3}) + end + minetest.set_node(pos, {name=lava_source}) + return + end + minetest.set_node(pos, {name="air"}) + local newpos = {x=pos.x, y=pos.y-2, z=pos.z} + minetest.set_node(newpos, node) + minetest.get_node_timer(newpos):start(4) + end, +} + +minetest.register_node("df_underworld_items:digging_seal", digging_seal_def) + +local prefix_len = string.len(formspec_prefix) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname:sub(1,prefix_len) ~= formspec_prefix or not fields.open then + return + end + local pos_string = formname:sub(prefix_len+1) + local pos = minetest.string_to_pos(pos_string) + if test_key(pos) then + if named_waypoints_path then + named_waypoints.update_waypoint("puzzle_seals", pos, {name=S("Breach in the Slade"), color=0xFA264F, player=player:get_player_name()}) + end + minetest.log("action", "[df_underworld_items] " .. player:get_player_name() .. " triggered a puzzle seal at " .. pos_string) + minetest.set_node(pos, {name="df_underworld_items:digging_seal", param2 = math.random(1,4)-1}) + minetest.get_node_timer(pos):start(4) + minetest.close_formspec(player:get_player_name(), formname) + df_underworld_items.slade_breacher_triggered(pos, player) + end +end) + +------------------------------------------------------------------------------------------------- + +local inscription_block_def = { + description = S("Inscribed Slade Block"), + _doc_items_longdesc = nil, + _doc_items_usagehelp = nil, + tiles = { + "dfcaverns_slade_block.png", + "dfcaverns_slade_block.png", + "dfcaverns_slade_block.png^(dfcaverns_inscription_1.png^[opacity:128)", + "dfcaverns_slade_block.png^(dfcaverns_inscription_2.png^[opacity:128)", + "dfcaverns_slade_block.png^(dfcaverns_inscription_3.png^[opacity:128)", + "dfcaverns_slade_block.png^(dfcaverns_inscription_4.png^[opacity:128)", + }, + paramtype2 = "facedir", + groups = slade_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + is_ground_content = false, + _mcl_blast_resistance = slade_mcl_blast_resistance, + _mcl_hardness = slade_mcl_hardness, + can_dig = can_dig, + on_blast = function() end, + on_rotate = function() return false end, +} + +minetest.register_node("df_underworld_items:inscription_block", inscription_block_def) + + +local capstone_def = { + description = S("Slade Capstone"), + _doc_items_longdesc = nil, + _doc_items_usagehelp = nil, + drawtype = "mesh", + mesh = "underworld_capstone.obj", + tiles = { + "dfcaverns_slade_block.png", + "dfcaverns_slade_block.png" + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.25, 0, -0.25, 0.25, 0.5, 0.25}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.25, 0, -0.25, 0.25, 0.5, 0.25}, + }, + }, + paramtype = "light", + paramtype2 = "facedir", + groups = slade_groups, + light_source = 8, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + is_ground_content = false, + _mcl_blast_resistance = slade_mcl_blast_resistance, + _mcl_hardness = slade_mcl_hardness, + can_dig = can_dig, + on_blast = function() end, + on_rotate = function() return false end, +} + +minetest.register_node("df_underworld_items:slade_capstone", capstone_def) + +----------------------------------------------------------------------------------------- +-- Schematics + +local n1 = { name = "df_underworld_items:slade_block" } +local n6 = { name = "air", prob = 0 } -- ceiling pieces to leave in place +local n8 = { name = "df_underworld_items:puzzle_seal" } +local n3 = { name = "air"} +local n2 = n3 +local n4 = n3 +local n7 = n3 +local n9 = n3 +local n10 = n1 +local n11 = n3 + +local n12 = { name = "df_underworld_items:inscription_block", param2 = 0 } +local n13 = { name = "df_underworld_items:inscription_block", param2 = 1 } +local n14 = { name = "df_underworld_items:inscription_block", param2 = 2 } +local n15 = { name = "df_underworld_items:inscription_block", param2 = 3 } +local n16 = { name = "df_underworld_items:slade_capstone"} + +df_dependencies.register_stairs("slade_block") + +if invulnerable then + for name, def in pairs(minetest.registered_nodes) do + if (name:sub(1,7) == "stairs:" and name:sub(-11) == "slade_block") or + name:sub(1,11) == "mcl_stairs:" and name:sub(-11) == "slade_block" then + minetest.override_item(name, {can_dig = can_dig}) + end + end +end + +if df_dependencies.node_name_stair_slade_block then + n2 = { name = df_dependencies.node_name_stair_slade_block, param2 = 3 } + n4 = { name = df_dependencies.node_name_stair_slade_block, param2 = 1 } + n7 = { name = df_dependencies.node_name_stair_slade_block, param2 = 2 } + n9 = { name = df_dependencies.node_name_stair_slade_block } + n11 = { name = df_dependencies.node_name_slab_slade_block, param2 = 1 } + n10 = { name = df_dependencies.node_name_slab_slade_block, param2 = 21 } + + if df_dependencies.node_name_slab_slade_block_top then + -- Mineclone slabs don't support full rotation, this is how to flip them over + n10.name = df_dependencies.node_name_slab_slade_block_top + n10.param2 = 1 + end +end + + +df_underworld_items.seal_temple_schem = { + size = {y = 6, x = 7, z = 7}, + data = { + n15, n2, n3, n3, n3, n4, n14, n14, n3, n3, n3, n3, n3, n15, n13, n3, n3, + n3, n3, n3, n13, n16, n3, n3, n3, n3, n3, n16, n6, n6, n6, n6, n6, n6, + n6, n6, n6, n6, n6, n6, n6, n6, n7, n3, n3, n3, n3, n3, n7, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, + n3, n3, n6, n3, n3, n3, n3, n3, n6, n6, n6, n6, n6, n6, n6, n6, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n6, n3, n3, n3, n3, n3, n6, + n6, n6, n3, n3, n3, n6, n6, n3, n3, n3, n8, n3, n3, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, + n3, n6, n3, n3, n3, n3, n3, n6, n6, n6, n3, n3, n3, n6, n6, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n6, n3, n3, n3, n3, n3, n6, n6, + n6, n3, n3, n3, n6, n6, n9, n3, n3, n3, n3, n3, n9, n3, n3, n3, n3, + n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, + n6, n3, n3, n3, n3, n3, n6, n6, n6, n6, n6, n6, n6, n6, n12, n2, n3, + n3, n3, n4, n12, n14, n3, n3, n3, n3, n3, n15, n13, n3, n3, n3, n3, n3, + n12, n16, n3, n3, n3, n3, n3, n16, n6, n6, n6, n6, n6, n6, n6, n6, n6, + n6, n6, n6, n6, n6, + } +} + +df_underworld_items.seal_stair_schem = { + size = {y = 2, x = 7, z = 7}, + data = { + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n10, + n3, n3, n3, n1, n1, n3, n11, n1, n10, n3, n1, n1, n11, n3, n3, n3, n3, + n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, + n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, + n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, + } +} \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/settingtypes.txt b/mods/dfcaverns/df_underworld_items/settingtypes.txt new file mode 100644 index 0000000..07da5a9 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/settingtypes.txt @@ -0,0 +1,4 @@ +dfcaverns_invulnerable_slade (Slade cannot be damaged) bool true +dfcaverns_destructive_pit_plasma (Pit plasma destroys adjacent nodes) bool true +dfcaverns_underworld_hunter_statues (Enable hunter statues in the underworld) bool true +dfcaverns_enable_slade_drill (Enable slade drills) bool true \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/slade.lua b/mods/dfcaverns/df_underworld_items/slade.lua new file mode 100644 index 0000000..ae3d4ba --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/slade.lua @@ -0,0 +1,184 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode") + +local server_diggable_only = function(pos, player) + if player and player:is_player() then + return minetest.check_player_privs(player, "server") + end + return false +end + +local add_immortality = function(slade_def) + slade_def.groups.immortal = 1 + slade_def.can_dig = server_diggable_only + return slade_def +end + +local slade_groups = {cracky=3, stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,creative_breakable=1, building_block=1, material_stone=1} + +local slade_def = { + description = S("Slade"), + _doc_items_longdesc = df_underworld_items.doc.slade_desc, + _doc_items_usagehelp = df_underworld_items.doc.slade_usage, + tiles = {"dfcaverns_slade.png"}, + groups = slade_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + is_ground_content = false, + _mcl_blast_resistance = 8, + _mcl_hardness = 5, + on_blast = function(pos, intensity) + if intensity >= 1.0 then + minetest.set_node(pos, {name="df_underworld_items:slade_sand"}) + minetest.check_for_falling(pos) + end + end, +} +if invulnerable then + add_immortality(slade_def) + slade_def._mcl_blast_resistance = 8 + slade_def._mcl_hardness = 5 +end +minetest.register_node("df_underworld_items:slade", slade_def) + +local slade_brick_def = { + description = S("Slade Brick"), + _doc_items_longdesc = df_underworld_items.doc.slade_desc, + _doc_items_usagehelp = df_underworld_items.doc.slade_usage, + tiles = {"dfcaverns_slade_brick.png"}, + groups = slade_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + is_ground_content = false, + _mcl_blast_resistance = 8, + _mcl_hardness = 5, +} +if invulnerable then + add_immortality(slade_brick_def) +end +minetest.register_node("df_underworld_items:slade_brick", slade_brick_def) + +-- can't use "wall=1" because MCL has special handling for nodes in that group that explodes if it tries handling this one. +-- fortunately minetest_game walls also connect to group fence, so this should be fine. +local slade_wall_groups = {fence=1} +for key, val in pairs(slade_groups) do + slade_wall_groups[key]=val +end +local slade_wall_def = { + description = S("Slade Wall"), + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}}, + -- connect_bottom = + connect_front = {{-3/16, -1/2, -1/2, 3/16, 3/8, -1/4}}, + connect_left = {{-1/2, -1/2, -3/16, -1/4, 3/8, 3/16}}, + connect_back = {{-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}}, + connect_right = {{ 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}}, + }, + connects_to = { "group:wall", "group:stone", "group:fence" }, + paramtype = "light", + tiles = {"dfcaverns_slade_brick.png"}, + walkable = true, + is_ground_content = false, + groups = slade_wall_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + _mcl_blast_resistance = 8, + _mcl_hardness = 5, +} +if invulnerable then + add_immortality(slade_wall_def) +end +minetest.register_node("df_underworld_items:slade_wall", slade_wall_def) + +minetest.register_node("df_underworld_items:slade_sand", { + description = S("Slade Sand"), + _doc_items_longdesc = df_underworld_items.doc.slade_desc, + _doc_items_usagehelp = df_underworld_items.doc.slade_usage, + tiles = {"dfcaverns_slade_sand.png"}, + is_ground_content = false, + groups = {crumbly = 3, falling_node = 1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,handy=1,shovely=3, sand=1, enderman_takable=1, building_block=1, material_sand=1, crush_after_fall=1, falling_node_damage=1}, + sounds = df_dependencies.sound_gravel({footstep = {name = df_dependencies.soundfile_gravel_footstep, gain = 0.45},}), + _mcl_blast_resistance = 8, + _mcl_hardness = 3, +}) + +local slade_block_def = { + description = S("Slade Block"), + _doc_items_longdesc = df_underworld_items.doc.slade_desc, + _doc_items_usagehelp = df_underworld_items.doc.slade_usage, + tiles = {"dfcaverns_slade_block.png"}, + groups = slade_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + is_ground_content = false, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, +} +if invulnerable then + add_immortality(slade_block_def) + slade_block_def.on_blast = function() end +end +minetest.register_node("df_underworld_items:slade_block", slade_block_def) + + +local slade_seal_def = { + description = S("Slade Seal"), + _doc_items_longdesc = df_underworld_items.doc.slade_seal_desc, + _doc_items_usagehelp = df_underworld_items.doc.slade_usage, + tiles = {"dfcaverns_slade_block.png^dfcaverns_seal.png", "dfcaverns_slade_block.png"}, + groups = slade_groups, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + is_ground_content = false, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, +} +if invulnerable then + slade_seal_def.on_blast = function() end + add_immortality(slade_seal_def) +end +minetest.register_node("df_underworld_items:slade_seal", slade_seal_def) + +minetest.register_craft({ + type = "shapeless", + output = "df_underworld_items:slade_brick", + recipe = { + "df_underworld_items:slade_sand", + df_dependencies.node_name_bucket_lava, + }, + replacements = {{df_dependencies.node_name_bucket_lava, df_dependencies.node_name_bucket_empty}}, +}) + +minetest.register_abm{ + label = "slade seal scratching", + nodenames = {"df_underworld_items:slade_seal"}, + interval = 10, + chance = 20, + catch_up = false, + action = function(pos) + minetest.sound_play({name="dfcaverns_grinding_stone"}, + { + pos = pos, + gain = 0.05, + max_hear_distance = 32, + } + ) + end, +} + + +-- Register stair and slab + +df_dependencies.register_stairs("slade_brick") + +if invulnerable then + for name, def in pairs(minetest.registered_nodes) do + if (name:sub(1,7) == "stairs:" and name:sub(-11) == "slade_block") or + name:sub(1,11) == "mcl_stairs:" and name:sub(-11) == "slade_brick" then + minetest.override_item(name, {can_dig = server_diggable_only}) + end + end +end + + +if minetest.get_modpath("mesecons_mvps") and df_underworld_items.config.invulnerable_slade then + mesecon.register_mvps_stopper("df_underworld_items:slade") +end diff --git a/mods/dfcaverns/df_underworld_items/slade_drill.lua b/mods/dfcaverns/df_underworld_items/slade_drill.lua new file mode 100644 index 0000000..f3f7dc7 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/slade_drill.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local use_timeout = {} + +local check_timeout = function(user) + if not user:is_player() then return false end + local player_name = user:get_player_name() + local curr_time = minetest.get_gametime() -- minetest.get_us_time() for microsecond precision + local last_used = use_timeout[player_name] + if not last_used or curr_time > last_used then + use_timeout[player_name] = curr_time + return true + end +end + +local drill_particles = function(pos) + minetest.add_particlespawner({ + amount = 25, + time = 0.5, + minpos = pos, + maxpos = pos, + minvel = {x=-5, y=0, z=-5}, + maxvel = {x=5, y=10, z=5}, + minacc = {x=0, y=-10, z=0}, + maxacc = {x=0, y=-10, z=0}, + minexptime = 2.5, + maxexptime = 7.5, + minsize = 1, + maxsize = 5, + texture = "dfcaverns_glowpit_particle.png", + collisiondetection = true, + collision_removal = true, + glow = 15, + }) +end + +local slade_drill_def = { + _doc_items_longdesc = df_underworld_items.doc.slade_drill_desc, + _doc_items_usagehelp = df_underworld_items.doc.slade_drill_usage, + light_source = minetest.LIGHT_MAX, + description = S("Slade Drill"), + inventory_image = "dfcaverns_slade_drill.png", + groups = {cracky=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,creative_breakable=1, material_stone=1}, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + _mcl_blast_resistance = 8, + _mcl_hardness = 5, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + local node = minetest.get_node(pos) + if node.name == "df_underworld_items:slade" and check_timeout(user) then + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:set_wear(itemstack:get_wear()+1) + end + minetest.sound_play("dfcaverns_slade_drill", {pos = user:get_pos()}) + minetest.set_node(pos, {name="df_underworld_items:slade_sand"}) + drill_particles(pointed_thing.above) + return itemstack + end + end + end, +} + +local tnt_boom = df_dependencies.tnt_boom +if tnt_boom then + slade_drill_def.on_use = function(itemstack, user, pointed_thing) + if not check_timeout(user) then return end + local pos + if pointed_thing.type == "node" then pos = pointed_thing.under + elseif pointed_thing.type == "object" then pos = pointed_thing.ref:get_pos() end + if pos then + tnt_boom(pos, {radius=1}) + minetest.sound_play("dfcaverns_slade_drill", {pos = user:get_pos()}) + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:set_wear(itemstack:get_wear()+1) + end + drill_particles(pos) + minetest.check_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) + return itemstack + end + end +end + +minetest.register_tool("df_underworld_items:slade_drill", slade_drill_def) \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.1.ogg b/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.1.ogg new file mode 100644 index 0000000..63f364d Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.1.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.2.ogg b/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.2.ogg new file mode 100644 index 0000000..cb3b91c Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.2.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.3.ogg b/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.3.ogg new file mode 100644 index 0000000..2f97002 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/bedrock2_step.3.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.1.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.1.ogg new file mode 100644 index 0000000..0332a5c Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.1.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.2.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.2.ogg new file mode 100644 index 0000000..8aae975 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.2.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.3.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.3.ogg new file mode 100644 index 0000000..7a2ed99 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.3.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.4.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.4.ogg new file mode 100644 index 0000000..3e6e21d Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_arcing.4.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.1.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.1.ogg new file mode 100644 index 0000000..9159339 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.1.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.2.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.2.ogg new file mode 100644 index 0000000..88100fe Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.2.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.3.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.3.ogg new file mode 100644 index 0000000..47265f5 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_grinding_stone.3.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.1.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.1.ogg new file mode 100644 index 0000000..0f73c50 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.1.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.2.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.2.ogg new file mode 100644 index 0000000..7352741 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.2.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.3.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.3.ogg new file mode 100644 index 0000000..ec7ebe9 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_massive_digging.3.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_puzzle_chest_close.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_puzzle_chest_close.ogg new file mode 100644 index 0000000..15933ed Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_puzzle_chest_close.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_puzzle_chest_open.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_puzzle_chest_open.ogg new file mode 100644 index 0000000..f75104f Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_puzzle_chest_open.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_seal_key.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_seal_key.ogg new file mode 100644 index 0000000..f56c5c5 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_seal_key.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_seal_unlocked.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_seal_unlocked.ogg new file mode 100644 index 0000000..34b82a5 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_seal_unlocked.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_slade_drill.ogg b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_slade_drill.ogg new file mode 100644 index 0000000..d81473b Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/sounds/dfcaverns_slade_drill.ogg differ diff --git a/mods/dfcaverns/df_underworld_items/sounds/license.txt b/mods/dfcaverns/df_underworld_items/sounds/license.txt new file mode 100644 index 0000000..c4efe8f --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/sounds/license.txt @@ -0,0 +1,23 @@ +bedrock2_step.1.ogg - from the Bedrock mod by Wuzzy, https://repo.or.cz/w/minetest_bedrock2.git, under the WTFPL, relicenced to MIT for this mod. +bedrock2_step.2.ogg +bedrock2_step.3.ogg + +dfcaverns_grinding_stone.1.ogg - from https://freesound.org/people/FreqMan/sounds/25845/ by FreqMan under Creative Commons BY 3.0 +dfcaverns_grinding_stone.2.ogg - from https://freesound.org/people/FreqMan/sounds/25846/ by FreqMan under Creative Commons BY 3.0 +dfcaverns_grinding_stone.3.ogg - from https://freesound.org/people/FreqMan/sounds/25847/ by FreqMan under Creative Commons BY 3.0 + +dfcaverns_arcing.1.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 +dfcaverns_arcing.2.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 +dfcaverns_arcing.3.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 +dfcaverns_arcing.4.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 + +dfcaverns_seal_unlocked.ogg - from https://freesound.org/people/juskiddink/sounds/74920/ by juskiddink under Creative Commons BY 3.0 +dfcaverns_seal_key.ogg - From https://freesound.org/people/megashroom/sounds/391488/ by megashroom under the CC0 public domain license +dfcaverns_massive_digging.1.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0 +dfcaverns_massive_digging.2.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0 +dfcaverns_massive_digging.3.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0 + +dfcaverns_drill - from https://freesound.org/people/Jagadamba/sounds/257021/ by Jagadamba under the CC-BY-A 3.0 license + +dfcaverns_puzzle_chest_open - from https://freesound.org/people/Garuda1982/sounds/560304/ by Garuda1982 under CC-BY-A 4.0 +dfcaverns_puzzle_chest_close - from https://freesound.org/people/Benboncan/sounds/74441/ by Benboncan under CC-BY-A 4.0 \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_0.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_0.png new file mode 100644 index 0000000..363285a Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_0.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_1.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_1.png new file mode 100644 index 0000000..e86ea51 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_1.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_2.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_2.png new file mode 100644 index 0000000..8c2b163 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_2.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_3.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_3.png new file mode 100644 index 0000000..7c14631 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_3.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_4.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_4.png new file mode 100644 index 0000000..5075c7e Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_4.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_5.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_5.png new file mode 100644 index 0000000..fb0a1f0 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_5.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_6.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_6.png new file mode 100644 index 0000000..468b37f Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_6.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_7.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_7.png new file mode 100644 index 0000000..d4d0ebf Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_dial_7.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_lock_colours.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_lock_colours.png new file mode 100644 index 0000000..c07ce27 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_lock_colours.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_lock_plate.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_lock_plate.png new file mode 100644 index 0000000..bb94bda Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_lock_plate.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_interior.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_interior.png new file mode 100644 index 0000000..f47686e Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_interior.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_side.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_side.png new file mode 100644 index 0000000..7e8c274 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_side.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_top.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_top.png new file mode 100644 index 0000000..c15e8b4 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_chest_mask_top.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glow_amethyst.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glow_amethyst.png new file mode 100644 index 0000000..134ef5f Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glow_amethyst.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glowpit_particle.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glowpit_particle.png new file mode 100644 index 0000000..301094d Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glowpit_particle.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glowstone_anim.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glowstone_anim.png new file mode 100644 index 0000000..cee2e21 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_glowstone_anim.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_1.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_1.png new file mode 100644 index 0000000..d538be1 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_1.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_2.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_2.png new file mode 100644 index 0000000..2f2fc54 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_2.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_3.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_3.png new file mode 100644 index 0000000..2565917 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_3.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_4.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_4.png new file mode 100644 index 0000000..600fe7d Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_inscription_4.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_lantern_mask.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_lantern_mask.png new file mode 100644 index 0000000..1b4570b Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_lantern_mask.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_pit_plasma.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_pit_plasma.png new file mode 100644 index 0000000..d21c158 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_pit_plasma.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_pit_plasma_static.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_pit_plasma_static.png new file mode 100644 index 0000000..f3af3ea Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_pit_plasma_static.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_1.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_1.png new file mode 100644 index 0000000..cf07a56 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_1.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_2.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_2.png new file mode 100644 index 0000000..5bcec13 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_2.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_background.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_background.png new file mode 100644 index 0000000..9a2d195 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_inscription_background.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_particle.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_particle.png new file mode 100644 index 0000000..6f8cd29 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_puzzle_particle.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_seal.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_seal.png new file mode 100644 index 0000000..d0011b2 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_seal.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade.png new file mode 100644 index 0000000..f7e06cc Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_block.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_block.png new file mode 100644 index 0000000..310044f Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_block.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_brick.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_brick.png new file mode 100644 index 0000000..9a2e91e Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_brick.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_drill.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_drill.png new file mode 100644 index 0000000..2edae29 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_drill.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_sand.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_sand.png new file mode 100644 index 0000000..f740d3a Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_slade_sand.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_statue_eyes.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_statue_eyes.png new file mode 100644 index 0000000..f86c94f Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_statue_eyes.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/dfcaverns_statue_fang_overlay.png b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_statue_fang_overlay.png new file mode 100644 index 0000000..3e8b1cb Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/dfcaverns_statue_fang_overlay.png differ diff --git a/mods/dfcaverns/df_underworld_items/textures/license.txt b/mods/dfcaverns/df_underworld_items/textures/license.txt new file mode 100644 index 0000000..23fe5f1 --- /dev/null +++ b/mods/dfcaverns/df_underworld_items/textures/license.txt @@ -0,0 +1,7 @@ +All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. + +dfcaverns_glow_amethyst, dfcaverns_glow_amethist_ore - from caverealms glow_amethyst + +dfcaverns_slade, dfcaverns_slade_sand, dfcaverns_slade_brick, are all from the Nether mod by PilzAdam: Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/ + +dfcaverns_glowstone_anim is derived from an animated gif of the Sun's surface released by the National Science Foundation under the public domain \ No newline at end of file diff --git a/mods/dfcaverns/df_underworld_items/textures/puzzle dial.xcf b/mods/dfcaverns/df_underworld_items/textures/puzzle dial.xcf new file mode 100644 index 0000000..e03194c Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/puzzle dial.xcf differ diff --git a/mods/dfcaverns/df_underworld_items/textures/puzzle inscriptions.xcf b/mods/dfcaverns/df_underworld_items/textures/puzzle inscriptions.xcf new file mode 100644 index 0000000..1821a83 Binary files /dev/null and b/mods/dfcaverns/df_underworld_items/textures/puzzle inscriptions.xcf differ diff --git a/mods/dfcaverns/guide.md b/mods/dfcaverns/guide.md new file mode 100644 index 0000000..2ad4036 --- /dev/null +++ b/mods/dfcaverns/guide.md @@ -0,0 +1,237 @@ +The following is a comprehensive description of the various cavern layers, plants, trees, minerals, and other such novelties in the DF Caverns mod. Players may wish to avoid reading it so as to not be spoiled on some of the things they may discover in the deep places of the world. + +# Common features found on many layers + +## Speleothems + +There are three main varieties of [speleothem](https://en.wikipedia.org/wiki/Speleothem) that can be found in caves ranging from the surface sea level down to the Sunless Sea; stalactites, stalagmites, and large flowstone formations. Stalactites and stalagmites are small single-node-thick structures that form tapered spikes and flowstone is composed of conventional cubical blocks. All are composed of minerals deposited by flowing water. They come in "wet" and "dry" forms whose only difference is visual; wet flowstone is found in damp places where water still flows over its surface and dry flowstone is "dead." Stalactites and stalagmites mirror each other on the floor and ceiling of caves; stalagmites form from drops that fall off the tip of stalactites. When floor and ceiling are close enough together the two can eventually grow to meet, forming a column. + +Inside the large caverns gigantic versions of stalactites and stalagmites can be found, producing columns that can be tens of meters in diameter. + +## Cave moss + +Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground. It is essentially the "grass" of the deeps. Cave moss is faintly bioluminescent and so is useful for visually defining the floor spaces of giant caverns that would otherwise be a yawning pit of blackness. + +Underground farming can be done directly on cave moss, but it is best if the soil is tilled with a hoe. Cave moss will slowly spread to adjacent bare soil nodes, but if it's exposed to bright light for a period of time it will die back and leave bare soil again. + +## Floor fungus + +Floor fungus produces a thin, slick film that spreads through the cracks of broken rock. Its ability to subsist on the tiniest traces of nutrients means it's found in relatively harsh underground environments. Floor fungus has no known uses. It can penetrate deeply into cobblestone constructions if an infestation gets hold, but it is difficult to transport and is inhibited by light so it hasn't spread beyond the deep caverns. + +Underground farming can be done on floor-fungus-infested cobble, but growth is very slow. Floor fungus doesn't bioluminesce so caverns with floor fungus tend to be much darker and harder to navigate than cave moss areas. + +## Glow worms + +Glistening strings of silk hang from the ceilings of some of the larger and moister caverns, lit by the millions of tiny bioluminescent worms that spun them. Glow worms prey on the insects they lure and entangle with their faux starry sky - and sometimes the occasional bat or other larger flying beast. + +Glow worms can be harvested and used as a source of light but they die when exposed to light significantly brighter than themselves or when immersed in water. A colony of glow worms hung in a hospitable environment will undergo a modest amount of growth, allowing it to be divided and propagated. + +# Farmable organisms + +![Farmable plants, except Torchspines (see Black Cap cavern)](./df_caverns/screenshots/farmable_plants.jpg) + +## Plump helmet + +A basic staple food of the underground realms, plump helmets are thick purplish mushrooms that grow well under almost any condition except direct exposure to light. Plump helmets can be picked and eaten unprepared, and propagate easily. + +## Cave wheat + +Cave wheat is literally a breed of grain-producing grass that somehow lost its ability to photosynthesize and adapted to a more fungal style of life. Like its surface cousin, cave wheat produces grain that can be ground into a form of flour. Cave wheat flour can be baked into a tough, durable form of bread, or combined with other ingredients. + +## Sweet Pods + +Sweet pods grow in rich soil, and once they reach maturity they draw that supply of nutrients up to concentrate it in their fruiting bodies. They turn bright red when ripe and can be processed in a variety of ways to extract the sugars they contain. When milled or dried in an oven, sweet pods produce a granular sugary substance. Crushing them in a bucket squeezes out a flavorful syrup. + +## Pig tails + +Pig tails are a fibrous fungal growth that's most notable for its twisting stalks. In a mature stand of pig tails the helical stalks intertwine into a dense mesh. Pig tail stalks can be processed to extract fibers useful as thread. + +## Dimple cups + +The distinctive midnight-blue caps of these mushrooms are inverted, exposing their gills to any breeze that might pass, and have dimpled edges that give them their name. Dimple cups can be dried, ground, and processed to extract a deep blue dye. + +## Quarry bushes + +A rare breed of fungus from deep underground that produces a bushy cluster of rumpled gray 'blades'. The biological function of these blades is not known, as quarry bushes reproduce via hard-shelled nodules that grow down at the blade's base. Quarry bush leaves and nodules (called 'rock nuts') can be harvested and are edible with processing. The dried blades of a quarry bush add a welcome zing to recipes containing otherwise-bland subterranean foodstuffs, but they're too spicy to be eaten on their own. + +## Torchspines + +Torchspines are strange organic formations that are alive only in a technical sense. They "feed" on volatile flammable vapors vented up through their structure, growing from combustion residue deposited at their tips. A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces. + +Physically, they resemble stalagmites. Unlike most underground growths they are unaffected by bright light. + +# First cavern layer + +By default, the first cavern layer can be found between -200 and -800 meters elevation. Biomes found on this level include Tower Cap, Fungiwood and "barren" caverns that lack significant organic growth. Some caverns have lakes of water filling their lower regions, others have little or no standing water. + +## Tower Cap caverns + +![Two Tower Caps](./df_caverns/screenshots/tower_cap.jpg) + +Tower Caps are enormous pale mushrooms with woody stems and caps. Aside from their sheer size there's not much unusual about them; they are useful as a substitute for surface wood and can be used for most wood-requiring crafting recipes. Plump helmets also grow here. + +## Fungiwood caverns + +![Fungiwood, with stalagmites in foreground](./df_caverns/screenshots/fungiwood.jpg) + +Fungiwoods have thinner stalks that sprout numerous thin irregular "shelves" branching out along its height. The shelves are useless except as fuel, but the main stem of a fungiwood is another wood substitute. + +Plump helmets and cave wheat grow here. + +## Spindlestems + +![Spindlestems](./df_caverns/screenshots/spindlestems.jpg) + +Spindlestem mushrooms are the weedy "saplings" of the upper fungal forests, too large to pick by hand but not exactly inspiring tree-like analogies. They are common, though, and not without their uses. Their long stems can serve as a wood substutitue in many crafts and their bioluminescent caps can produce a long-lived glowing extract that's useful as a source of light. They grow taller when crowded. + +The bioluminescence of Spindlestems are actually a very interesting feature. Despite their apparent visual diversity, Spindlestems are a single species. They pick up their glow from symbiotic microorganisms that colonize their caps, and the specific breed of symbiote that thrives in any given Spindlestem depends on the minerals present in the nearby rocks. Iron results in a weak red-glowing cap, copper results in a green-tinted cap, and the combination of both can result in a brighter cyan glow. Brilliant yellow "Golden Spindlestems" have also been spotted. + +For some reason, Spindlestems that grow in the presence of Tower Caps are never luminescent. Perhaps they're intimidated. + +# Second cavern layer + +By default, the second cavern layer can be found between -800 and -1400 meters elevation. Like the first layer, some caverns contain lakes filling their lower regions. The dry barren caverns at this level will have some occasional ruby crystal growths in them, but they will be detailed in an entry on the third cavern layer where they're much more common. + +## Goblin Cap caverns + +![Goblin Caps](./df_caverns/screenshots/goblin_cap.jpg) + +Goblin caps are the broader, squatter cousins of the Tower Cap fungus. Like Tower Caps they have no particular special properties, but their wood comes in two different colours - the reddish orange of their caps and the cream coloured stem wood. Plump helmets and Spindlestems grow here. + +For some reason, Spindlestems that grow in the presence of Goblin Caps are always red. + +## Spore Tree caverns + +![Spore Trees](./df_caverns/screenshots/spore_tree.jpg) + +Spore trees are the smallest of the underground fungal "tree" types, with a simple stem supporting a sponge-like three-dimensional mesh of hyphae. The mesh can be easily climbed, so navigating a spore tree forest is quite easy, and when harvested can be crafted into ladders quite quickly and easily. Fruiting bodies are embedded in the mesh that produce a copious amount of spores that gently rain down around the spore tree's base. + +Cave wheat and pig tails can be found growing here. + +## Tunnel Tube caverns + +![Tunnel Tubes](./df_caverns/screenshots/tunnel_tube.jpg) + +Tunnel tubes are hollow, curved fungal growths that support a fruiting body at their tip. The trunk of a tunnel tube can be cut and processed to produce plywood-like material. The fruiting body accumulates high-energy compounds that, when ignited, produce a vigorous detonation - a unique adaptation for spreading tunnel tube spawn through the still cavern air. If the TNT mod is enabled tunnel tube fruiting bodies can be detonated like weak TNT blocks and can be harvested for gunpowder. + +Sweet pods and cave wheat can be found growing in tunnel tube caverns. + +## Cave pearls + +![Cave Pearls](./df_caverns/screenshots/cave_pearls.jpg) + +At these depths you may find a distinctive and beautiful formation encrusting the ceilings and walls of smaller tunnels and warrens; "cave pearls." These nodules are actually calcified bacterial colonies that can only form where they're left undisturbed for the long periods needed for them to grow this large. + +# Third cavern layer + +The third cavern layer is where things start to get really exotic. Black Caps, Nethercaps, Bloodthorn and reddish glowing crystal formations are found here. Those caverns that are partly-flooded have unusual features thanks to the strange life sharing them. By default the third cavern layer runs from -1400 to -2000 meters. + +## Black Cap caverns + +![Black Caps, with two Torchspines in foreground](./df_caverns/screenshots/black_cap.jpg) + +Black Cap caverns are dark, sooty, carbon-rich places. The Black Caps themselves are fairly mundane as underground flora goes, giant black mushrooms whose tarry gills can be used to craft torches and whose wood burns as strongly as coal blocks. + +Also found in Black Cap caverns are torchspines, stalagmite-like growths that sometimes burn volatile gasses at their tips and produce a dim, irregular light. When water lakes are found in Black Cap caverns the water has an oily sheen on the surface, collecting into thick black slicks that cling to the shores. + +## Nethercap caverns + +![Nethercaps, with ice sprites hovering near icicles above](./df_caverns/screenshots/nethercap.jpg) + +Nethercaps break the known laws of thermodynamics by somehow "feeding" directly on heat. As a result Nethercap caverns are frigid and icy, with icicles mixed with stalactites and giant columns of frozen water. Nethercap caverns have little other life in them as a result. They are lit by the blue glow of the Nethercap's gills, as well as by the mysterious "ice sprites" that hover and sparkle near the ceilings and by the streaks of hoar moss that grow on the surfaces of ice columns. + +Any liquid water that touches Nethercap wood will freeze, even if the Nethercap has been harvested and crafted into other forms. Nethercap will not burn and indeed will snuff out fires and even solidify lava it touches. If a Nethercap cavern has a lake its surface will be covered in a solid sheet of ice. + +Ice sprites, mysterious glowing insect-like creatures that appear to be made partly of crystalized water, flit and flicker under the icicles hanging from the ceilings of these caverns. Softly glowing hoar moss forms in sheets on columns of ice. + +## Bloodthorn caverns + +![Bloodthorns](./df_caverns/screenshots/bloodthorn.jpg) + +Bloodthorns are cactus-like in appearance and habitat, growing in dry sandy caverns, but they are far more agressive about seeking moisture than their surface kin. Bloodthorns have thick spines projecting randomly from their trunks that are coated in smaller barbs that greedily drain fluids from any creature that touches them. You can climb a bloodthorn quite easily, using its spines like rungs on a ladder, but it will hurt to do so. Bloodthorn caverns are dimly lit so take care not to blunder into the rows of bloodthorns that grow like living fences. + +Lakes are never found in Bloodthorn caverns and the cracks in the rock that would normally seep moisture are choked with crystals of salt. Some of the salts seem to containe traces of Mese, giving them a faint unearthly glow. + +Quarry bushes can be found here. + +## Barren crystal caverns + +![Crystals](./df_caverns/screenshots/crystals.jpg) + +On the third cavern layer the dry barren caverns will sprout clusters of enormous hexagonal red crystals from their floors and ceilings, providing light. These crystals have no particular use but are rare and beautiful to look at. + +# Chasms + +![A chasm](./df_caverns/screenshots/chasm.jpg) + +Not all vast open spaces underground are the result of aeons of erosion by water or magma. The foundations of the world shift from time to time, causing deep faults to split open in the rock. Yawning chasms can be found oriented along the north-south axis, some of them stretching for kilometers both in length and depth. They cross through multiple cavern layers and are an environment in their own right. Chasms can be a convenient way of traveling long distances and also a convenient way of falling to your death. + +The great extent of chasms makes them hospitable to small flying creatures, and their narrowness makes the hospitable to creatures that feed on them - giant cave spider webs can be found strung across them here and there. A dubious salvation for anyone falling from above. + +# Pit caves + +![Looking up from the bottom of a pit](./df_caverns/screenshots/pit_cave.jpg) + +A pit cave is a type of cave which contains one or more significant vertical shafts rather than being predominantly a conventional horizontal cave passage. Pit caves typically form in limestone as a result of long-term erosion by water. Given the vast scope of the flowstone formations found throughout the upper layers of the world's caverns, correspondingly gigantic pits can also be found. They sometimes breach the surface of the world, and at their greatest extent can have a drop over two kilometers deep. Bring plenty of rope when exploring such abysses. + +# Sunless Sea + +![Sunless river](./df_caverns/screenshots/sunless_river.jpg) + +The Sunless Sea is the final destination of all water that flows down through the cracks in the Earth. By default the caverns of the Sunless Sea begin at -2000 and go down to -2400 meters, with the lower sea level of the world being halfway between at -2200. + +Compared to the previous layer the Sunless Sea is actually a much richer and more hospitable environment, and along the shores are found a variety of fungi from higher levels. One biome has a mixture of Tower Cap and Goblin Cap, and another biome mixes Spore Tree and Fungiwood. The smaller farmable plants and fungi from the various levels are also found here, with the exception of Torchspines. One unique fungus is found here; dimple cups grow among their larger Tower Cap and Goblin Cap cousins. + +The distinguishing feature of the Sunless Sea is the vast expanse of water to be found here. The caverns themselves are broader in extent than those found higher up, heavily eroded by the steady flow of water, and a network of rivers spider-web the cracks between the larger caverns and allow for an intrepid sailor to travel great distances. + +![Cave Coral in the foreground, Snareweed in background](./df_caverns/screenshots/cave_coral_snareweed.jpg) + +Below the surface of the water Snareweed can be found, a dangerous kelp-like growth that uses bioluminescence and reflective patches to lure cave fish close enough to snag with their barbs. Swimming through Snareweed is a painful experience. Deeper down are craggy towers of softly glowing Cave Coral. + +This is the last stop for the living world. Caverns continue to stretch below but nothing grows below. + +# Lakes of Oil + +![Mine gas seeping into a tunnel](./df_caverns/screenshots/mine_gas.jpg) + +Venturing below the Sunless Sea will require either a great deal of digging through solid rock or a lengthy SCUBA swim through flooded tunnels. Getting past the water doesn't guarantee that you'll be able to breathe, however. + +Eventually, at around -2600 meters elevation, an explorer may encounter lakes of oil in lenticular caverns. Falling into a lake of oil is an unpleasant experience - one is completely blind when below the surface - but that's not the real danger. The atmosphere above the oil is filled with unbreathable gasses that are explosive when mixed with air and an ignition source (such as a carelessly placed torch). Even in the tunnels above the oil there are occasional gas seeps venting this gas from cracks and seams of coal. This gas is heavier than air and will pool in depressions, and of course it cannot be swum through so take care not to jump down into a place you can't easily climb back out of. + +A few mysterious blue flames may occasionally be found flickering on the edges of oil lakes, burning without oxygen and seeming to maintain their size as they drift about through the unbreathable atmosphere. These "gas wisps" may be a strange form of plasmoidal life but they are easily snuffed and so little is known about them. + +Buckets of oil serve as an excellent fuel source, powering a furnace as well as a block of coal. + +# Magma Sea + +![Mese crystals growing above the magma sea](./df_caverns/screenshots/magma_sea_mese.jpg) + +Below the lakes of oil, around -2800 meters elevation, is the Magma Sea. A dense network of cracks filled with liquid rock, the only way through is by digging a passage of your own through whatever remains solid. + +The Magma Sea is not without its treasures, however. In the most infernal regions the heat and strange vapors have resulted in the formation of Mese crystals of unparalleled purity on the ceilings hanging over the lava. These regions are rare but if you're in need of Mese then you can strike a mother lode down here. + +# Underworld + +![There are older and fouler things than orcs in the deep places of the world](./df_caverns/screenshots/underworld.jpg) + +The foundations of the world lie at -3100 meters. The diggable rock of the world ends at a rippling layer of invulnerable Slade, a material of unparalleled density. There is a cavern layer at the seam between rock and Slade, however, as if the earth itself was reluctant to touch the strange matter below. The crevices of the ceiling have strange glowing rocks in them, producing a surprisingly bright ambiance. Don't attempt to disturb those rocks. + +There is no native life in the Underworld. It appears there once _was_, however. Occasional clusters of vacant buildings can be found, impossibly crafted from bricks of Slade and empty of any furnishings. Around those clusters of vacant buildings are fields filled with sealed pits that are lined with flawless Slade blocks. It is unclear whether these pits are as vacant as the buildings, though. The seals capping them are engraved with ancient words in lost tongues, but one phrase can be translated from the oldest known languages: "This Place is Not a Place of Honor." + +Just as ominously, the ancient bones of long-dead warriors are scattered amidst the buildings. They contain loot for those willing to risk disturbing them. There are no traces of who - or what - they died fighting, but their ancient sentinels still lurk nearby to guard them. + +![Glowing pit](./df_caverns/screenshots/glowing_pit.jpg) + +Also scattered around the Underworld are the occasional twisting shaft leading down into the Slade. The edges of these shafts are encrusted with glowing purple crystals and the bottoms of these shafts are filled with some form of shimmering liquid that destroys whatever tries to penetrate it. + +There may be other ways to get through the Slade, but the ancient warriors fought hard to seal them... + +![Mysterious seal](./df_caverns/screenshots/mysterious_seal.jpg) + +# Primordial Deeps + +What mysteries lie below? Perhaps a realm that time itself has forgotten, with life from a world that no longer exists? + +And why was it locked away? + +![Primordial Fungal](./df_caverns/screenshots/primordial_fungal.jpg) ![Primordial Jungle](./df_caverns/screenshots/primordial_jungle.jpg) diff --git a/mods/dfcaverns/hunter_statue/LICENSE.txt b/mods/dfcaverns/hunter_statue/LICENSE.txt new file mode 100644 index 0000000..70c4f3b --- /dev/null +++ b/mods/dfcaverns/hunter_statue/LICENSE.txt @@ -0,0 +1,24 @@ +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2020 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/hunter_statue/init.lua b/mods/dfcaverns/hunter_statue/init.lua new file mode 100644 index 0000000..a14fa09 --- /dev/null +++ b/mods/dfcaverns/hunter_statue/init.lua @@ -0,0 +1,165 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +hunter_statue = {} + +-- override this to allow achievements to be recorded without requiring a dependency +hunter_statue.player_punched = function(node_name, pos, player) end + +local statue_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 95/64, 0.5}, + }, +} + +local fourtyfivedegrees = math.pi/4 +local sixtydegrees = math.pi/3 + +local default_sounds +if minetest.get_modpath("default") then + default_sounds = default.node_sound_stone_defaults() +end + +local test_array = { + {x=0,y=0,z=0}, + {x=0,y=-1,z=0}, + {x=0,y=1,z=0}, + {x=0,y=-2,z=0}, + {x=0,y=2,z=0}, +} + +--statue_def = { +-- description = name of statue type +-- tiles = {} +-- drop = "" +-- sounds = +-- groups = {} +-- interval = 1 +-- chance = 1 +-- damage = 8 +-- knockback = 16 +-- tnt_vulnerable = false +-- tnt_debris = +-- hunters_allowed_here = -- function(pos) +-- other_overrides = +--} + +hunter_statue.register_hunter_statue = function(node_name, statue_def) + + local def = { + description = statue_def.description or S("Hunter Statue"), + -- _doc_items_longdesc = long_description, + -- _doc_items_usagehelp = usage_help, + drawtype = "mesh", + mesh = "hunter_statue.obj", + tiles = statue_def.tiles or {}, + paramtype2 = "facedir", + drop = statue_def.drop or "", + collision_box = statue_box, + selection_box = statue_box, + groups = statue_def.groups or {falling_node = 1}, + sounds = statue_def.sounds or default_sounds, + } + + if statue_def.tnt_vulnerable then + def.on_blast = function(pos, intensity) + if intensity >= 1.0 then + minetest.set_node(pos, {name= statue_def.tnt_debris or "air"}) + minetest.check_for_falling(pos) + end + end + end + + if statue_def.other_overrides then + for k, v in pairs(statue_def.other_overrides) do + def[k] = v + end + end + + local knockback = statue_def.knockback or 16 + local damage = statue_def.damage or 8 + local hunters_allowed_here = statue_def.hunters_allowed_here + + minetest.register_node(node_name, def) + + minetest.register_abm({ + label = node_name .. " ABM", + nodenames = {node_name}, + interval = statue_def.interval or 1.0, + chance = statue_def.chance or 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local players = minetest.get_connected_players() + local nearest_distance = 50 + local nearest_player = nil + local nearest_pos = nil + for _, player in pairs(players) do + local player_pos = player:get_pos() + local player_distance = vector.distance(pos, player_pos) + -- ignore far-away players + if player_distance < 50 then + local look_dir = player:get_look_dir() + local statue_dir = vector.direction(player_pos, pos) + local angle = vector.angle(look_dir, statue_dir) + if angle < sixtydegrees then + -- raycast test? + -- a player is looking, do nothing + return + elseif player_distance < nearest_distance then + nearest_distance = player_distance + nearest_player = player + nearest_pos = player_pos + end + end + end + + if nearest_player then + if nearest_distance < 2 then + local armour_multiplier = 1 + local fleshy_armour = nearest_player:get_armor_groups().fleshy + if fleshy_armour then + armour_multiplier = fleshy_armour/100 + end + nearest_player:add_velocity(vector.multiply(vector.direction(pos, nearest_pos), knockback)) + nearest_player:set_hp(math.max(nearest_player:get_hp() - damage*armour_multiplier, 0)) + minetest.sound_play({name="hunter_statue_thud"}, {pos = nearest_pos}) + hunter_statue.player_punched(node_name, pos, nearest_player) + return + end + local player_dir = vector.direction(pos, nearest_pos) + local new_facedir = minetest.dir_to_facedir(player_dir) + local new_pos = vector.round(vector.add(pos, player_dir)) + for _, add_pos in ipairs(test_array) do + local test_base = vector.add(new_pos, add_pos) + if hunters_allowed_here == nil or hunters_allowed_here(test_base) then + local test_base_node = minetest.get_node(test_base) + local test_base_node_def = minetest.registered_nodes[test_base_node.name] + if test_base_node_def and test_base_node_def.buildable_to then + local test_above = vector.add(test_base, {x=0, y=1, z=0}) + local test_above_node = minetest.get_node(test_above) + local test_above_node_def = minetest.registered_nodes[test_above_node.name] + if test_above_node_def and test_above_node_def.buildable_to then + local test_below = vector.add(test_base, {x=0, y=-1, z=0}) + local test_below_node = minetest.get_node(test_below) + local test_below_node_def = minetest.registered_nodes[test_below_node.name] + if test_below_node_def and test_below_node_def.walkable then + minetest.set_node(pos, {name="air"}) -- old location + minetest.set_node(test_above, {name="air"}) -- some kind of filler node? + node.param2 = new_facedir + minetest.set_node(test_base, node) + minetest.check_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) + minetest.sound_play({name="hunter_statue_brick_step"}, {pos = pos, gain = 0.5}) + return + end + end + end + end + end + if node.param2 ~= new_facedir then + node.param2 = new_facedir + minetest.set_node(pos, node) + minetest.sound_play({name="hunter_statue_turn_grind"}, {pos = pos, gain = 0.5}) + end + end + end, + }) +end \ No newline at end of file diff --git a/mods/dfcaverns/hunter_statue/locale/template.txt b/mods/dfcaverns/hunter_statue/locale/template.txt new file mode 100644 index 0000000..c56f4c2 --- /dev/null +++ b/mods/dfcaverns/hunter_statue/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: hunter_statue + + +### init.lua ### + +Hunter Statue= diff --git a/mods/dfcaverns/hunter_statue/mod.conf b/mods/dfcaverns/hunter_statue/mod.conf new file mode 100644 index 0000000..dde47d6 --- /dev/null +++ b/mods/dfcaverns/hunter_statue/mod.conf @@ -0,0 +1,2 @@ +name=hunter_statue +optional_depends = default \ No newline at end of file diff --git a/mods/dfcaverns/hunter_statue/models/hunter_statue.obj b/mods/dfcaverns/hunter_statue/models/hunter_statue.obj new file mode 100644 index 0000000..8d5b530 --- /dev/null +++ b/mods/dfcaverns/hunter_statue/models/hunter_statue.obj @@ -0,0 +1,238 @@ +# Blender v2.83.1 OBJ File: 'statue.blend' +# www.blender.org +mtllib hunter_statue.mtl +g Reaper_Cube.004 +v -0.321956 -0.499999 -0.232636 +v -0.321956 0.000000 -0.232636 +v 0.321956 -0.499999 -0.232636 +v 0.321956 0.000000 -0.232636 +v -0.321956 -0.499999 0.515897 +v -0.321956 0.000000 0.515897 +v 0.321956 -0.499999 0.515897 +v 0.321956 0.000000 0.515897 +v -0.510628 0.000000 -0.599906 +v -0.510628 0.450000 -0.599906 +v 0.510628 0.000000 -0.599906 +v 0.510628 0.450000 -0.599906 +v -0.510628 0.000000 0.192351 +v -0.510628 0.450000 0.192351 +v 0.510628 0.000000 0.192351 +v 0.510628 0.450000 0.192351 +v -0.614139 0.450000 -0.868622 +v -0.614139 1.355958 -0.868622 +v 0.614139 0.450000 -0.868622 +v 0.614139 1.355958 -0.868622 +v -0.614139 0.450000 -0.050000 +v -0.614139 1.355958 -0.050000 +v 0.614139 0.450000 -0.050000 +v 0.614139 1.355958 -0.050000 +v -0.319882 0.820354 -0.050000 +v -0.319882 1.499348 -0.050000 +v 0.319882 0.820354 -0.050000 +v 0.319882 1.499348 -0.050000 +v -0.319882 0.820354 0.720721 +v -0.319882 1.499348 0.720721 +v 0.319882 0.820354 0.720721 +v 0.319882 1.499348 0.720721 +v -0.176403 1.356000 -0.478804 +v -0.176403 1.600000 -0.478804 +v 0.176403 1.356000 -0.478804 +v 0.176403 1.600000 -0.478804 +v -0.176403 1.356000 0.313453 +v -0.176403 1.600000 0.313453 +v 0.176403 1.356000 0.313453 +v 0.176403 1.600000 0.313453 +v 0.070475 0.572531 0.557791 +v 0.095793 0.829035 0.587892 +v 0.219244 0.829035 0.587892 +v 0.095793 0.829035 0.689536 +v 0.219244 0.829035 0.689536 +v -0.219244 0.829035 0.689536 +v -0.095793 0.829035 0.689536 +v -0.219244 0.829035 0.587892 +v -0.095793 0.829035 0.587892 +v -0.070475 0.572531 0.557791 +vt 0.173459 -0.000938 +vt 0.173459 0.499061 +vt 0.818274 0.499061 +vt 0.818274 -0.000938 +vt 0.610319 -0.550000 +vt 0.610319 -0.050001 +vt -0.143234 -0.050001 +vt -0.143234 -0.550000 +vt 0.818274 -0.000938 +vt 0.818274 0.499061 +vt 0.173460 0.499061 +vt 0.173460 -0.000938 +vt -0.143234 -0.550000 +vt -0.143234 -0.050001 +vt 0.610319 -0.050001 +vt 0.610319 -0.550000 +vt 0.822407 0.736425 +vt 0.822407 -0.007708 +vt 0.177593 -0.007708 +vt 0.177592 0.736425 +vt 0.822407 -0.007708 +vt 0.822407 0.736425 +vt 0.177592 0.736425 +vt 0.177593 -0.007708 +vt -0.015476 0.499061 +vt -0.015476 0.949061 +vt 1.007210 0.949061 +vt 1.007210 0.499061 +vt 0.980052 -0.050001 +vt 0.980052 0.399999 +vt 0.182482 0.399999 +vt 0.182482 -0.050001 +vt 1.007210 0.499061 +vt 1.007210 0.949062 +vt -0.015476 0.949062 +vt -0.015476 0.499061 +vt 0.182482 -0.050001 +vt 0.182482 0.399999 +vt 0.980052 0.399999 +vt 0.980052 -0.050001 +vt 1.011343 0.975486 +vt 1.011343 0.187886 +vt -0.011343 0.187886 +vt -0.011343 0.975486 +vt 1.011343 0.187886 +vt 1.011343 0.975486 +vt -0.011343 0.975486 +vt -0.011343 0.187886 +vt -0.119133 0.949061 +vt -0.119133 1.855020 +vt 1.110867 1.855020 +vt 1.110867 0.949061 +vt 1.250569 0.399999 +vt 1.250569 1.305957 +vt 0.426458 1.305957 +vt 0.426458 0.399999 +vt 1.110867 0.949061 +vt 1.110867 1.855020 +vt -0.119133 1.855020 +vt -0.119133 0.949061 +vt 0.426458 0.399999 +vt 0.426458 1.305957 +vt 1.250569 1.305957 +vt 1.250569 0.399999 +vt 1.115000 1.149370 +vt 1.115000 0.335561 +vt -0.115000 0.335561 +vt -0.115000 1.149370 +vt 1.115000 0.335561 +vt 1.115000 1.149370 +vt -0.115000 1.149370 +vt -0.115000 0.335561 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.426458 0.770354 +vt 0.426458 1.449347 +vt -0.349431 1.449347 +vt -0.349431 0.770354 +vt -0.349431 0.770354 +vt -0.349431 1.449347 +vt 0.426458 1.449347 +vt 0.426458 0.770354 +vt 0.820330 0.625561 +vt 0.820330 -0.140630 +vt 0.179670 -0.140630 +vt 0.179670 0.625561 +vt 0.820330 -0.140630 +vt 0.820330 0.625561 +vt 0.179670 0.625561 +vt 0.179670 -0.140630 +vt 0.319217 1.855062 +vt 0.319217 2.099062 +vt 0.672517 2.099062 +vt 0.672517 1.855062 +vt 0.858137 1.306000 +vt 0.858137 1.550000 +vt 0.060568 1.550000 +vt 0.060568 1.306000 +vt 0.672517 1.855062 +vt 0.672517 2.099062 +vt 0.319217 2.099062 +vt 0.319217 1.855062 +vt 0.060568 1.306000 +vt 0.060568 1.550000 +vt 0.858137 1.550000 +vt 0.858137 1.306000 +vt 0.676650 0.111690 +vt 0.676650 0.899290 +vt 0.323350 0.899290 +vt 0.323350 0.111690 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.507514 0.568833 +vt 0.719681 0.996319 +vt 0.617273 0.996319 +vt 0.502794 0.996319 +vt 0.369114 0.996319 +vt 0.289050 0.996319 +vt 0.507514 0.568833 +vt 0.369114 0.996319 +vt 0.502794 0.996319 +vt 0.617273 0.996319 +vt 0.719681 0.996319 +vt 0.289050 0.996319 +vn -0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 -0.0000 +vn -0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.1166 -0.9932 +vn 0.8650 -0.5017 0.0000 +vn 0.0000 -0.4569 0.8895 +vn -0.9952 0.0982 0.0000 +vn -0.8650 -0.5017 0.0000 +vn 0.9952 0.0982 0.0000 +g Reaper_Cube.004_Body +usemtl Body +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/5/2 4/6/2 8/7/2 7/8/2 +f 7/9/3 8/10/3 6/11/3 5/12/3 +f 5/13/4 6/14/4 2/15/4 1/16/4 +f 3/17/5 7/18/5 5/19/5 1/20/5 +f 8/21/6 4/22/6 2/23/6 6/24/6 +f 9/25/1 10/26/1 12/27/1 11/28/1 +f 11/29/2 12/30/2 16/31/2 15/32/2 +f 15/33/3 16/34/3 14/35/3 13/36/3 +f 13/37/4 14/38/4 10/39/4 9/40/4 +f 11/41/5 15/42/5 13/43/5 9/44/5 +f 16/45/6 12/46/6 10/47/6 14/48/6 +f 17/49/1 18/50/1 20/51/1 19/52/1 +f 19/53/2 20/54/2 24/55/2 23/56/2 +f 23/57/3 24/58/3 22/59/3 21/60/3 +f 21/61/4 22/62/4 18/63/4 17/64/4 +f 19/65/5 23/66/5 21/67/5 17/68/5 +f 24/69/6 20/70/6 18/71/6 22/72/6 +f 25/73/1 26/74/1 28/75/1 27/76/1 +f 27/77/2 28/78/2 32/79/2 31/80/2 +f 29/81/4 30/82/4 26/83/4 25/84/4 +f 27/85/5 31/86/5 29/87/5 25/88/5 +f 32/89/6 28/90/6 26/91/6 30/92/6 +f 33/93/1 34/94/1 36/95/1 35/96/1 +f 35/97/2 36/98/2 40/99/2 39/100/2 +f 39/101/3 40/102/3 38/103/3 37/104/3 +f 37/105/4 38/106/4 34/107/4 33/108/4 +f 40/109/6 36/110/6 34/111/6 38/112/6 +g Reaper_Cube.004_Face +usemtl Face +f 31/113/3 32/114/3 30/115/3 29/116/3 +g Reaper_Cube.004_Fangs +usemtl Fangs +f 41/117/7 42/118/7 43/119/7 +f 41/117/8 43/119/8 45/120/8 +f 41/117/9 45/120/9 44/121/9 +f 41/117/10 44/121/10 42/122/10 +f 50/123/9 47/124/9 46/125/9 +f 50/123/11 46/125/11 48/126/11 +f 50/123/7 48/126/7 49/127/7 +f 50/123/12 49/128/12 47/124/12 diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.1.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.1.ogg new file mode 100644 index 0000000..339d386 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.1.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.2.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.2.ogg new file mode 100644 index 0000000..d269f29 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.2.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.3.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.3.ogg new file mode 100644 index 0000000..47c6a8e Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.3.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.4.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.4.ogg new file mode 100644 index 0000000..9119d37 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.4.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.5.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.5.ogg new file mode 100644 index 0000000..a6582a9 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.5.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.6.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.6.ogg new file mode 100644 index 0000000..895bfb5 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_brick_step.6.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_thud.1.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_thud.1.ogg new file mode 100644 index 0000000..49fc491 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_thud.1.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_thud.2.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_thud.2.ogg new file mode 100644 index 0000000..68d8d69 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_thud.2.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.1.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.1.ogg new file mode 100644 index 0000000..6efd557 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.1.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.2.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.2.ogg new file mode 100644 index 0000000..e58cb28 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.2.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.3.ogg b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.3.ogg new file mode 100644 index 0000000..436e402 Binary files /dev/null and b/mods/dfcaverns/hunter_statue/sounds/hunter_statue_turn_grind.3.ogg differ diff --git a/mods/dfcaverns/hunter_statue/sounds/license.txt b/mods/dfcaverns/hunter_statue/sounds/license.txt new file mode 100644 index 0000000..6b9c608 --- /dev/null +++ b/mods/dfcaverns/hunter_statue/sounds/license.txt @@ -0,0 +1,3 @@ +hunter_statue_brick_step and hunter_statue_turn_grind are all from https://freesound.org/people/nebulousflynn/sounds/234360/ by nebulousflynn under Creative Commons BY 3.0 + +hunter_statue_thud are from https://freesound.org/people/yummy9987/sounds/494930/ under the CC0 license \ No newline at end of file diff --git a/mods/dfcaverns/i18n.py b/mods/dfcaverns/i18n.py new file mode 100644 index 0000000..dd901e9 --- /dev/null +++ b/mods/dfcaverns/i18n.py @@ -0,0 +1,421 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate the template file and update the translation files. +# Copy the script into the mod or modpack root folder and run it there. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer +# LGPLv2.1+ +# +# See https://github.com/minetest-tools/update_translations for +# potential future updates to this script. + +from __future__ import print_function +import os, fnmatch, re, shutil, errno +from sys import argv as _argv + +# Running params +params = {"recursive": False, + "help": False, + "mods": False, + "verbose": False, + "folders": [] +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "mods": ['--installed-mods'], + "verbose": ['--verbose', '-v'] +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 60 + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["mods"])} + run on locally installed modules + {', '.join(options["verbose"])} + add output information +''') + + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + elif params["recursive"] and params["mods"]: + print("Option --installed-mods is incompatible with --recursive") + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if params["mods"]: + print(f"on all locally installed modules in {os.path.abspath('~/.minetest/mods/')}") + run_all_subfolders("~/.minetest/mods") + elif len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_bracketed = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +pattern_tr = re.compile(r'(.+?[^@])=(.*)') +pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') +pattern_tr_filename = re.compile(r'\.tr$') +pattern_po_language_code = re.compile(r'(.*)\.po$') + +#attempt to read the mod's name from the mod.conf file. Returns None on failure +def get_modname(folder): + try: + with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: + for line in mod_conf: + match = pattern_name.match(line) + if match: + return match.group(1) + except FileNotFoundError: + pass + return None + +#If there are already .tr files in /locale, returns a list of their names +def get_existing_tr_files(folder): + out = [] + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + if pattern_tr_filename.search(name): + out.append(name) + return out + +# A series of search and replaces that massage a .po file's contents into +# a .tr file's equivalent +def process_po_file(text): + # The first three items are for unused matches + text = re.sub(r'#~ msgid "', "", text) + text = re.sub(r'"\n#~ msgstr ""\n"', "=", text) + text = re.sub(r'"\n#~ msgstr "', "=", text) + # comment lines + text = re.sub(r'#.*\n', "", text) + # converting msg pairs into "=" pairs + text = re.sub(r'msgid "', "", text) + text = re.sub(r'"\nmsgstr ""\n"', "=", text) + text = re.sub(r'"\nmsgstr "', "=", text) + # various line breaks and escape codes + text = re.sub(r'"\n"', "", text) + text = re.sub(r'"\n', "\n", text) + text = re.sub(r'\\"', '"', text) + text = re.sub(r'\\n', '@n', text) + # remove header text + text = re.sub(r'=Project-Id-Version:.*\n', "", text) + # remove double-spaced lines + text = re.sub(r'\n\n', '\n', text) + return text + +# Go through existing .po files and, if a .tr file for that language +# *doesn't* exist, convert it and create it. +# The .tr file that results will subsequently be reprocessed so +# any "no longer used" strings will be preserved. +# Note that "fuzzy" tags will be lost in this process. +def process_po_files(folder, modname): + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + code_match = pattern_po_language_code.match(name) + if code_match == None: + continue + language_code = code_match.group(1) + tr_name = modname + "." + language_code + ".tr" + tr_file = os.path.join(root, tr_name) + if os.path.exists(tr_file): + if params["verbose"]: + print(f"{tr_name} already exists, ignoring {name}") + continue + fname = os.path.join(root, name) + with open(fname, "r", encoding='utf-8') as po_file: + if params["verbose"]: + print(f"Importing translations from {name}") + text = process_po_file(po_file.read()) + with open(tr_file, "wt", encoding='utf-8') as tr_out: + tr_out.write(text) + +# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612 +# Creates a directory if it doesn't exist, silently does +# nothing if it already exists +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name): + lOut = [f"# textdomain: {mod_name}\n"] + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + sourceList.sort() + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + localizedStrings.sort() + lOut.append("") + lOut.append(source) + lOut.append("") + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if len(localizedString) > doublespace_threshold: + lOut.append("") + + + unusedExist = False + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n##### not used anymore #####\n") + if len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + #TODO remove comments here + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed.findall(text): + strings.append(s) + + for s in strings: + s = re.sub(r'"\.\.\s+"', "", s) + s = re.sub("@[^@=0-9]", "@@", s) + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +def import_tr_file(tr_file): + dOut = {} + text = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + if line[:3] == "###": + # Reset comment block if we hit a header + latest_comment_block = None + continue + if line[:1] == "#": + # Save the comment we're inside + if not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + continue + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + dOut[match.group(1)] = outval + return (dOut, text) + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file sets +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + for root, dirs, files in os.walk(folder): + for name in files: + if fnmatch.fnmatch(name, "*.lua"): + fname = os.path.join(root, name) + found = read_lua_file_strings(fname) + if params["verbose"]: + print(f"{fname}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(f"### {os.path.basename(fname)} ###") + dOut[s] = sources + + if len(dOut) == 0: + return None + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + process_po_files(folder, modname) + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print("Unable to find modname in folder " + folder) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir()] + for subfolder in subfolders: + update_mod(subfolder + "/") + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir()]: + update_folder(modfolder + "/") + + +main() diff --git a/mods/dfcaverns/ice_sprites/README.txt b/mods/dfcaverns/ice_sprites/README.txt new file mode 100644 index 0000000..0c0e62f --- /dev/null +++ b/mods/dfcaverns/ice_sprites/README.txt @@ -0,0 +1,20 @@ +Minetest Game mod: ice_sprites +============================ +Adds ice sprites, which can then be caught in a net (via the fireflies mod) and placed in bottles to provide light (via the vessels mod). + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + fireflies_firefly.png + fireflies_firefly_animated.png + fireflies_bottle.png + fireflies_bottle_animated.png + +fireflies_bottle.png and fireflies_bottle_animated.png are +modified from a texture by Vanessa Ezekowitz (CC BY-SA 3.0) + +converted to ice_sprite textures by FaceDeer, who simply changed the yellow dots to blue. \ No newline at end of file diff --git a/mods/dfcaverns/ice_sprites/init.lua b/mods/dfcaverns/ice_sprites/init.lua new file mode 100644 index 0000000..38a3ba1 --- /dev/null +++ b/mods/dfcaverns/ice_sprites/init.lua @@ -0,0 +1,182 @@ +ice_sprites = {} + +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +local ice_sprite_desc +local ice_sprite_usage +local ice_sprite_bottle_desc +local ice_sprite_bottle_usage + +local node_name_glass_bottle = df_dependencies.node_name_glass_bottle +local node_name_firefly = df_dependencies.node_name_fireflies + +if minetest.get_modpath("doc") then + ice_sprite_desc = S("Ice sprites are mysterious glowing insect-like creatures that appear to be made partly of crystallized water.") + if node_name_glass_bottle then + if node_name_firefly then + ice_sprite_usage = S("Ice sprites can be caught with nets and placed in bottles as sources of light and freezing cold.") + end + ice_sprite_bottle_desc = S("A bottle containing a captured ice sprite.") + ice_sprite_bottle_usage = S("Ice sprites radiate both light and freezing cold.") + end +end + +minetest.register_node("ice_sprites:ice_sprite", { + description = S("Ice Sprite"), + _doc_items_longdesc = ice_sprite_desc, + _doc_items_usagehelp = ice_sprite_usage, + drawtype = "plantlike", + tiles = {{ + name = "ice_sprites_ice_sprite_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "ice_sprites_ice_sprite.png", + wield_image = "ice_sprites_ice_sprite.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + is_ground_content = false, + walkable = false, + groups = {catchable = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "ice_sprites:ice_sprite"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 or math.random() > 0.5 then + minetest.set_node(pos, {name = "ice_sprites:hidden_ice_sprite"}) + end + minetest.get_node_timer(pos):start(math.random(20,40)) + end +}) + +minetest.register_node("ice_sprites:hidden_ice_sprite", { + description = S("Hidden Ice Sprite"), + drawtype = "airlike", + inventory_image = "ice_sprites_ice_sprite.png", + wield_image = "ice_sprites_ice_sprite.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "ice_sprites:ice_sprite", + groups = {not_in_creative_inventory = 1}, + floodable = true, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "ice_sprites:hidden_ice_sprite"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "ice_sprites:ice_sprite"}) + end + minetest.get_node_timer(pos):start(math.random(20,40)) + end +}) + +-- ice sprite in a bottle +if node_name_glass_bottle then + +local glass_sounds +if minetest.get_modpath("df_dependencies") then + glass_sounds = df_dependencies.sound_glass +end + +minetest.register_node("ice_sprites:ice_sprite_bottle", { + description = S("Ice Sprite in a Bottle"), + _doc_items_longdesc = ice_sprite_bottle_desc, + _doc_items_usagehelp = ice_sprite_bottle_usage, + inventory_image = "ice_sprites_bottle.png", + wield_image = "ice_sprites_bottle.png", + tiles = {{ + name = "ice_sprites_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + is_ground_content = false, + walkable = false, + groups = {dig_immediate = 3, attached_node = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, material_glass=1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = glass_sounds(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local ice_sprite_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + ice_sprite_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + ice_sprite_pos = lower_pos + end + + if ice_sprite_pos then + minetest.set_node(pos, {name = node_name_glass_bottle}) + minetest.set_node(ice_sprite_pos, {name = "ice_sprites:ice_sprite"}) + minetest.get_node_timer(ice_sprite_pos):start(1) + end + end +}) + +minetest.register_craft( { + type = "shapeless", + output = "ice_sprites:ice_sprite_bottle", + recipe = {"ice_sprites:ice_sprite", node_name_glass_bottle} +}) +end diff --git a/mods/dfcaverns/ice_sprites/license.txt b/mods/dfcaverns/ice_sprites/license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/mods/dfcaverns/ice_sprites/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/dfcaverns/ice_sprites/locale/ice_sprites.de.tr b/mods/dfcaverns/ice_sprites/locale/ice_sprites.de.tr new file mode 100644 index 0000000..23bc652 --- /dev/null +++ b/mods/dfcaverns/ice_sprites/locale/ice_sprites.de.tr @@ -0,0 +1,21 @@ +# textdomain: ice_sprites + + +### init.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A bottle containing a captured ice sprite.=Eine Flasche mit einem erbeuteten Eisgeist. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Hidden Ice Sprite=Verstecktes Eis-Sprite +Ice Sprite= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice Sprite in a Bottle=Ice Sprite in einer Flasche + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice sprites are mysterious glowing insect-like creatures that appear to be made partly of crystallized water.=Eisgeister sind mysteriös leuchtende insektenähnliche Wesen, die teilweise aus kristallisiertem Wasser zu bestehen scheinen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice sprites can be caught with nets and placed in bottles as sources of light and freezing cold.=Eisgeister können mit Netzen aufgefangen und als Lichtquelle und eiskalte in Flaschen abgefüllt werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice sprites radiate both light and freezing cold.=Eisgeister strahlen sowohl Licht als auch eiskalt aus. diff --git a/mods/dfcaverns/ice_sprites/locale/ice_sprites.it.tr b/mods/dfcaverns/ice_sprites/locale/ice_sprites.it.tr new file mode 100644 index 0000000..94781c7 --- /dev/null +++ b/mods/dfcaverns/ice_sprites/locale/ice_sprites.it.tr @@ -0,0 +1,21 @@ +# textdomain: ice_sprites + + +### init.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +A bottle containing a captured ice sprite.=Una bottiglia contenente uno sprite di ghiaccio catturato. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Hidden Ice Sprite=Sprite di ghiaccio nascosto +Ice Sprite= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice Sprite in a Bottle=Ice Sprite in una bottiglia + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice sprites are mysterious glowing insect-like creatures that appear to be made partly of crystallized water.=Gli sprite del ghiaccio sono misteriose creature luminose simili a insetti che sembrano essere costituite in parte da acqua cristallizzata. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice sprites can be caught with nets and placed in bottles as sources of light and freezing cold.=Gli sprite del ghiaccio possono essere catturati con reti e posti in bottiglie come fonti di luce e freddo gelido. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Ice sprites radiate both light and freezing cold.=Gli sprite del ghiaccio irradiano luce e freddo gelido. diff --git a/mods/dfcaverns/ice_sprites/locale/template.txt b/mods/dfcaverns/ice_sprites/locale/template.txt new file mode 100644 index 0000000..a127a54 --- /dev/null +++ b/mods/dfcaverns/ice_sprites/locale/template.txt @@ -0,0 +1,15 @@ +# textdomain: ice_sprites + + +### init.lua ### + +A bottle containing a captured ice sprite.= +Hidden Ice Sprite= +Ice Sprite= +Ice Sprite in a Bottle= + +Ice sprites are mysterious glowing insect-like creatures that appear to be made partly of crystallized water.= + +Ice sprites can be caught with nets and placed in bottles as sources of light and freezing cold.= + +Ice sprites radiate both light and freezing cold.= diff --git a/mods/dfcaverns/ice_sprites/mod.conf b/mods/dfcaverns/ice_sprites/mod.conf new file mode 100644 index 0000000..94a6385 --- /dev/null +++ b/mods/dfcaverns/ice_sprites/mod.conf @@ -0,0 +1,4 @@ +name = ice_sprites +description = Glowing blue firefly-like nodes +depends = +optional_depends = df_dependencies, doc \ No newline at end of file diff --git a/mods/dfcaverns/ice_sprites/textures/ice_sprites_bottle.png b/mods/dfcaverns/ice_sprites/textures/ice_sprites_bottle.png new file mode 100644 index 0000000..21f0a11 Binary files /dev/null and b/mods/dfcaverns/ice_sprites/textures/ice_sprites_bottle.png differ diff --git a/mods/dfcaverns/ice_sprites/textures/ice_sprites_bottle_animated.png b/mods/dfcaverns/ice_sprites/textures/ice_sprites_bottle_animated.png new file mode 100644 index 0000000..250c71c Binary files /dev/null and b/mods/dfcaverns/ice_sprites/textures/ice_sprites_bottle_animated.png differ diff --git a/mods/dfcaverns/ice_sprites/textures/ice_sprites_ice_sprite.png b/mods/dfcaverns/ice_sprites/textures/ice_sprites_ice_sprite.png new file mode 100644 index 0000000..51ba666 Binary files /dev/null and b/mods/dfcaverns/ice_sprites/textures/ice_sprites_ice_sprite.png differ diff --git a/mods/dfcaverns/ice_sprites/textures/ice_sprites_ice_sprite_animated.png b/mods/dfcaverns/ice_sprites/textures/ice_sprites_ice_sprite_animated.png new file mode 100644 index 0000000..6c7f78f Binary files /dev/null and b/mods/dfcaverns/ice_sprites/textures/ice_sprites_ice_sprite_animated.png differ diff --git a/mods/dfcaverns/looped_node_sound/init.lua b/mods/dfcaverns/looped_node_sound/init.lua new file mode 100644 index 0000000..3feb267 --- /dev/null +++ b/mods/dfcaverns/looped_node_sound/init.lua @@ -0,0 +1,121 @@ +looped_node_sound = {} + +--looped_node_sound.register({ +-- node_list = {}, +-- sound = , +-- radius = , +-- cycle_time =, +-- gain_per_node =, +-- max_gain =, +-- max_hear_distance =, +--}) + +looped_node_sound.register = function(def) + local handles = {} + local timer = 0 + + -- Parameters + local radius = def.radius or 8 -- node search radius around player + local cycle = def.cycle_time or 3 -- Cycle time for sound updates + assert(def.node_list, "[looped_sound_node] register function called without a node_list in its definition") + assert(def.sound, "[looped_sound_node] register function called without a sound in its definition") + local node_list = def.node_list + local sound = def.sound + local gain_per_node = def.gain_per_node or 0.125 + local gain_max = def.max_gain or 1.0 + local max_hear_distance = def.max_hear_distance or 32 + + -- Update sound for player + local function update_player_sound(player) + local player_name = player:get_player_name() + -- Search for nodes in radius around player + local ppos = player:get_pos() + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + local fpos, num = minetest.find_nodes_in_area( + areamin, + areamax, + node_list + ) + -- Total number of nodes in radius + local total = 0 + for _, count in pairs(num) do + total = total + count + end + -- Stop previous sound + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + end + -- If nodes + if total > 0 then + -- Find centre of node positions + local fposmid = fpos[1] + -- If more than 1 node + if #fpos > 1 then + local fposmin = areamax + local fposmax = areamin + for i = 1, #fpos do + local fposi = fpos[i] + if fposi.x > fposmax.x then + fposmax.x = fposi.x + end + if fposi.y > fposmax.y then + fposmax.y = fposi.y + end + if fposi.z > fposmax.z then + fposmax.z = fposi.z + end + if fposi.x < fposmin.x then + fposmin.x = fposi.x + end + if fposi.y < fposmin.y then + fposmin.y = fposi.y + end + if fposi.z < fposmin.z then + fposmin.z = fposi.z + end + end + fposmid = vector.divide(vector.add(fposmin, fposmax), 2) + end + -- Play sound + local handle = minetest.sound_play(sound, { + pos = fposmid, + to_player = player_name, + gain = math.min(total * gain_per_node, gain_max), + max_hear_distance = max_hear_distance, + loop = true -- In case of lag + }) + -- Store sound handle for this player + if handle then + handles[player_name] = handle + else + handles[player_name] = nil + end + else + handles[player_name] = nil + end + end + + -- Cycle for updating players sounds + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < cycle then + return + end + + timer = 0 + local players = minetest.get_connected_players() + for n = 1, #players do + update_player_sound(players[n]) + end + end) + + -- Stop sound and clear handle on player leave + minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + end) +end \ No newline at end of file diff --git a/mods/dfcaverns/looped_node_sound/license.txt b/mods/dfcaverns/looped_node_sound/license.txt new file mode 100644 index 0000000..400b1d2 --- /dev/null +++ b/mods/dfcaverns/looped_node_sound/license.txt @@ -0,0 +1,16 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest developers and contributors +Copyright (C) 2022 FaceDeer, pulled code out of the default game fire mod and made generic + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/mods/dfcaverns/looped_node_sound/mod.conf b/mods/dfcaverns/looped_node_sound/mod.conf new file mode 100644 index 0000000..49af6d9 --- /dev/null +++ b/mods/dfcaverns/looped_node_sound/mod.conf @@ -0,0 +1,4 @@ +name = looped_node_sound +description = A simple API for causing nodes to appear to be emitting a looped sound +depends = +optional_depends = \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/.gitattributes b/mods/dfcaverns/mapgen_helper/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/mods/dfcaverns/mapgen_helper/.gitignore b/mods/dfcaverns/mapgen_helper/.gitignore new file mode 100644 index 0000000..6fd0a37 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/.gitignore @@ -0,0 +1,41 @@ +# Compiled Lua sources +luac.out + +# luarocks build files +*.src.rock +*.zip +*.tar.gz + +# Object files +*.o +*.os +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo +*.def +*.exp + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + diff --git a/mods/dfcaverns/mapgen_helper/LICENSE b/mods/dfcaverns/mapgen_helper/LICENSE new file mode 100644 index 0000000..b9288fa --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/LICENSE @@ -0,0 +1,25 @@ +NOTE: several files in this mod were derived from Minetest code that is licensed under the GNU Lesser General Public License version 2.1 or later. These files have headers indicating the specific licensing of that file's code. + +The rest of this mod is licensed under the MIT license: + +MIT License + +Copyright (c) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/README.md b/mods/dfcaverns/mapgen_helper/README.md new file mode 100644 index 0000000..59ac9e3 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/README.md @@ -0,0 +1,177 @@ +Mapgen Helper +============= + +This mod provides a library of methods intended for use with other Minetest mapgen mods, automating routine tasks and giving tools to more easily perform mapgen operations. It's a bit of a random grab-bag, I put methods in here when I find that I use them frequently in other mods or when I just did a bunch of work solving a specific problem that could potentially be reused in future mods. + +Part of the purpose of this mod is to make sure these methods are as efficient as possible, allowing them to be used in mapgens or ABMs or other such contexts where speed is of the essence or where the code will be executed many millions of times. Several of these methods may seem trivial to accomplish already by using a combination of existing methods (for example `VoxelArea:get_y(vi)` can already be accomplished with `VoxelArea:position(i).y`) but in this mod they've been written to eliminate unnecessary intermediate steps and unused calculations. + +## Voxel Manipulator methods + +* `mapgen_helper.mapgen_vm_data()` + * returns vm, data, area + * Almost every mapgen mod does this operation first. This method retrieves the Voxel Manipulator for the generated map block, the voxel data array (automatically using a buffer internal to mapgen_helper to store it), and a VoxelArea for indexing the data array. + * Note that you still need to write the data array to the voxel manipulator at the end of map generation. + +* `mapgen_helper.mapgen_vm_data_param2()` + * returns vm, data, param2_data, area + * Almost identical to the previous method, this one also returns the param2 data array. + +# VoxelArea methods + +These methods are added to the existing VoxelArea LUA class. + +* `VoxelArea:iterp_xyz(minp, maxp)` + * Returns an iterator that gives not just the voxel index (vi), but also the x, y and z coordinates it represents. This lets you perform actions in your mapgen loop based on x, y and z coordinates without having to look them up from the voxel index. For example: + `for vi, x, y, z in area:iterp_xyz(minp, maxp) do` + +* `VoxelArea:iter_xyz(minx, miny, minz, maxx, maxy, maxz)` + * The same as above, but takes individual coordinate arguments instead of points. + +* `VoxelArea:iterp_yxz(minp, maxp)` + * Similar to the above, but the order of iteration is changed. Using this iterator, indices are visited in the +y direction along "columns". This is handy for mapgens that want to build stuff based on the nodes that are "below" the current node, for example if you're scanning through the map block looking for a walkable surface to place something on. + +* `VoxelArea:iter_yxz(minx, miny, minz, maxx, maxy, maxz)` + * Same as above, but takes individual coordinate arguments instead of points. + +* `VoxelArea:get_y(vi)` + * Returns the absolute y coordinate of the index provided. Useful for mapgens that want to do something at a specific elevation. + +* `VoxelArea:transform(area, vi)` + * Takes a VoxelArea and an index into that VoxelArea as parameters returns an index into its own VoxelArea, or nil if it's not in the voxelarea. This is useful when you've got two 3d data arrays that cover different volumes and would like to "map" values from one into the other. For example, if you've generated a 3d noise array using the mapgen's minp and maxp and want to map it onto the voxelmanipulator's emin and emax data array. + +## Biomes + +* `mapgen_helper.get_biome_def(biome_id)` + * Given an id from the biome map, returns a biome definition. Normally translating a biome_id into a biome definition requires several steps and lookups, this method caches the intermediate results internal to mapgen_helper to speed up the operation. + +* `mapgen_helper.get_biome_def_i(biomemap, minp, maxp, area, vi)` + * When iterating through a voxelmanip's data array it is common to want to check what biome a given index belongs to. This method automates that lookup. Give it the biomemap that was provided by get_mapgen_object("biomemap"), the minp and maxp parameters from register_on_generated, the VoxelArea representing the generated map chunk, and the voxel index, and this method returns the biome_def that that voxel index lies inside. + +## Node definitions + +* `mapgen_helper.buildable_to(c_node)` + *Given a node id, returns whether that node's definition is "buildable_to" + +* `mapgen_helper.is_ground_content(c_node)` + * Given a node id, returns whether that node's definition is "ground_content" + +## Noise manager + +* `mapgen_helper.perlin3d(name, minp, maxp, perlin_params)` + * Returns nvals_perlin, area + * Efficient generation and use of 3d perlin noise requires a bunch of steps that this method automates. It uses the "name" parameter to allocate buffers and generator objects in a table stored internally by mapgen_helper, if you're using multiple different noise fields in the same scope make sure to give them different names. + * The perlin_params argument is actually optional if you've already made a call to this method (or used the 'mapgen_helper.register_perlin' method below), the perlin parameters are stored when provided and can be looked back up again by mapgen_helper. + * The second return value is a VoxelArea for minp, maxp. + +* `mapgen_helper.perlin2d(name, minp, maxp, perlin_params)` + * Similar to the above method but for generating 2d noise. This method only returns the data array, it does not return a VoxelArea. + +* `mapgen_helper.register_perlin(name, perlin_params)` + * Pre-registering a perlin_params table is optional, any call to one of the above perlin methods with perlin_params provided will override the parameters registered here. + +## 2D array indexing + +* `mapgen_helper.index2d(minp, maxp, x, z)` + * Returns an index for getting values out of 2d arrays (such as heightmap, biomemap, heatmap, arrays generated by perlin2d, etc) given x and z coordinates. + * minp and maxp must be provided, these are the extents that were used when generating the 2d array. + +* `mapgen_helper.index2dp(minp, maxp, pos)` + * Version of the above that takes a pos instead of separate coordinates. pos.y is ignored. + +* `mapgen_helper.index2di(minp, maxp, area, vi)` + * Version of the above that indexes a 2d array based on the index in a 3d array. + +## Schematics + +*NOTE:* These methods operate on the LUA table format of schematic. To convert a .mts file into its lua representation, use `minetest.deserialize(minetest.serialize_schematic(schematic, "lua"))` to convert an .mts into a lua table. + +* `mapgen_helper.get_schematic_bounding_box(pos, schematic, rotation, flags)` + * Returns the minpos and maxpos of the bounding box that this schematic will be placed in given the rotation and flag parameters. Useful for testing whether a schematic will fit in a place before actually writing it to the data. + +* `mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, schematic, rotation, replacements, force_placement, flags)` + * Takes a lua-format schematic and applies it to the data and param2_data arrays produced by vmanip instead of being applied to the vmanip directly. Useful in a mapgen loop that's doing other things with the data before and after applying schematics. A VoxelArea for the data also needs to be provided. + * *NOTE:* As of the writing of this documentation, this method is still somewhat of a work-in-progress. It only supports the table version of the `flags` parameter (eg, `{["place_center_x"] = true}`), and doesn't support rotating nodes of paramtype2 `wallmounted`, `colorfacedir`, or `colorwallmounted`. Support is planned in the near future. + + * This method has some additional features that the existing minetest schematic-placement API doesn't support: + * node defs can have a "`place_on_condition(c_node)`" property defined. This is a function that is given the node content ID of the node the schematic is about to replace and returns true to indicate the schematic should replace it or false to indicate it should not. Useful, for example, in a schematic that should replace water but not earth (placing decorations on the bottom of the ocean), or a schematic that replaces all buildable_to nodes (to prevent tufts of grass from knocking holes in foundations). + * The schematic can have a "`center_pos`" position defined relative to the schematic's minpos that will be treated as the rotation and placement origin, unless overridden by the flags parameter. + * Returns true if the schematic was entirely contained within the given voxelarea, false otherwise. + +## Bounding boxes + +* `mapgen_helper.is_within_distance_box(pos1, pos2, distance)` + * A very cheap nearness test using Manhattan distance, useful as a fast first-pass check to see whether a more math-heavy test is needed. + +* `mapgen_helper.intersect(minpos1, maxpos1, minpos2, maxpos2)` + * Given two bounding boxes, returns a pair of points representing the minpos and maxpos of the intersection between them. If no intersection exists it returns nil. + +* `mapgen_helper.intersect_exists(minpos1, maxpos1, minpos2, maxpos2)` + * A cheaper version of the above method that only returns a true/false indication that an intersection exists. + +* `mapgen_helper.intersect_exists_xz(minpos1, maxpos1, minpos2, maxpos2)` + * An _even cheaper_ version of the above method that returns true/false based on whether the two bounding boxes overlap on the x-z plane. + +## Lines + +* `mapgen_helper.distance_to_segment(pos, start, end)` + * Returns the minimum distance from the point "pos" to any point along the line segment defined by the points "start" and "end" + +* `mapgen_helper.distance_to_path(pos, path)` + * Similar to the above, but "path" is a list of points forming a continuous series of line segments. Distance returned is the shortest distance to any segment in the list. + +## Random values + +* `mapgen_helper.get_random_points(minp, maxp, min_output_size, max_output_size)` + * Returns a consistent list of random points within a volume. Each call to this method will give the same set of points if the same parameters are provided, making this useful for placing things that extend outside of the currently-generated map chunk - for example, minp and maxp could be kilometers apart and the points designate the locations where mountains are to be placed. + +* `mapgen_helper.xz_consistent_randomp(pos)' + * Returns a random value based on the x and z coordinates of pos. The random value is always the same for the same x and z. + +* `mapgen_helper.xz_consistent_randomi(area, vi)` + * Same as above, but takes a VoxelArea and a voxel index as parameters. + +## Region tiling + +These methods are useful with things like `mapgen_helper.get_random_points`, allowing you to seamlessly place items that cross mapchunk boundaries by generating sets of random points for all adjacent regions. + +* `mapgen_helper.get_region_minp_xz(pos_xz, mapblocks)` + * Returns a consistent large region that doesn't cross mapgen block boundaries. Regions are `mapblocks * chunksize` nodes in width and depth. Ignores the y coordinate. + +* `mapgen_helper.get_nearest_regions(pos_xz, gridscale)` + + * Given a position and a region scale, returns the minp corners of the four regions that the player is closest to. + * For example, if we have a region scale of 6 and the parameter position is at "*", the four points marked "R" would be returned: + + |-----|-----|-----| |-----|-----|-----| |-----|-----|-----| + | | | | | | | | | | | | + | | | | | | | | | | | | + | | | | | | | | | | | | + | | | | | | | | | | | | + | | | | | | | | | | | | + |-----|-----|-----| |-----|-----|-----| |-----R-----R-----| + | | | | | | | | | | | | + | | | | | | | | | | *| | + | | | | | | | | | | | | + | | * | | | | *| | | | | | + | | | | | | | | | | | | + R-----R-----|-----| |-----R-----R-----| |-----R-----R-----| + | | | | | | | | | | | | + | | | | | | | | | | | | + | | | | | | | | | | | | + | | | | | | | | | | | | + | | | | | | | | | | | | + R-----R-----|-----| |-----R-----R-----| |-----|-----|-----| + +* `mapgen_helper.get_adjacent_regions(pos_xz, gridscale)` + * Similar to the above, but this method returns all adjacent regions and not just the nearest ones: + + |---|---|---| + | | | | + | | | | + R---R---R---| + | | | | + | | *| | + R---R---R---| + | | | | + | | | | + R---R---R---| diff --git a/mods/dfcaverns/mapgen_helper/bounding_boxes.lua b/mods/dfcaverns/mapgen_helper/bounding_boxes.lua new file mode 100644 index 0000000..6f452e0 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/bounding_boxes.lua @@ -0,0 +1,54 @@ +-- A cheap nearness test, using Manhattan distance. +mapgen_helper.is_within_distance_box = function(pos1, pos2, distance) + return math.abs(pos1.x-pos2.x) <= distance and + math.abs(pos1.y-pos2.y) <= distance and + math.abs(pos1.z-pos2.z) <= distance +end + +-- Finds an intersection between two axis-aligned bounding boxes (AABB)s, or nil if there's no overlap +mapgen_helper.intersect = function(minpos1, maxpos1, minpos2, maxpos2) + --checking x and z first since they're more likely to fail to overlap + if minpos1.x <= maxpos2.x and maxpos1.x >= minpos2.x and + minpos1.z <= maxpos2.z and maxpos1.z >= minpos2.z and + minpos1.y <= maxpos2.y and maxpos1.y >= minpos2.y then + + return { + x = math.max(minpos1.x, minpos2.x), + y = math.max(minpos1.y, minpos2.y), + z = math.max(minpos1.z, minpos2.z) + }, + { + x = math.min(maxpos1.x, maxpos2.x), + y = math.min(maxpos1.y, maxpos2.y), + z = math.min(maxpos1.z, maxpos2.z) + } + end + return nil, nil +end + +-- a simpler version of the above if all you care about is whether an intersection exists +mapgen_helper.intersect_exists = function(minpos1, maxpos1, minpos2, maxpos2) + --checking x and z first since they're more likely to fail to overlap + return (minpos1.x <= maxpos2.x and maxpos1.x >= minpos2.x and + minpos1.z <= maxpos2.z and maxpos1.z >= minpos2.z and + minpos1.y <= maxpos2.y and maxpos1.y >= minpos2.y) +end + +-- A version of the above that only cares about the x and z parameters, useful for example to lay out non-overlapping trees or buildings +mapgen_helper.intersect_exists_xz = function(minpos1, maxpos1, minpos2, maxpos2) + return (minpos1.x <= maxpos2.x and maxpos1.x >= minpos2.x and + minpos1.z <= maxpos2.z and maxpos1.z >= minpos2.z) +end + +-- Simply tests whether pos is within the bounding box defined by minpos and maxpos +local intersect_exists = mapgen_helper.intersect_exists +mapgen_helper.is_pos_within_box = function(pos, minpos, maxpos) + return intersect_exists(pos, pos, minpos, maxpos) +end + +-- Tests whether box 1 is entirely contained within box 2 +mapgen_helper.is_box_within_box = function(minpos1, maxpos1, minpos2, maxpos2) + return (minpos1.x >= minpos2.x and maxpos1.x <= maxpos2.x and + minpos1.z >= minpos2.z and maxpos1.z <= maxpos2.z and + minpos1.y >= minpos2.y and maxpos1.y <= maxpos2.y) +end \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/init.lua b/mods/dfcaverns/mapgen_helper/init.lua new file mode 100644 index 0000000..55b54a9 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/init.lua @@ -0,0 +1,84 @@ +mapgen_helper = {} + +mapgen_helper.mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) + +-- The "sidelen" used in almost every mapgen +mapgen_helper.block_size = tonumber(minetest.get_mapgen_setting("chunksize")) * 16 + +local MP = minetest.get_modpath(minetest.get_current_modname()) +dofile(MP.."/bounding_boxes.lua") +dofile(MP.."/random.lua") +dofile(MP.."/voxelarea_iterator.lua") +dofile(MP.."/voxeldata.lua") +dofile(MP.."/region_functions.lua") +dofile(MP.."/lines.lua") +dofile(MP.."/place_schematic.lua") +dofile(MP.."/noise_manager.lua") +dofile(MP.."/metrics.lua") +dofile(MP.."/log_location.lua") + +local map_data = {} +local map_param2_data = {} + +mapgen_helper.mapgen_vm_data = function() + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + vm:get_data(map_data) + return vm, map_data, VoxelArea:new{MinEdge=emin, MaxEdge=emax} +end + +mapgen_helper.mapgen_vm_data_param2 = function() + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + vm:get_data(map_data) + vm:get_param2_data(map_param2_data) + return vm, map_data, map_param2_data, VoxelArea:new{MinEdge=emin, MaxEdge=emax} +end + +mapgen_helper.biome_defs = nil +mapgen_helper.get_biome_def = function(biome_id) -- given an id from the biome map, returns a biome definition. + if mapgen_helper.biome_defs == nil then + -- First time this was asked for, populate the table. + -- Biome registration is only done at load time so we don't have to worry about new biomes invalidating this table + mapgen_helper.biome_defs = {} + for name, desc in pairs(minetest.registered_biomes) do + local i = minetest.get_biome_id(desc.name) + mapgen_helper.biome_defs[i] = desc + end + end + return mapgen_helper.biome_defs[biome_id] +end + +mapgen_helper.get_biome_def_i = function(biomemap, minp, maxp, area, vi) + if biomemap == nil then + return nil + end + local index2d = mapgen_helper.index2di(minp, maxp, area, vi) + return mapgen_helper.get_biome_def(biomemap[index2d]) +end + + +-- returns whether a content ID is "buildable to" +local buildable_to +mapgen_helper.buildable_to = function(c_node) + if buildable_to then return buildable_to[c_node] end + buildable_to = {} + for k, v in pairs(minetest.registered_nodes) do + if v.buildable_to then + buildable_to[minetest.get_content_id(k)] = true + end + end + return buildable_to[c_node] +end + +local is_ground_content = nil +mapgen_helper.is_ground_content = function(c_node) -- If false, the cave generator will not carve through this node + if is_ground_content ~= nil then + return is_ground_content[c_node] + end + is_ground_content = {} + for k, v in pairs(minetest.registered_nodes) do + if v.is_ground_content == true then + is_ground_content[minetest.get_content_id(k)] = true + end + end + return is_ground_content[c_node] +end \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/lines.lua b/mods/dfcaverns/mapgen_helper/lines.lua new file mode 100644 index 0000000..b695c13 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/lines.lua @@ -0,0 +1,76 @@ +-- algorithms taken from https://gist.github.com/reciprocum/4e3599a9563ec83ba2a63f5a6cdd39eb + +local dot = function(a, b) + return a.x * b.x + a.y * b.y + a.z * b.z +end + +local modulus = function(v) + return math.sqrt(dot(v,v)) +end + +local cross = function(a, b) + return {x= a.y * b.z - a.z * b.y, + y= a.z * b.x - a.x * b.z, + z= a.x * b.y - a.y * b.x} +end + +-- TODO: add bounding box tests to early-out on distant segments + +-- Calculates the distance from a point to a line segment. +-- v - the point +-- a - start of line segment +-- b - end of line segment + +mapgen_helper.distance_to_segment = function(v, a, b) + local ab = vector.subtract(b, a) + local av = vector.subtract(v, a) + + if dot(av, ab) <= 0.0 then -- Point is lagging behind start of the segment, so perpendicular distance is not viable. + return modulus(av) -- Use distance to start of segment instead. + end + + local bv = vector.subtract(v, b) + + if dot(bv, ab) >= 0.0 then -- Point is advanced past the end of the segment, so perpendicular distance is not viable. + return modulus(bv) -- Use distance to end of the segment instead. + end + + return modulus( cross(ab, av )) / modulus(ab) -- Perpendicular distance of point to segment. +end + +-- Calculates the euclidean distance from a point to a line segmented path. +-- v - the point from with the distance is measured +-- path - the array of points which, when sequentialy joined by line segments, form a path +-- returns the distance from v to the closest of the path forming line segments + +mapgen_helper.distance_to_path = function(v, path) + local minimum_distance = 2^32 -- Should be big enough for any practical minetest needs + for i = 2, table.getn(path) do + local distance = mapgen_helper.distance_to_segment(path[i-1], path[i]) + if (distance < minimum_distance) then + minimum_distance = distance + end + end + return minimum_distance +end + + +-- For digging out straight lines + +local dist_sq = function(x1, y1, z1, x2, y2, z2) + return (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 +end +local constrain = function(n, min_n, max_n) + if n < min_n then return min_n + elseif n > max_n then return max_n + else return n end +end +local dist_to_segment_squared = function(px, py, pz, lx1, ly1, lz1, lx2, ly2, lz2) + local line_dist = dist_sq(lx1, ly1, lz1, lx2, ly2, lz2) + if (line_dist == 0) then + return dist_sq(px, py, pz, lx1, ly1, lz1) + end + local t = ((px - lx1) * (lx2 - lx1) + (py - ly1) * (ly2 - ly1) + (pz - lz1) * (lz2 - lz1)) / line_dist + t = constrain(t, 0, 1) + return dist_sq(px, py, pz, lx1 + t * (lx2 - lx1), ly1 + t * (ly2 - ly1), lz1 + t * (lz2 - lz1)) +end \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/log_location.lua b/mods/dfcaverns/mapgen_helper/log_location.lua new file mode 100644 index 0000000..5f49546 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/log_location.lua @@ -0,0 +1,123 @@ +if not minetest.settings:get_bool("mapgen_helper_log_locations", false) then + mapgen_helper.log_first_location = function() + return + end + return +end + +mapgen_helper.log_location_enabled = true + +local worldpath = minetest.get_worldpath() +local locations = {} + +local save_data = function() + local file = io.open(worldpath.."/mapgen_helper_test_locations.json", "w") + if file then + local data = {} + data.locations = locations + file:write(minetest.serialize(data)) + file:close() + end +end + +local read_data = function() + local file = io.open(worldpath.."/mapgen_helper_test_locations.json", "r") + if file then + local data = minetest.deserialize(file:read("*all")) + locations = data.locations or {} + -- to upgrade legacy data that didn't have counts recorded + for _, location in pairs(locations) do + location.count = location.count or 1 + end + file:close() + else + locations = {} + end +end +read_data() + +-- logs only the first location of a particular type, ignores any subsequent ones +mapgen_helper.log_first_location = function(name, pos, desc, notes) + if not locations[name] then + locations[name] = {pos=pos, desc=desc, notes=notes, count = 1} + minetest.log("info", "[mapgen_helper] recorded location " .. name .. " at " .. minetest.pos_to_string(pos) .. " with desc '" .. (desc or "") .. "'") + save_data() + end +end + +mapgen_helper.log_location = function(name, pos, desc, notes) + local location = locations[name] or {pos=pos, desc=desc, notes=notes, count = 0} + locations[name] = location + location.pos = pos + location.desc = desc + location.notes = notes + location.count = location.count + 1 +end + + +minetest.register_chatcommand("mapgen_helper_loc", { + params = "[location name]", + description = "sends the player to the named test location, or lists recorded locations if no parameter is given", + privs = {server=true}, + func = function(name, param) + if not param or param == "" then + minetest.chat_send_player(name,"test locations available:") + local names = {} + for loc_name, loc in pairs(locations) do + table.insert(names, loc_name) + end + table.sort(names) + for number, loc_name in ipairs(names) do + minetest.chat_send_player(name, "\t"..loc_name .. " - " .. (locations[loc_name].desc or "") .. " - " .. tostring(locations[loc_name].count)) + end + return + end + local loc = locations[param] + if not loc then + minetest.chat_send_all("test location " .. param .. " not found") + return + end + local player = minetest.get_player_by_name(name) + player:set_pos(loc.pos) + if loc.notes then + minetest.chat_send_player(name, loc.notes) + end + end, +}) + +local tour_index = 0 +minetest.register_chatcommand("mapgen_helper_tour", { + params = "", + description = "cycles through the various recorded mapgen test locations, forward or backward", + privs = {server=true}, + func = function(name, param) + local names = {} + for name, loc in pairs(locations) do + table.insert(names, name) + end + table.sort(names) + if param == "prev" then + tour_index = tour_index - 1 + if tour_index < 1 then + tour_index = #names + end + else + tour_index = tour_index + 1 + if tour_index > #names then + tour_index = 1 + end + end + + local loc = locations[names[tour_index]] + local player = minetest.get_player_by_name(name) + player:set_pos(loc.pos) + minetest.chat_send_player(name, "Teleport to test location " .. names[tour_index]) + if loc.notes then + minetest.chat_send_player(name, loc.notes) + end + end +}) + +minetest.register_on_shutdown(function() + save_data() +end) \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/metrics.lua b/mods/dfcaverns/mapgen_helper/metrics.lua new file mode 100644 index 0000000..3e724d2 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/metrics.lua @@ -0,0 +1,113 @@ +if not minetest.settings:get_bool("mapgen_helper_record_time", false) then + mapgen_helper.record_time = function() + return + end + return +end + +local worldpath = minetest.get_worldpath() + +local persist = minetest.settings:get_bool("mapgen_helper_persist_recorded_time", false) +local filename = "mapgen_helper_metrics.lua" +local filename_old = "mapgen_helper_metrics_old.lua" + +local resolution = minetest.settings:get("mapgen_helper_record_time_resolution") or 0.1 + +local data = {} +data.times = {} + +if persist then + local read_data = loadfile(worldpath.."/"..filename) + if read_data then + data = read_data() + end +end + +if data.resolution ~= nil and data.resolution ~= resolution then + minetest.log("error", "[mapgen_helper] resolution of recorded metrics doesn't match saved metrics. Moving the old saved metrics to " .. filename_old) + local file, e = io.open(worldpath.."/"..filename_old, "w"); + if not file then + return error(e); + end + file:write(minetest.serialize(data)) + file:close() + data = {} + data.times = {} +end + +data.resolution = resolution +local times = data.times + +mapgen_helper.record_time = function(label, time) + local time_slot = math.ceil(time/resolution) + local label_data = times[label] or {} + local counts = label_data.counts or {} + local existing_count = counts[time_slot] or 0 + local total_time = label_data.total_time or 0 + + counts[time_slot] = existing_count + 1 + total_time = total_time + time + label_data.total_time = total_time + label_data.counts = counts + times[label] = label_data +end + +minetest.register_on_shutdown(function() + if next(times) == nil then + return + end + minetest.log("warning", "[mapgen_helper] Average chunk generation times:") + for name, label_data in pairs(times) do + minetest.log("warning", string.rep("-", 40)) + + local min_slot + local max_slot + local highest_slot_count = 0 + local total_count = 0 + local max_digits + + for slot, count in pairs(label_data.counts) do + if (not min_slot) or (slot < min_slot) then + min_slot = slot + end + if (not max_slot) or (slot > max_slot) then + max_slot = slot + end + if (not max_digits) or (#tostring(slot*resolution) > max_digits) then + max_digits = #tostring(slot*resolution) + end + total_count = total_count + count + highest_slot_count = math.max(highest_slot_count, count) + end + + local average = label_data.total_time / total_count + + minetest.log("warning", "For " .. name .. ":") + if min_slot == max_slot then + minetest.log("warning", "All chunks took between " .. (min_slot-1)*resolution .. " and " .. min_slot*resolution .. " seconds.") + else + for i = min_slot, max_slot do + local count = label_data.counts[i] or 0 + local spacing = max_digits - #tostring(i*resolution) + local count_string = "" + if count > 0 then + count_string = " " .. count + end + minetest.log("warning", i*resolution .. "s" .. string.rep(" ", spacing) .. ": " .. + string.rep("=", math.ceil((count / highest_slot_count) * 40)) .. count_string) + end + end + + minetest.log("warning", "Total number of chunks: " .. total_count .. ". Average time per chunk: " .. average .. " seconds.") + end + minetest.log("warning", string.rep("-", 40)) + + if persist then + local file, e = io.open(worldpath.."/"..filename, "w"); + if not file then + return error(e); + end + file:write(minetest.serialize(data)) + file:close() + end +end) diff --git a/mods/dfcaverns/mapgen_helper/mod.conf b/mods/dfcaverns/mapgen_helper/mod.conf new file mode 100644 index 0000000..975b454 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/mod.conf @@ -0,0 +1,2 @@ +name = mapgen_helper +description = A library of mapgen-related functions and tools. \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/noise_manager.lua b/mods/dfcaverns/mapgen_helper/noise_manager.lua new file mode 100644 index 0000000..d308f28 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/noise_manager.lua @@ -0,0 +1,114 @@ +local perlin_buffers = {} + +mapgen_helper.register_perlin = function(name, perlin_params) + perlin_buffers[name] = perlin_buffers[name] or {} + if perlin_buffers[name].perlin_params then + minetest.log("error", "mapgen_helper.register_perlin3d called for " .. name .. " when perlin parameters were already registered.") + return + end + perlin_buffers[name].perlin_params = perlin_params +end + +local get_buffer = function(name, sidelen, perlin_params) + perlin_buffers[name] = perlin_buffers[name] or {} + local buffer = perlin_buffers[name] + + if buffer.sidelen ~= nil and buffer.sidelen ~= sidelen then + buffer.nobj_perlin = nil -- parameter changed, force regenerate of object + end + buffer.sidelen = sidelen + + if perlin_params then + if buffer.perlin_params then + for k, v in pairs(buffer.perlin_params) do + if perlin_params[k] ~= v then + buffer.nobj_perlin = nil -- parameter changed, force regenerate of object + end + end + end + buffer.perlin_params = perlin_params -- record provided parameters + elseif buffer.perlin_params == nil then + minetest.log("error", "mapgen_helper.register_perlin3d called for " .. name .. " with no registered or provided perlin parameters.") + return + else + perlin_params = buffer.perlin_params -- retrieve recorded parameters + end + + buffer.last_used = minetest.get_gametime() + return buffer, perlin_params +end + +mapgen_helper.perlin3d = function(name, minp, maxp, perlin_params) + local minx = minp.x + local minz = minp.z + local sidelen = maxp.x - minp.x + 1 --length of a mapblock + local chunk_lengths = {x = sidelen, y = sidelen, z = sidelen} --table of chunk edges + + local buffer, perlin_params = get_buffer(name, sidelen, perlin_params) + + buffer.nvals_perlin_buffer = buffer.nvals_perlin_buffer or {} + buffer.nobj_perlin = buffer.nobj_perlin or minetest.get_perlin_map(perlin_params, chunk_lengths) + if buffer.nobj_perlin.get_3d_map_flat then + return buffer.nobj_perlin:get_3d_map_flat(minp, buffer.nvals_perlin_buffer), VoxelArea:new{MinEdge=minp, MaxEdge=maxp} + else + return buffer.nobj_perlin:get3dMap_flat(minp, buffer.nvals_perlin_buffer), VoxelArea:new{MinEdge=minp, MaxEdge=maxp} + end +end + +mapgen_helper.perlin2d = function(name, minp, maxp, perlin_params) + local minx = minp.x + local minz = minp.z + local sidelen = maxp.x - minp.x + 1 --length of a mapblock + local chunk_lengths = {x = sidelen, y = sidelen, z = sidelen} --table of chunk edges + + local buffer, perlin_params = get_buffer(name, sidelen, perlin_params) + + buffer.nvals_perlin_buffer = perlin_buffers[name].nvals_perlin_buffer or {} + buffer.nobj_perlin = perlin_buffers[name].nobj_perlin or minetest.get_perlin_map(perlin_params, chunk_lengths) + if buffer.nobj_perlin.get_2d_map_flat then + return buffer.nobj_perlin:get_2d_map_flat({x=minp.x, y=minp.z}, perlin_buffers[name].nvals_perlin_buffer) + else + return buffer.nobj_perlin:get2dMap_flat({x=minp.x, y=minp.z}, perlin_buffers[name].nvals_perlin_buffer) + end +end + +mapgen_helper.index2d = function(minp, maxp, x, z) + return x - minp.x + + (maxp.x - minp.x + 1) -- sidelen + *(z - minp.z) + + 1 +end + +mapgen_helper.index2dp = function(minp, maxp, pos) + return mapgen_helper.index2d(minp, maxp, pos.x, pos.z) +end + +-- Takes an index into a 3D area and returns the corresponding 2D index +-- assumes equal edge lengths +mapgen_helper.index2di = function(minp, maxp, area, vi) + local MinEdge = area.MinEdge + local zstride = area.zstride + local minpx = minp.x + local i = vi - 1 + local z = math.floor(i / zstride) + MinEdge.z + local x = math.floor((i % zstride) % area.ystride) + MinEdge.x + return x - minpx + + (maxp.x - minpx + 1) -- sidelen + *(z - minp.z) + + 1 +end + +-- If a noise buffer hasn't been used in 60 seconds, let garbage collection take it. +local time_elapsed = 0 +minetest.register_globalstep(function(dtime) + time_elapsed = time_elapsed + dtime + if time_elapsed > 60 then + local current_time = minetest.get_gametime() + time_elapsed = 0 + for _, buffer in pairs(perlin_buffers) do + if current_time - buffer.last_used > 60 then + buffer.nvals_perlin_buffer = nil + end + end + end +end) \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/place_schematic.lua b/mods/dfcaverns/mapgen_helper/place_schematic.lua new file mode 100644 index 0000000..dfa57c5 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/place_schematic.lua @@ -0,0 +1,319 @@ +-- These functions are a modification of the schematic placement code from src/mapgen/mg_schematic.cpp. +-- As such, this file is separately licened under the LGPL as follows: + +-- License of Minetest source code +------------------------------- + +--Minetest +--Copyright (C) 2010-2018 celeron55, Perttu Ahola + +--This program is free software; you can redistribute it and/or modify +--it under the terms of the GNU Lesser General Public License as published by +--the Free Software Foundation; either version 2.1 of the License, or +--(at your option) any later version. + +--This program is distributed in the hope that it will be useful, +--but WITHOUT ANY WARRANTY; without even the implied warranty of +--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +--GNU Lesser General Public License for more details. + +--You should have received a copy of the GNU Lesser General Public License along +--with this program; if not, write to the Free Software Foundation, Inc., +--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +local c_air = minetest.get_content_id("air") +local c_ignore = minetest.get_content_id("ignore") + +-- Table value = rotated facedir +-- Columns: 90, 180, 270 degrees rotation around vertical axis +-- Rotation is anticlockwise as seen from above (+Y) +local rotate_facedir_y = +{ + [0] = {1, 2, 3} , + [1] = {2, 3, 0} , + [2] = {3, 0, 1} , + [3] = {0, 1, 2} , + [4] = {13, 10, 19} , + [5] = {14, 11, 16} , + [6] = {15, 8, 17} , + [7] = {12, 9, 18} , + [8] = {17, 6, 15} , + [9] = {18, 7, 12} , + [10] = {19, 4, 13} , + [11] = {16, 5, 14} , + [12] = {9, 18, 7} , + [13] = {10, 19, 4} , + [14] = {11, 16, 5} , + [15] = {8, 17, 6} , + [16] = {5, 14, 11} , + [17] = {6, 15, 8} , + [18] = {7, 12, 9} , + [19] = {4, 13, 10} , + [20] = {23, 22, 21} , + [21] = {20, 23, 22} , + [22] = {21, 20, 23} , + [23] = {22, 21, 20} , +} + +local random_rotations = {0, 90, 180, 270} + +local rotate_param2 = function(param2, paramtype2, rotation) + param2 = param2 or 0 + if paramtype2 == "facedir" then + if rotation == 90 then + param2 = rotate_facedir_y[param2][1] + elseif rotation == 180 then + param2 = rotate_facedir_y[param2][2] + elseif rotation == 270 then + param2 = rotate_facedir_y[param2][3] + end + elseif paramtype2 == "wallmounted" then + --TODO + elseif paramtype2 == "colorfacedir" then + --TODO + elseif paramtype2 == "colorwallmounted" then + --TODO + end + + return param2 +end + + +local swap = function(size_x, size_z) + return size_z, size_x +end + +-- Returns the minpos and maxpos of the bounding box that this schematic will be placed in given +-- the rotation and flag parameters. Useful for testing whether a schematic will fit in a place before actually +-- writing it to the data, so that you can abort and try something else instead. +mapgen_helper.get_schematic_bounding_box = function(pos, schematic, rotation, flags) + flags = flags or {} + local size = schematic.size + local size_x = size.x + local size_y = size.y + local size_z = size.z + local center_pos = schematic.center_pos + + if center_pos and rotation ~= nil and rotation ~= 0 then + center_pos = vector.new(center_pos) -- make a copy so we can mess with it without damaging the schematic + if rotation == 90 then + center_pos.x, center_pos.z = swap(size_x - center_pos.x - 1, center_pos.z) + elseif rotation == 180 then + center_pos.z = size_z - center_pos.z - 1 + center_pos.x = size_x - center_pos.x - 1 + elseif rotation == 270 then + center_pos.x, center_pos.z = swap(center_pos.x, size_z - center_pos.z - 1) + end + end + + if rotation == 90 or rotation == 270 then + size_x, size_z = swap(size_x, size_z) + end + + local minpos = vector.new(pos) + + if center_pos then + if not flags.place_center_x then + minpos.x = minpos.x - center_pos.x + end + if not flags.place_center_y then + minpos.y = minpos.y - center_pos.y + end + if not flags.place_center_z then + minpos.z = minpos.z - center_pos.z + end + end + if flags.place_center_x then + minpos.x = math.floor(minpos.x - (size_x - 1) / 2) + end + if flags.place_center_y then + minpos.y = math.floor(minpos.y - (size_y - 1) / 2) + end + if flags.place_center_z then + minpos.z = math.floor(minpos.z - (size_z - 1) / 2) + end + + local maxpos = vector.add(minpos, {x=size_x-1, y=size_y-1, z=size_z-1}) + + return minpos, maxpos +end + +-- Takes a lua-format schematic and applies it to the data and param2_data arrays produced by vmanip instead of being applied to the vmanip directly. Useful in a mapgen loop that's doing other things with the data before and after applying schematics. A VoxelArea for the data also needs to be provided. + +-- Schematic enhancements beyond the basic Minetest API that work with this: +-- * node defs can have a "place_on_condition" property defined, which is a function that takes a node content ID parameter and returns true to indicate the schematic should replace it or false to indicate it should not. Useful for, for example, a schematic that should replace water but not stone (placing decorations on the bottom of the ocean), or a schematic that replaces all buildable_to nodes (to prevent tufts of grass from knocking holes in foundations). "data, area, vi" parameters are also provided if you want to get fancy and base the condition on surrounding nodes, but bear in mind that the schematic is in the process of being written already so some neighbors will already have been replaced with schematic nodes and some neighbors will be replaced in the future. +-- * schematic can have a "center_pos" position defined relative to the placement pos that will be treated as the rotation and placement origin, unless overridden by the flags parameter + +-- returns true if the schematic was entirely contained within the voxelarea, false otherwise. + +local empty_table = {} + +mapgen_helper.place_schematic_on_data = function(data, data_param2, area, pos, schematic, rotation, replacements, force_placement, flags) + pos = vector.new(pos) + replacements = replacements or empty_table + flags = flags or empty_table -- TODO: support all flags formats + if flags.force_placement ~= nil then + force_placement = flags.force_placement -- TODO: unclear which force_placement parameter should have prededence here + end + local center_pos = schematic.center_pos + if rotation == "random" then rotation = random_rotations[math.random(1,4)] end + + local schemdata = schematic.data + local slice_probs = schematic.yslice_prob or {} + + local size = schematic.size + local size_x = size.x + local size_y = size.y + local size_z = size.z + + local xstride = 1 + local ystride = size_x + local zstride = size_x * size_y + + if center_pos and rotation ~= nil and rotation ~= 0 then + center_pos = vector.new(center_pos) -- make a copy so we can mess with it without damaging the schematic + if rotation == 90 then + center_pos.x, center_pos.z = swap(size_x - center_pos.x - 1, center_pos.z) + elseif rotation == 180 then + center_pos.z = size_z - center_pos.z - 1 + center_pos.x = size_x - center_pos.x - 1 + elseif rotation == 270 then + center_pos.x, center_pos.z = swap(center_pos.x, size_z - center_pos.z - 1) + end + end + + local i_start, i_step_x, i_step_z + if rotation == 90 then + i_start = size_x + i_step_x = zstride + i_step_z = -xstride + size_x, size_z = swap(size_x, size_z) + elseif rotation == 180 then + i_start = zstride * (size_z - 1) + size_x + i_step_x = -xstride + i_step_z = -zstride + elseif rotation == 270 then + i_start = zstride * (size_z - 1) + 1 + i_step_x = -zstride + i_step_z = xstride + size_x, size_z = swap(size_x, size_z) + else + i_start = 1 + i_step_x = xstride + i_step_z = zstride + end + + -- Adjust placement position if necessary + if center_pos then + if not flags.place_center_x then + pos.x = pos.x - center_pos.x + end + if not flags.place_center_y then + pos.y = pos.y - center_pos.y + end + if not flags.place_center_z then + pos.z = pos.z - center_pos.z + end + end + if flags.place_center_x then + pos.x = math.floor(pos.x - (size_x - 1) / 2) + end + if flags.place_center_y then + pos.y = math.floor(pos.y - (size_y - 1) / 2) + end + if flags.place_center_z then + pos.z = math.floor(pos.z - (size_z - 1) / 2) + end + + local maxpos = vector.add(pos, {x=size_x-1, y=size_y-1, z=size_z-1}) + local minEdge = area.MinEdge + local maxEdge = area.MaxEdge + if not (pos.x <= maxEdge.x and maxpos.x >= minEdge.x and + pos.z <= maxEdge.z and maxpos.z >= minEdge.z and + pos.y <= maxEdge.y and maxpos.y >= minEdge.y) then + return false -- the bounding boxes of the area and the schematic don't overlap at all + end + + local contained_in_area = true + local on_place_callbacks = {} + + local y_map = pos.y + for y = 0, size_y-1 do + if slice_probs[y] == nil or slice_probs[y] == 255 or slice_probs[y] <= math.random(1, 255) then + for z = 0, size_z-1 do + local i = z * i_step_z + y * ystride + i_start + for x = 0, size_x-1 do + local vi = area:index(pos.x + x, y_map, pos.z + z) + if area:containsi(vi) then + local node_def = schemdata[i] + local node_name = replacements[node_def.name] or node_def.name + if node_name ~= "ignore" then + local placement_prob = node_def.prob or 255 + if placement_prob ~= 0 then + + local force_place_node = node_def.force_place + local place_on_condition = node_def.place_on_condition + local on_place = node_def.on_place + local old_node_id = data[vi] + + if (force_placement or force_place_node + or (place_on_condition and place_on_condition(old_node_id, data, area, vi)) + or (not place_on_condition and (old_node_id == c_air or old_node_id == c_ignore))) + and (placement_prob == 255 or math.random(1,255) <= placement_prob) + then + local registered_def = minetest.registered_nodes[node_name] + if registered_def ~= nil then + local paramtype2 = registered_def.paramtype2 + data[vi] = minetest.get_content_id(node_name) + data_param2[vi] = rotate_param2(node_def.param2, paramtype2, rotation) + + if on_place then + table.insert(on_place_callbacks, {on_place, vi}) + end + else + minetest.log("error", "mapgen_helper.place_schematic was given a schematic with unregistered node " .. tostring(node_name) .. " in it.") + end + end + end + end + else + contained_in_area = false -- schematic spilled over the edge of the area + end + i = i + i_step_x + end + end + end + y_map = y_map + 1 + end + + for k, callback in pairs(on_place_callbacks) do + callback[1](callback[2], data, data_param2, area, pos, schematic, rotation, replacements, force_placement, flags) + end + + return contained_in_area +end + +-- aborts schematic placement if it won't fit into the provided data +mapgen_helper.place_schematic_on_data_if_it_fits = function(data, data_param2, area, pos, schematic, rotation, replacements, force_placement, flags) + local minbound, maxbound = mapgen_helper.get_schematic_bounding_box(pos, schematic, rotation, flags) + if mapgen_helper.is_box_within_box(minbound, maxbound, area.MinEdge, area.MaxEdge) then + return mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, schematic, rotation, replacements, force_placement, flags) + end + return false +end + + +-- wraps the above for convenience, so you can use this style of schematic in non-mapgen contexts as well +mapgen_helper.place_schematic = function(pos, schematic, rotation, replacements, force_placement, flags) + local minpos, maxpos = mapgen_helper.get_schematic_bounding_box(pos, schematic, rotation, flags) + local vmanip = minetest.get_voxel_manip(minpos, maxpos) + local data = vmanip:get_data() + local data_param2 = vmanip:get_param2_data() + local emin, emax = vmanip:get_emerged_area() + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + local ret = mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, schematic, rotation, replacements, force_placement, flags) + vmanip:set_data(data) + vmanip:set_param2_data(data_param2) + vmanip:write_to_map() + return ret -- should always be true since we created the voxelarea to fit the schematic +end diff --git a/mods/dfcaverns/mapgen_helper/random.lua b/mods/dfcaverns/mapgen_helper/random.lua new file mode 100644 index 0000000..92d8055 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/random.lua @@ -0,0 +1,35 @@ + +-- Returns a consistent list of random points within a volume. +-- Each call to this method will give the same set of points if the same parameters are provided +mapgen_helper.get_random_points = function(minp, maxp, min_output_size, max_output_size) + local next_seed = math.random(1, 2^21) -- should be 2^31, but I've had a report that this causes a crash in the Lua interpreter on some systems. + math.randomseed(minetest.hash_node_position(minp) + mapgen_helper.mapgen_seed) + + local count = math.random(min_output_size, max_output_size) + local result = {} + while count > 0 do + local point = {} + point.x = math.random(minp.x, maxp.x) + point.y = math.random(minp.y, maxp.y) + point.z = math.random(minp.z, maxp.z) + table.insert(result, point) + count = count - 1 + end + + math.randomseed(next_seed) + return result +end + +-- Returns a random value based on the x and z coordinates of pos, always the same for the same x and z +mapgen_helper.xz_consistent_randomp = function(pos) + local next_seed = math.random(1, 2^21) -- should be 2^31, but I've had a report that this causes a crash in the Lua interpreter on some systems. + math.randomseed(pos.x + pos.z * 2 ^ 8) + local output = math.random() + math.randomseed(next_seed) + return output +end + +mapgen_helper.xz_consistent_randomi = function(area, vi) + local pos = area:position(vi) + return mapgen_helper.xz_consistent_randomp(pos) +end diff --git a/mods/dfcaverns/mapgen_helper/region_functions.lua b/mods/dfcaverns/mapgen_helper/region_functions.lua new file mode 100644 index 0000000..76810b8 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/region_functions.lua @@ -0,0 +1,78 @@ +local mapgen_chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + +-- For getting large regions that don't cross mapgen block boundaries +-- For some reason, map chunks generate with -32, -32, -32 as the "origin" minp. To make the large-scale grid align with map chunks it needs to be offset like this. +mapgen_helper.get_region_minp_xz = function(pos_xz, mapblocks) + local region_size = mapblocks * mapgen_chunksize * 16 + return {x = math.floor((pos.x+32) / region_size) * region_size - 32, y = 0, z = math.floor((pos.z+32) / region_size) * region_size - 32} +end + +-- Given a position and a region scale, returns the minp corners of the four regions that the player is closest to. +-- For example, if we have a region scale of 6 and the parameter position is at "*", the four points marked "R" would be returned. + +-- |-----|-----|-----| |-----|-----|-----| |-----|-----|-----| +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- |-----|-----|-----| |-----|-----|-----| |-----R-----R-----| +-- | | | | | | | | | | | | +-- | | | | | | | | | | *| | +-- | | | | | | | | | | | | +-- | | * | | | | *| | | | | | +-- | | | | | | | | | | | | +-- R-----R-----|-----| |-----R-----R-----| |-----R-----R-----| +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- | | | | | | | | | | | | +-- R-----R-----|-----| |-----R-----R-----| |-----|-----|-----| + +-- In this way you can be sure you aren't near an area you haven't tested. + +mapgen_helper.get_nearest_regions = function(pos_xz, gridscale) + local half_scale = gridscale / 2 + local grid_cell = {x = math.floor(pos_xz.x / gridscale) * gridscale, z = math.floor(pos_xz.z / gridscale) * gridscale} + local pos_internal = {x = pos_xz.x % gridscale, z = pos_xz.z % gridscale} + local result = {grid_cell} + local shift_x = gridscale + local shift_z = gridscale + if (pos_internal.x < half_scale) then + shift_x = -gridscale + end + if (pos_internal.z < half_scale) then + shift_z = -gridscale + end + + table.insert(result, {x = grid_cell.x + shift_x, z = grid_cell.z + shift_z}) + table.insert(result, {x = grid_cell.x + shift_x, z = grid_cell.z}) + table.insert(result, {x = grid_cell.x, z = grid_cell.z + shift_z}) + + return result +end + + +-- |---|---|---| +-- | | | | +-- | | | | +-- R---R---R---| +-- | | | | +-- | | *| | +-- R---R---R---| +-- | | | | +-- | | | | +-- R---R---R---| + +mapgen_helper.get_adjacent_regions = function(pos_xz, gridscale) + local grid_cell = {x = math.floor(pos_xz.x / gridscale) * gridscale, z = math.floor(pos_xz.z / gridscale) * gridscale} + local result = {grid_cell} + table.insert(result, {x = grid_cell.x + gridscale, z = grid_cell.y + gridscale}) + table.insert(result, {x = grid_cell.x + gridscale, z = grid_cell.y}) + table.insert(result, {x = grid_cell.x, z = grid_cell.y + gridscale}) + table.insert(result, {x = grid_cell.x - gridscale, z = grid_cell.y - gridscale}) + table.insert(result, {x = grid_cell.x - gridscale, z = grid_cell.y}) + table.insert(result, {x = grid_cell.x, z = grid_cell.y - gridscale}) + return result +end diff --git a/mods/dfcaverns/mapgen_helper/settingtypes.txt b/mods/dfcaverns/mapgen_helper/settingtypes.txt new file mode 100644 index 0000000..90a406f --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/settingtypes.txt @@ -0,0 +1,4 @@ +mapgen_helper_record_time (Enable time-taken logging) bool false +mapgen_helper_persist_recorded_time (Persist time-taken logging between server sessions) bool false +mapgen_helper_record_time_resolution (Resolution of time-taken histogram) float 0.1 +mapgen_helper_log_locations (Enable location logging) bool false \ No newline at end of file diff --git a/mods/dfcaverns/mapgen_helper/voxelarea_iterator.lua b/mods/dfcaverns/mapgen_helper/voxelarea_iterator.lua new file mode 100644 index 0000000..eb8502a --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/voxelarea_iterator.lua @@ -0,0 +1,75 @@ +-- These functions are a minor modification of the voxel area iterator defined in the built in voxelarea.lua lua code. +-- As such, this file is separately licened under the LGPL as follows: + +-- License of Minetest source code +------------------------------- + +--Minetest +--Copyright (C) 2010-2018 celeron55, Perttu Ahola + +--This program is free software; you can redistribute it and/or modify +--it under the terms of the GNU Lesser General Public License as published by +--the Free Software Foundation; either version 2.1 of the License, or +--(at your option) any later version. + +--This program is distributed in the hope that it will be useful, +--but WITHOUT ANY WARRANTY; without even the implied warranty of +--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +--GNU Lesser General Public License for more details. + +--You should have received a copy of the GNU Lesser General Public License along +--with this program; if not, write to the Free Software Foundation, Inc., +--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +function VoxelArea:iter_xyz(minx, miny, minz, maxx, maxy, maxz) + local i = self:index(minx, miny, minz) - 1 + + local x = minx - 1 -- subtracting one because x gets incremented before it gets returned the first time. + local xrange = maxx - minx + 1 + local nextaction = i + 1 + xrange + + local y = 0 + local yrange = maxy - miny + 1 + local yreqstride = self.ystride - xrange + + local z = 0 + local zrange = maxz - minz + 1 + local multistride = self.zstride - ((yrange - 1) * self.ystride + xrange) + + return function() + -- continue i until it needs to jump + i = i + 1 + x = x + 1 + if i ~= nextaction then + return i, x, y+miny, z+minz + end + + -- continue y until maxy is exceeded + y = y + 1 + x = minx -- new line + if y ~= yrange then + -- set i to index(minx, miny + y, minz + z) - 1 + i = i + yreqstride + nextaction = i + xrange + return i, x, y+miny, z+minz + end + + -- continue z until maxz is exceeded + z = z + 1 + if z == zrange then + -- cuboid finished, return nil + return + end + + -- set i to index(minx, miny, minz + z) - 1 + i = i + multistride + + y = 0 + nextaction = i + xrange + return i, x, y+miny, z+minz + end +end + +function VoxelArea:iterp_xyz(minp, maxp) + return self:iter_xyz(minp.x, minp.y, minp.z, maxp.x, maxp.y, maxp.z) +end diff --git a/mods/dfcaverns/mapgen_helper/voxeldata.lua b/mods/dfcaverns/mapgen_helper/voxeldata.lua new file mode 100644 index 0000000..a8068e0 --- /dev/null +++ b/mods/dfcaverns/mapgen_helper/voxeldata.lua @@ -0,0 +1,67 @@ +-- similar to iter_xyz, but iterates first along the y axis. Useful in mapgens that want to detect a vertical transition (eg, finding ground level) +function VoxelArea:iter_yxz(minx, miny, minz, maxx, maxy, maxz) + local i = self:index(minx, miny, minz) - self.ystride + + local x = minx + local y = miny - 1 + local z = minz + + return function() + y = y + 1 + + if y <= maxy then + i = i + self.ystride + return i, x, y, z + end + + y = miny + x = x + 1 + + if x <= maxx then + i = self:index(x, y, z) + return i, x, y, z + end + + x = minx + z = z + 1 + + if z <= maxz then + i = self:index(x, y, z) + return i, x, y, z + end + end +end + +function VoxelArea:iterp_yxz(minp, maxp) + return self:iter_yxz(minp.x, minp.y, minp.z, maxp.x, maxp.y, maxp.z) +end + +function VoxelArea:get_y(i) + return math.floor(((i - 1) % self.zstride) / self.ystride) + self.MinEdge.y +end + +-- Used to make transform more efficient by skipping a table creation +function VoxelArea:position_xyz(vi) + local MinEdge = self.MinEdge + local Zstride = self.zstride + local Ystride = self.ystride + vi = vi - 1 + local z = math.floor(vi / Zstride) + MinEdge.z + vi = vi % Zstride + local y = math.floor(vi / Ystride) + MinEdge.y + vi = vi % Ystride + local x = vi + MinEdge.x + return x, y, z +end + +-- Takes another voxelarea and an index in it and transforms it into an index into its own +-- voxelarea, or nil if it's not in the voxelarea. This is useful when you've got, for example, +-- a mapgen's voxelmanipulator and a perlin noise array covering the map block but not the entire +-- emerged volume. +function VoxelArea:transform(area, vi) + local x,y,z = area:position_xyz(vi) + if self:contains(x,y,z) then + return self:index(x,y,z) + end + return nil +end \ No newline at end of file diff --git a/mods/dfcaverns/mine_gas/LICENSE.txt b/mods/dfcaverns/mine_gas/LICENSE.txt new file mode 100644 index 0000000..e9fd4ab --- /dev/null +++ b/mods/dfcaverns/mine_gas/LICENSE.txt @@ -0,0 +1,24 @@ +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/mine_gas/init.lua b/mods/dfcaverns/mine_gas/init.lua new file mode 100644 index 0000000..c946879 --- /dev/null +++ b/mods/dfcaverns/mine_gas/init.lua @@ -0,0 +1,215 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +dofile(modpath.."/wisp.lua") + +local gas_desc +local gas_usage + +local seep_desc +local seep_usage + +if minetest.get_modpath("doc") then + gas_desc = S("Gaseous hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.") + gas_usage = S("Gas is highly hazardous. Heavier than air, it pools in deep caverns and asphyxiates the unwary.") + if minetest.get_modpath("tnt") then + gas_usage = gas_usage .. " " .. S("When exposed to air and an ignition source it can produce a deadly explosion.") + end + + seep_desc = S("Some coal deposits have cracks that seep a steady flow of mine gas.") + seep_usage = S("Mining out such a deposit seals the crack.") +end + + +minetest.register_alias("oil:gas", "mine_gas:gas") +minetest.register_alias("oil:gas_seep", "mine_gas:gas_seep") + +minetest.register_node("mine_gas:gas", { + description = S("Mine Gas"), + _doc_items_longdesc = gas_desc, + _doc_items_usagehelp = gas_usage, + walkable = false, + pointable = false, + diggable = false, + is_ground_content = false, + buildable_to = true, + drawtype = "glasslike", + drowning = 1, + post_effect_color = {a = 20, r = 20, g = 20, b = 250}, + tiles = {"mine_gas.png^[opacity:28"}, + use_texture_alpha = "blend", + groups = {not_in_creative_inventory=1, ropes_can_extend_into=1, not_solid=1, not_opaque=1}, + paramtype = "light", + drop = {}, + sunlight_propagates = true, + --on_blast = function() end, -- unaffected by explosions +}) + +minetest.register_node("mine_gas:gas_seep", { + description = S("Gas Seep"), + _doc_items_longdesc = seep_desc, + _doc_items_usagehelp = seep_usage, + tiles = {df_dependencies.texture_stone.."^"..df_dependencies.texture_mineral_coal.."^[combine:16x80:0,-16=crack_anylength.png"}, + groups = {cracky = 3, pickaxey=1, building_block=1, material_stone=1}, + drop = df_dependencies.node_name_coal_lump, + sounds = df_dependencies.sound_stone(), + is_ground_content = true, + _mcl_blast_resistance = 5, + _mcl_hardness = 3, +}) + +minetest.register_on_dignode(function(pos, oldnode, digger) + if minetest.get_item_group(oldnode.name, "digtron") > 0 then + -- skip digtron moved nodes + return; + end + + local np = minetest.find_node_near(pos, 1,{"mine_gas:gas"}) + if np ~= nil then + minetest.set_node(pos, {name = "mine_gas:gas"}) + return + end +end) + +local directions = { + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, +} + +local gas_node = {name="mine_gas:gas"} +minetest.register_abm({ + label = "mine_gas:gas movement", + nodenames = {"mine_gas:gas"}, + neighbors = {"group:liquid", "air"}, + interval = 1.0, + chance = 1, + catch_up = true, + action = function(pos, node) + local next_pos = {x=pos.x, y=pos.y+1, z=pos.z} + local next_node = minetest.get_node(next_pos) + if minetest.get_item_group(next_node.name, "liquid") > 0 then + minetest.swap_node(next_pos, gas_node) + minetest.swap_node(pos, next_node) + else + next_pos.y = pos.y-1 + next_node = minetest.get_node(next_pos) + if next_node.name == "air" then + minetest.swap_node(next_pos, gas_node) + minetest.swap_node(pos, next_node) + else + local dir = directions[math.random(1,4)] + local next_pos = vector.add(pos, dir) + local next_node = minetest.get_node(next_pos) + if next_node.name == "air" or minetest.get_item_group(next_node.name, "liquid") > 0 then + if next_node.name == "air" or math.random() < 0.5 then -- gas never "climbs" above air. + minetest.swap_node(next_pos, gas_node) + minetest.swap_node(pos, next_node) + else + -- this can get gas to rise up out of the surface of liquid, preventing it from forming a permanent hole. + next_pos.y = next_pos.y + 1 + next_node = minetest.get_node(next_pos) + if next_node.name == "air" then + minetest.swap_node(next_pos, gas_node) + minetest.swap_node(pos, next_node) + end + end + end + end + end + end, +}) + +local soundfile_cool_lava = df_dependencies.soundfile_cool_lava + +minetest.register_abm({ + label = "mine_gas:gas snuffing torches", + nodenames = {"group:torch"}, + neighbors = {"mine_gas:gas"}, + interval = 1.0, + chance = 1, + catch_up = true, + action = function(pos, node) + if not minetest.find_node_near(pos, 1, "air") then + local torch_node = minetest.get_node(pos) + local drops = minetest.get_node_drops(torch_node.name, "") + for _, dropped_item in pairs(drops) do + minetest.add_item(pos, dropped_item) + end + minetest.set_node(pos, {name="mine_gas:gas"}) + minetest.sound_play( + soundfile_cool_lava, + {pos = pos, max_hear_distance = 16, gain = 0.1} + ) + end + end, +}) + +local tnt_boom = df_dependencies.tnt_boom + +if tnt_boom then + minetest.register_abm({ + label = "mine_gas:gas ignition", + nodenames = {"group:torch", "group:igniter", "group:fire"}, -- checking for ignition sources because there will be fewer than there are gas nodes + neighbors = {"mine_gas:gas"}, + interval = 1.0, + chance = 1, + catch_up = true, + action = function(pos, node) + if minetest.find_node_near(pos, 1, "air") then + tnt_boom(pos, {radius=1, damage_radius=6}) + -- One in a hundred explosions will spawn a gas wisp + if math.random() < 0.01 then + minetest.set_node(pos, {name="mine_gas:gas_wisp"}) + end + end + end, + }) +end + +local orthogonal = { + {x=0,y=0,z=1}, + {x=0,y=1,z=0}, + {x=1,y=0,z=0}, + {x=0,y=0,z=-1}, + {x=0,y=-1,z=0}, + {x=-1,y=0,z=0}, +} + +local stone_with_coal = df_dependencies.node_name_stone_with_coal +minetest.register_lbm({ + label = "shut down gas seeps near lava", + name = "mine_gas:shut_down_lava_adjacent", + nodenames = {"mine_gas:gas_seep"}, + run_at_every_load = true, + action = function(pos, node) + minetest.after(math.random()*60, function() + if minetest.find_node_near(pos, 30, "group:lava") then + minetest.set_node(pos, {name=stone_with_coal}) + end + end) + end, +}) + +minetest.register_abm({ + label = "mine_gas:gas seep", + nodenames = {"mine_gas:gas_seep"}, + neighbors = {"air"}, + interval = 1.0, + chance = 1, + catch_up = true, + action = function(pos, node) + local target_pos = vector.add(pos,orthogonal[math.random(1,6)]) + if minetest.get_node(target_pos).name == "air" then + minetest.swap_node(target_pos, {name="mine_gas:gas"}) + if math.random() < 0.5 then + minetest.sound_play( + "mine_gas_seep_hiss", + {pos = pos, max_hear_distance = 8, gain = 0.05} + ) + end + end + end, +}) \ No newline at end of file diff --git a/mods/dfcaverns/mine_gas/locale/mine_gas.de.tr b/mods/dfcaverns/mine_gas/locale/mine_gas.de.tr new file mode 100644 index 0000000..802821b --- /dev/null +++ b/mods/dfcaverns/mine_gas/locale/mine_gas.de.tr @@ -0,0 +1,36 @@ +# textdomain: mine_gas + + +### init.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gas Seep=Gassickern + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gas is highly hazardous. Heavier than air, it pools in deep caverns and asphyxiates the unwary.=Gas ist sehr gefährlich. Schwerer als Luft, sammelt es sich in tiefen Höhlen und erstickt die Unachtsamen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gaseous hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.=Gasförmige Kohlenwasserstoffe, die aus dem Abfall langer toter Pflanzen und Tiere entstehen, die durch Hitze und Druck tief in der Erde verarbeitet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mine Gas=Minengas +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mining out such a deposit seals the crack.=Durch den Abbau einer solchen Ablagerung wird der Riss versiegelt. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Some coal deposits have cracks that seep a steady flow of mine gas.=Einige Kohlevorkommen weisen Risse auf, die einen stetigen Fluss von Minengas versickern lassen. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When exposed to air and an ignition source it can produce a deadly explosion.=Wenn es Luft und einer Zündquelle ausgesetzt wird, kann es zu einer tödlichen Explosion kommen. + + +### wisp.lua ### + +Gas Wisp= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gas Wisps have no known use, and fortunately they are not hostile or very dangerous.=Gas-Wisps haben keine bekannte Verwendung und sind glücklicherweise nicht feindlich oder sehr gefährlich. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mysterious blue flames may occasionally be found flickering on the edges of oil lakes, burning without oxygen and seeming to maintain their size as they drift about through the unbreathable atmosphere.=Gelegentlich flackern mysteriöse blaue Flammen an den Rändern von Ölseen, brennen ohne Sauerstoff und scheinen ihre Größe beizubehalten, wenn sie durch die unatmbare Atmosphäre treiben. + diff --git a/mods/dfcaverns/mine_gas/locale/mine_gas.it.tr b/mods/dfcaverns/mine_gas/locale/mine_gas.it.tr new file mode 100644 index 0000000..930407d --- /dev/null +++ b/mods/dfcaverns/mine_gas/locale/mine_gas.it.tr @@ -0,0 +1,35 @@ +# textdomain: mine_gas + + +### init.lua ### + +Gas Seep= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gas is highly hazardous. Heavier than air, it pools in deep caverns and asphyxiates the unwary.=Il gas è altamente pericoloso. Più pesante dell'aria, si accumula in profonde caverne e asfissia gli incauti. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gaseous hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.=Idrocarburi gassosi formati dai detriti di piante e animali morti da tempo lavorati dal calore e dalla pressione nelle profondità della terra. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mine Gas=Il mio gas +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mining out such a deposit seals the crack.=L'estrazione di un tale deposito sigilla la fessura. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Some coal deposits have cracks that seep a steady flow of mine gas.=Alcuni depositi di carbone hanno crepe che filtrano un flusso costante di gas di miniera. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +When exposed to air and an ignition source it can produce a deadly explosion.=Se esposto all'aria e ad una fonte di ignizione può produrre un'esplosione mortale. + + +### wisp.lua ### + +Gas Wisp= + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Gas Wisps have no known use, and fortunately they are not hostile or very dangerous.=I Gas Wisps non hanno un uso noto e fortunatamente non sono ostili o molto pericolosi. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Mysterious blue flames may occasionally be found flickering on the edges of oil lakes, burning without oxygen and seeming to maintain their size as they drift about through the unbreathable atmosphere.=Occasionalmente si possono trovare misteriose fiamme blu tremolanti sui bordi dei laghi petroliferi, che bruciano senza ossigeno e sembrano mantenere le loro dimensioni mentre vagano nell'atmosfera irrespirabile. + diff --git a/mods/dfcaverns/mine_gas/locale/template.txt b/mods/dfcaverns/mine_gas/locale/template.txt new file mode 100644 index 0000000..5edc437 --- /dev/null +++ b/mods/dfcaverns/mine_gas/locale/template.txt @@ -0,0 +1,27 @@ +# textdomain: mine_gas + + +### init.lua ### + +Gas Seep= + +Gas is highly hazardous. Heavier than air, it pools in deep caverns and asphyxiates the unwary.= + +Gaseous hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.= + +Mine Gas= +Mining out such a deposit seals the crack.= + +Some coal deposits have cracks that seep a steady flow of mine gas.= + +When exposed to air and an ignition source it can produce a deadly explosion.= + + +### wisp.lua ### + +Gas Wisp= + +Gas Wisps have no known use, and fortunately they are not hostile or very dangerous.= + +Mysterious blue flames may occasionally be found flickering on the edges of oil lakes, burning without oxygen and seeming to maintain their size as they drift about through the unbreathable atmosphere.= + diff --git a/mods/dfcaverns/mine_gas/mod.conf b/mods/dfcaverns/mine_gas/mod.conf new file mode 100644 index 0000000..dfd8d6f --- /dev/null +++ b/mods/dfcaverns/mine_gas/mod.conf @@ -0,0 +1,4 @@ +name = mine_gas +description = An explosive, asphyxiating heavier-than-air gas to add hazards to caves +depends = df_dependencies +optional_depends = tnt, doc \ No newline at end of file diff --git a/mods/dfcaverns/mine_gas/sounds/license.txt b/mods/dfcaverns/mine_gas/sounds/license.txt new file mode 100644 index 0000000..15b06ce --- /dev/null +++ b/mods/dfcaverns/mine_gas/sounds/license.txt @@ -0,0 +1,2 @@ +mine_gas_seep_hiss.1 is from https://freesound.org/people/wubitog/sounds/234782/ under the public domain (CC0) +mine_gas_seep_hiss.2 is from https://freesound.org/people/kgatto/sounds/240263/ by kgatto under the CC-BY-3.0 license \ No newline at end of file diff --git a/mods/dfcaverns/mine_gas/sounds/mine_gas_seep_hiss.1.ogg b/mods/dfcaverns/mine_gas/sounds/mine_gas_seep_hiss.1.ogg new file mode 100644 index 0000000..a3b5f7b Binary files /dev/null and b/mods/dfcaverns/mine_gas/sounds/mine_gas_seep_hiss.1.ogg differ diff --git a/mods/dfcaverns/mine_gas/sounds/mine_gas_seep_hiss.2.ogg b/mods/dfcaverns/mine_gas/sounds/mine_gas_seep_hiss.2.ogg new file mode 100644 index 0000000..4e8dfa2 Binary files /dev/null and b/mods/dfcaverns/mine_gas/sounds/mine_gas_seep_hiss.2.ogg differ diff --git a/mods/dfcaverns/mine_gas/textures/license.txt b/mods/dfcaverns/mine_gas/textures/license.txt new file mode 100644 index 0000000..06a0c97 --- /dev/null +++ b/mods/dfcaverns/mine_gas/textures/license.txt @@ -0,0 +1 @@ +All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. diff --git a/mods/dfcaverns/mine_gas/textures/mine_gas.png b/mods/dfcaverns/mine_gas/textures/mine_gas.png new file mode 100644 index 0000000..d195c89 Binary files /dev/null and b/mods/dfcaverns/mine_gas/textures/mine_gas.png differ diff --git a/mods/dfcaverns/mine_gas/textures/mine_gas_wisp.png b/mods/dfcaverns/mine_gas/textures/mine_gas_wisp.png new file mode 100644 index 0000000..7c9f7d1 Binary files /dev/null and b/mods/dfcaverns/mine_gas/textures/mine_gas_wisp.png differ diff --git a/mods/dfcaverns/mine_gas/textures/mine_gas_wisp_inventory.png b/mods/dfcaverns/mine_gas/textures/mine_gas_wisp_inventory.png new file mode 100644 index 0000000..ddf4de1 Binary files /dev/null and b/mods/dfcaverns/mine_gas/textures/mine_gas_wisp_inventory.png differ diff --git a/mods/dfcaverns/mine_gas/wisp.lua b/mods/dfcaverns/mine_gas/wisp.lua new file mode 100644 index 0000000..2b0f2ac --- /dev/null +++ b/mods/dfcaverns/mine_gas/wisp.lua @@ -0,0 +1,89 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +local wisp_desc +local wisp_usage + +if minetest.get_modpath("doc") then + wisp_desc = S("Mysterious blue flames may occasionally be found flickering on the edges of oil lakes, burning without oxygen and seeming to maintain their size as they drift about through the unbreathable atmosphere.") + wisp_usage = S("Gas Wisps have no known use, and fortunately they are not hostile or very dangerous.") +end + +minetest.register_node("mine_gas:gas_wisp", { + description = S("Gas Wisp"), + _doc_items_longdesc = wisp_desc, + _doc_items_usagehelp = wisp_usage, + walkable = false, + is_ground_content = false, + diggable = false, + buildable_to = true, + drawtype = "plantlike", + waving = 1, + drowning = 1, + damage_per_second = 4, + post_effect_color = {a = 20, r = 20, g = 20, b = 250}, + tiles = {{name = "mine_gas_wisp.png", animation = + { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5, + }, + }}, + light_source = 10, + use_texture_alpha = "clip", + groups = {not_in_creative_inventory=0}, + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 0, + -- * bit 4 (0x10, decimal 16) - Makes the plant mesh 1.4x larger + inventory_image = "mine_gas_wisp_inventory.png", + drop = {}, + sunlight_propagates = true, + on_blast = function() end, -- unaffected by explosions + _mcl_blast_resistance = 3600000, + _mcl_hardness = 0, +}) + +minetest.register_abm({ + label = "mine_gas:gas wisp movement", + nodenames = {"mine_gas:gas_wisp"}, + neighbors = {"mine_gas:gas"}, + interval = 1.0, + chance = 10, + catch_up = true, + action = function(pos, node) + local next_pos = {x=pos.x+math.random(1,3)-2, y=pos.y+math.random(1,3)-2, z=pos.z+math.random(1,3)-2} + local next_node = minetest.get_node(next_pos) + if next_node.name == "mine_gas:gas" then + minetest.swap_node(next_pos, node) + minetest.swap_node(pos, next_node) + end + pos = next_pos + + end, +}) + +minetest.register_abm({ + label = "mine_gas:gas wisp extinguish", + nodenames = {"mine_gas:gas_wisp"}, + neighbors = {"air"}, + interval = 10, + chance = 1, + catch_up = true, + action = function(pos, node) + for y = -1, 1 do + for x = -1, 1 do + for z = -1, 1 do + local node_name = minetest.get_node({x=pos.x+x, y=pos.y+y, z=pos.z+z}).name + if node_name == "mine_gas:gas" or minetest.get_item_group(node_name, "flammable") > 0 then + -- there's gas or a flammable adjacent, don't extinguish + return + end + end + end + end + -- no gas adjacent, extinguish + minetest.set_node(pos, {name="air"}) + end, +}) \ No newline at end of file diff --git a/mods/dfcaverns/minetestmapper colors.txt b/mods/dfcaverns/minetestmapper colors.txt new file mode 100644 index 0000000..1479da8 --- /dev/null +++ b/mods/dfcaverns/minetestmapper colors.txt @@ -0,0 +1,312 @@ +df_farming:cave_straw 173 186 188 +df_farming:cave_wheat_1 154 200 200 +df_farming:cave_wheat_2 164 200 200 +df_farming:cave_wheat_3 179 204 204 +df_farming:cave_wheat_4 187 204 204 +df_farming:cave_wheat_5 188 200 200 +df_farming:cave_wheat_6 187 193 193 +df_farming:cave_wheat_7 196 196 196 +df_farming:cave_wheat_8 207 207 207 +df_farming:cave_wheat_seed 112 205 205 +df_farming:cavern_fungi 169 144 184 +df_farming:dead_fungus 135 117 104 +df_farming:dimple_cup_1 56 48 154 +df_farming:dimple_cup_2 78 72 151 +df_farming:dimple_cup_3 79 73 154 +df_farming:dimple_cup_4 74 67 156 +df_farming:dimple_cup_seed 45 36 152 +df_farming:dwarven_syrup_flowing 175 124 79 +df_farming:dwarven_syrup_source 175 124 79 +df_farming:pig_tail_1 177 177 177 +df_farming:pig_tail_2 180 180 180 +df_farming:pig_tail_3 181 181 181 +df_farming:pig_tail_4 183 183 183 +df_farming:pig_tail_5 183 183 183 +df_farming:pig_tail_6 184 184 184 +df_farming:pig_tail_7 184 184 184 +df_farming:pig_tail_8 185 185 185 +df_farming:pig_tail_seed 157 157 157 +df_farming:pig_tail_trampled 148 147 147 +df_farming:plump_helmet_1 127 0 127 +df_farming:plump_helmet_2 127 0 127 +df_farming:plump_helmet_3 127 0 127 +df_farming:plump_helmet_4 127 0 127 +df_farming:plump_helmet_4_picked 127 0 127 +df_farming:plump_helmet_spawn 127 0 127 +df_farming:quarry_bush_1 68 68 68 +df_farming:quarry_bush_2 91 91 91 +df_farming:quarry_bush_3 77 77 77 +df_farming:quarry_bush_4 90 90 90 +df_farming:quarry_bush_5 82 82 82 +df_farming:quarry_bush_seed 187 124 80 +df_farming:sweet_pod_1 212 212 212 +df_farming:sweet_pod_2 215 215 215 +df_farming:sweet_pod_3 215 215 215 +df_farming:sweet_pod_4 218 218 218 +df_farming:sweet_pod_5 216 190 190 +df_farming:sweet_pod_6 220 165 165 +df_farming:sweet_pod_seed 255 167 167 +df_farming:wheat_trampled 209 216 220 +df_mapitems:big_crystal 202 56 52 +df_mapitems:big_crystal_30 202 56 52 +df_mapitems:big_crystal_30_45 202 56 52 +df_mapitems:castle_coral 126 117 45 +df_mapitems:castle_coral_skeleton 235 230 215 +df_mapitems:cave_coral_1 101 73 70 +df_mapitems:cave_coral_2 101 73 70 +df_mapitems:cave_coral_3 101 73 70 +df_mapitems:cave_pearls 233 221 212 +df_mapitems:cobble_with_floor_fungus 161 159 146 +df_mapitems:cobble_with_floor_fungus_fine 147 146 138 +df_mapitems:dirt_with_cave_moss 88 177 171 +df_mapitems:dirt_with_cave_moss_trampled 90 176 170 +df_mapitems:dirt_with_pebble_fungus 162 157 152 +df_mapitems:dirt_with_pebble_fungus_trampled 161 156 151 +df_mapitems:dirt_with_stillworm 107 107 89 +df_mapitems:dirt_with_stillworm_trampled 109 107 91 +df_mapitems:dry_flowstone 129 129 129 +df_mapitems:dry_stal_1 129 129 129 +df_mapitems:dry_stal_2 129 129 129 +df_mapitems:dry_stal_3 129 129 129 +df_mapitems:dry_stal_4 129 129 129 +df_mapitems:glow_mese 143 136 2 +df_mapitems:glow_ruby_ore 164 74 82 +df_mapitems:glow_worm 183 255 255 +df_mapitems:ice_with_hoar_moss 111 121 174 +df_mapitems:icicle_1 164 164 252 +df_mapitems:icicle_2 164 164 252 +df_mapitems:icicle_3 164 164 252 +df_mapitems:icicle_4 164 164 252 +df_mapitems:med_crystal 202 56 52 +df_mapitems:med_crystal_30 202 56 52 +df_mapitems:med_crystal_30_45 202 56 52 +df_mapitems:mese_crystal 143 136 2 +df_mapitems:rock_rot 92 82 74 +df_mapitems:salt_crystal 248 201 201 +df_mapitems:salty_cobble 169 158 158 +df_mapitems:sand_scum 109 110 78 +df_mapitems:sand_scum_trampled 110 111 81 +df_mapitems:snareweed 82 68 35 +df_mapitems:spongestone 70 47 28 +df_mapitems:spongestone_trampled 74 53 37 +df_mapitems:veinstone 120 99 95 +df_mapitems:wet_flowstone 153 153 153 +df_mapitems:wet_stal_1 153 153 153 +df_mapitems:wet_stal_2 153 153 153 +df_mapitems:wet_stal_3 153 153 153 +df_mapitems:wet_stal_4 153 153 153 +df_primordial_items:dirt_with_jungle_grass 15 32 8 +df_primordial_items:dirt_with_jungle_grass_trampled 28 40 25 +df_primordial_items:dirt_with_mycelium 132 127 157 +df_primordial_items:dirt_with_mycelium_trampled 132 127 156 +df_primordial_items:fern_1 6 52 42 +df_primordial_items:fern_2 1 51 24 +df_primordial_items:fern_sapling 8 54 22 +df_primordial_items:fern_wood 115 89 68 +df_primordial_items:fungal_grass_1 118 121 180 +df_primordial_items:fungal_grass_2 116 118 179 +df_primordial_items:giant_fern_leaves 16 52 29 +df_primordial_items:giant_fern_tree 59 107 64 +df_primordial_items:giant_fern_tree_slant_bottom 59 107 64 +df_primordial_items:giant_fern_tree_slant_full 59 107 64 +df_primordial_items:giant_fern_tree_slant_top 59 107 64 +df_primordial_items:giant_hypha 221 206 230 +df_primordial_items:giant_hypha_apical_mapgen 221 206 230 +df_primordial_items:giant_hypha_apical_meristem 221 206 230 +df_primordial_items:giant_hypha_root 221 206 230 +df_primordial_items:glow_orb 176 172 223 +df_primordial_items:glow_orb_hanging 174 173 210 +df_primordial_items:glow_orb_stalks 135 136 196 +df_primordial_items:glow_plant_1 168 101 171 +df_primordial_items:glow_plant_2 50 91 101 +df_primordial_items:glow_plant_3 54 108 134 +df_primordial_items:glow_pods 209 128 186 +df_primordial_items:glownode 174 175 199 +df_primordial_items:glownode_stalk 146 147 198 +df_primordial_items:jungle_grass_1 45 68 32 +df_primordial_items:jungle_grass_2 42 65 30 +df_primordial_items:jungle_grass_3 39 62 29 +df_primordial_items:jungle_ivy 8 53 15 +df_primordial_items:jungle_leaves 1 45 16 +df_primordial_items:jungle_leaves_glowing 0 87 90 +df_primordial_items:jungle_mushroom_1 92 76 67 +df_primordial_items:jungle_mushroom_2 101 85 76 +df_primordial_items:jungle_mushroom_cap_1 176 137 105 +df_primordial_items:jungle_mushroom_cap_2 72 51 34 +df_primordial_items:jungle_mushroom_sapling 101 85 76 +df_primordial_items:jungle_mushroom_trunk 165 140 125 +df_primordial_items:jungle_roots_1 33 25 16 +df_primordial_items:jungle_roots_2 36 18 9 +df_primordial_items:jungle_thorns 28 22 17 +df_primordial_items:jungle_tree 144 107 73 +df_primordial_items:jungle_tree_glowing 144 107 73 +df_primordial_items:jungle_tree_mossy 144 107 73 +df_primordial_items:jungletree_sapling 27 60 80 +df_primordial_items:mush_sapling 128 123 151 +df_primordial_items:mushroom_cap 47 35 66 +df_primordial_items:mushroom_gills 163 167 192 +df_primordial_items:mushroom_gills_glowing 197 180 249 +df_primordial_items:mushroom_trunk 161 171 196 +df_primordial_items:packed_roots 21 11 6 +df_primordial_items:plant_matter 27 45 21 +df_primordial_items:plant_matter_trampled 36 50 32 +df_primordial_items:primordial_mush_cap_wood 118 117 140 +df_primordial_items:primordial_mush_trunk_wood 169 171 193 +df_trees:black_cap 58 58 58 +df_trees:black_cap_gills 0 0 0 +df_trees:black_cap_sapling 66 69 76 +df_trees:black_cap_stem 58 58 58 +df_trees:black_cap_wood 47 47 47 +df_trees:blood_thorn 143 23 31 +df_trees:blood_thorn_dead 143 23 31 +df_trees:blood_thorn_spike 125 2 34 +df_trees:blood_thorn_spike_dead 125 2 34 +df_trees:blood_thorn_wood 74 12 25 +df_trees:fungiwood 225 211 117 +df_trees:fungiwood_sapling 228 191 86 +df_trees:fungiwood_shelf 225 211 117 +df_trees:fungiwood_wood 193 173 84 +df_trees:glowing_bottle_cyan 214 215 223 +df_trees:glowing_bottle_golden 214 215 223 +df_trees:glowing_bottle_green 214 215 223 +df_trees:glowing_bottle_red 214 215 223 +df_trees:goblin_cap 197 68 17 +df_trees:goblin_cap_gills 239 169 169 +df_trees:goblin_cap_sapling 196 175 170 +df_trees:goblin_cap_stem 216 207 149 +df_trees:goblin_cap_stem_wood 215 205 165 +df_trees:goblin_cap_wood 215 68 19 +df_trees:nether_cap 10 29 101 +df_trees:nether_cap_gills 3 120 144 +df_trees:nether_cap_sapling 3 88 231 +df_trees:nether_cap_stem 58 51 142 +df_trees:nether_cap_wood 17 17 95 +df_trees:spindlestem_cap_cyan 179 230 215 +df_trees:spindlestem_cap_golden 235 230 164 +df_trees:spindlestem_cap_green 179 230 164 +df_trees:spindlestem_cap_red 235 176 164 +df_trees:spindlestem_cap_white 235 230 215 +df_trees:spindlestem_seedling 235 230 215 +df_trees:spindlestem_stem 235 230 215 +df_trees:spore_tree 218 198 168 +df_trees:spore_tree_fruiting_body 172 164 158 +df_trees:spore_tree_hyphae 172 164 158 +df_trees:spore_tree_ladder 191 186 175 +df_trees:spore_tree_sapling 163 152 146 +df_trees:spore_tree_wood 210 199 170 +df_trees:torchspine_1 11 11 11 +df_trees:torchspine_1_lit 196 153 69 +df_trees:torchspine_2 53 53 53 +df_trees:torchspine_3 94 95 95 +df_trees:torchspine_4 137 137 137 +df_trees:torchspine_ember 11 11 11 +df_trees:tower_cap 235 230 215 +df_trees:tower_cap_gills 227 226 178 +df_trees:tower_cap_sapling 188 188 178 +df_trees:tower_cap_stem 235 230 215 +df_trees:tower_cap_wood 236 231 221 +df_trees:tunnel_tube 201 0 140 +df_trees:tunnel_tube_fruiting_body 201 0 140 +df_trees:tunnel_tube_fruiting_body_burning 201 0 140 +df_trees:tunnel_tube_sapling 182 42 177 +df_trees:tunnel_tube_slant_bottom 201 0 140 +df_trees:tunnel_tube_slant_full 201 0 140 +df_trees:tunnel_tube_slant_top 201 0 140 +df_trees:tunnel_tube_wood 157 20 98 +df_underworld_items:digging_seal 231 167 236 +df_underworld_items:glow_amethyst 105 42 125 +df_underworld_items:glowstone 245 212 156 +df_underworld_items:hunter_statue 50 44 38 +df_underworld_items:inscription_block 52 45 39 +df_underworld_items:pit_plasma 230 164 235 +df_underworld_items:pit_plasma_flowing 231 167 236 +df_underworld_items:puzzle_seal 52 45 39 +df_underworld_items:slade 50 44 38 +df_underworld_items:slade_block 52 45 39 +df_underworld_items:slade_brick 50 45 40 +df_underworld_items:slade_capstone 52 45 39 +df_underworld_items:slade_sand 43 39 36 +df_underworld_items:slade_seal 47 42 36 +df_underworld_items:slade_wall 50 45 40 +dynamic_liquid:clay 183 183 183 +dynamic_liquid:spring 68 65 54 +ice_sprites:ice_sprite 184 255 255 +ice_sprites:ice_sprite_bottle 188 194 206 +magma_conduits:glow_obsidian 49 5 5 +magma_conduits:hot_cobble 79 52 49 +magma_conduits:lava_flowing 203 108 20 +magma_conduits:lava_source 210 116 23 +magma_conduits:stone 97 94 93 +mine_gas:gas_seep 89 86 85 +mine_gas:gas_wisp 0 138 255 +oil:oil_flowing 40 40 40 +oil:oil_source 40 40 40 +ropes:copper1rope_block 55 45 29 +ropes:copper2rope_block 58 48 30 +ropes:copper3rope_block 59 49 31 +ropes:copper4rope_block 60 49 31 +ropes:copper5rope_block 60 49 32 +ropes:ladder_steel 177 177 177 +ropes:ladder_wood 142 111 64 +ropes:rope 62 51 32 +ropes:rope_bottom 62 51 32 +ropes:ropeladder 88 69 41 +ropes:ropeladder_bottom 88 70 40 +ropes:ropeladder_falling 88 69 41 +ropes:ropeladder_top 91 73 47 +ropes:steel1rope_block 55 45 29 +ropes:steel2rope_block 58 48 30 +ropes:steel3rope_block 59 49 31 +ropes:steel4rope_block 60 49 31 +ropes:steel5rope_block 60 49 32 +ropes:steel6rope_block 58 48 30 +ropes:steel7rope_block 59 49 31 +ropes:steel8rope_block 60 49 31 +ropes:steel9rope_block 60 49 32 +ropes:wood1rope_block 55 45 29 +ropes:wood2rope_block 58 48 30 +ropes:wood_bridge 142 111 64 +stairs:slab_black_cap_wood 47 47 47 +stairs:slab_blood_thorn_wood 74 12 25 +stairs:slab_fungiwood_wood 193 173 84 +stairs:slab_goblin_cap_stem_wood 215 205 165 +stairs:slab_goblin_cap_wood 215 68 19 +stairs:slab_nether_cap_wood 17 17 95 +stairs:slab_slade_block 74 39 39 +stairs:slab_slade_brick 68 40 40 +stairs:slab_spore_tree_wood 210 199 170 +stairs:slab_tower_cap_wood 236 231 221 +stairs:slab_tunnel_tube_wood 157 20 98 +stairs:stair_black_cap_wood 47 47 47 +stairs:stair_blood_thorn_wood 74 12 25 +stairs:stair_fungiwood_wood 193 173 84 +stairs:stair_goblin_cap_stem_wood 215 205 165 +stairs:stair_goblin_cap_wood 215 68 19 +stairs:stair_inner_black_cap_wood 47 47 47 +stairs:stair_inner_blood_thorn_wood 74 12 25 +stairs:stair_inner_fungiwood_wood 193 173 84 +stairs:stair_inner_goblin_cap_stem_wood 215 205 165 +stairs:stair_inner_goblin_cap_wood 215 68 19 +stairs:stair_inner_nether_cap_wood 17 17 95 +stairs:stair_inner_slade_block 74 39 39 +stairs:stair_inner_slade_brick 68 40 40 +stairs:stair_inner_spore_tree_wood 210 199 170 +stairs:stair_inner_tower_cap_wood 236 231 221 +stairs:stair_inner_tunnel_tube_wood 157 20 98 +stairs:stair_nether_cap_wood 17 17 95 +stairs:stair_outer_black_cap_wood 47 47 47 +stairs:stair_outer_blood_thorn_wood 74 12 25 +stairs:stair_outer_fungiwood_wood 193 173 84 +stairs:stair_outer_goblin_cap_stem_wood 215 205 165 +stairs:stair_outer_goblin_cap_wood 215 68 19 +stairs:stair_outer_nether_cap_wood 17 17 95 +stairs:stair_outer_slade_block 74 39 39 +stairs:stair_outer_slade_brick 68 40 40 +stairs:stair_outer_spore_tree_wood 210 199 170 +stairs:stair_outer_tower_cap_wood 236 231 221 +stairs:stair_outer_tunnel_tube_wood 157 20 98 +stairs:stair_slade_block 74 39 39 +stairs:stair_slade_brick 68 40 40 +stairs:stair_spore_tree_wood 210 199 170 +stairs:stair_tower_cap_wood 236 231 221 +stairs:stair_tunnel_tube_wood 157 20 98 \ No newline at end of file diff --git a/mods/dfcaverns/modpack.conf b/mods/dfcaverns/modpack.conf new file mode 100644 index 0000000..023af30 --- /dev/null +++ b/mods/dfcaverns/modpack.conf @@ -0,0 +1,2 @@ +name = dfcaverns +description = Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. \ No newline at end of file diff --git a/mods/dfcaverns/modpack.txt b/mods/dfcaverns/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/dfcaverns/oil/LICENSE.txt b/mods/dfcaverns/oil/LICENSE.txt new file mode 100644 index 0000000..e9fd4ab --- /dev/null +++ b/mods/dfcaverns/oil/LICENSE.txt @@ -0,0 +1,24 @@ +Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details. + +License for Code +---------------- + +Copyright (C) 2018 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/oil/init.lua b/mods/dfcaverns/oil/init.lua new file mode 100644 index 0000000..0a6cf8c --- /dev/null +++ b/mods/dfcaverns/oil/init.lua @@ -0,0 +1,221 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +local oil_desc +local oil_usage + +if minetest.get_modpath("doc") then + oil_desc = S("Liquid hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.") + oil_usage = S("Buckets of oil can be used as fuel.") +end + +local oil_sounds = {footstep = {name = "oil_oil_footstep", gain = 0.2}} + +local water_source = df_dependencies.node_name_water_source +local water_flowing = df_dependencies.node_name_water_flowing +local bucket_empty = df_dependencies.node_name_bucket_empty + +minetest.register_node("oil:oil_source", { + description = S("Oil"), + _doc_items_longdesc = oil_desc, + _doc_items_usagehelp = oil_usage, + drawtype = "liquid", + tiles = { + { + name = "oil_oil_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "oil_oil_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 255, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + sunlight_propagates = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_range = 3, + liquid_renewable = false, + liquid_alternative_flowing = "oil:oil_flowing", + liquid_alternative_source = "oil:oil_source", + liquid_viscosity = 1, + post_effect_color = {a = 250, r = 0, g = 0, b = 0}, + groups = {liquid = 1, dig_by_piston=1}, + sounds = oil_sounds, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, +}) + +minetest.register_node("oil:oil_flowing", { + description = S("Flowing Oil"), + _doc_items_longdesc = oil_desc, + _doc_items_usagehelp = oil_usage, + drawtype = "flowingliquid", + tiles = {"oil_oil.png"}, + special_tiles = { + { + name = "oil_oil_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 4.0, + }, + }, + { + name = "oil_oil_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 4.0, + }, + }, + }, + alpha = 255, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + sunlight_propagates = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_range = 3, + liquid_renewable = false, + liquid_alternative_flowing = "oil:oil_flowing", + liquid_alternative_source = "oil:oil_source", + liquid_viscosity = 1, + post_effect_color = {a = 250, r = 0, g = 0, b = 0}, + groups = {liquid = 1, not_in_creative_inventory = 1, dig_by_piston=1}, + sounds = oil_sounds, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "oil:oil_source", + burntime = 370, -- same as coalblock +}) + +if minetest.get_modpath("dynamic_liquid") then + dynamic_liquid.liquid_abm("oil:oil_source", "oil:oil_flowing", 2) + + -- not using default liquid_abm to prevent oil from churning around once it's on the surface of water - we want slicks to remain cohesive and static + minetest.register_abm({ + label = "oil:oil floats", + nodenames = {"oil:oil_source"}, + neighbors = {water_source}, + interval = 1.0, + chance = 1, + catch_up = true, + action = function(pos, node) + local next_pos = {x=pos.x, y=pos.y+1, z=pos.z} + local next_node = minetest.get_node(next_pos) + local above_name = next_node.name + if above_name == water_source then + minetest.swap_node(next_pos, {name="oil:oil_source"}) + minetest.swap_node(pos, next_node) + else + next_pos.y = pos.y + local displacement + if math.random() > 0.5 then displacement = 1 else displacement = -1 end + if math.random() > 0.5 then + next_pos.x = next_pos.x + displacement + else + next_pos.z = next_pos.z + displacement + end + next_node = minetest.get_node(next_pos) + if next_node.name == water_source then + if above_name ~= "air" then + -- we're not on the surface, so try any lateral movement + minetest.swap_node(next_pos, {name="oil:oil_source"}) + minetest.swap_node(pos, next_node) + elseif math.random() < 0.1 then -- expensive and not commonly needed, so don't try this often + --Otherwise, count neighboring oil nodes and if we're increasing the number of neighboring oil nodes by moving then do so. + local oil_neighbors_here, here_count = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, {"oil:oil_source"}) + local oil_neighbors_there, there_count = minetest.find_nodes_in_area({x=next_pos.x-1, y=next_pos.y, z=next_pos.z-1}, {x=next_pos.x+1, y=next_pos.y, z=next_pos.z+1}, {"oil:oil_source"}) + if there_count["oil:oil_source"] >= here_count["oil:oil_source"] then + minetest.swap_node(next_pos, {name="oil:oil_source"}) + minetest.swap_node(pos, next_node) + end + end + end + end + end, + }) + + -- If oil is wandering around on top of a layer of water that isn't full, drop it down + -- into the water layer. This helps drive the system toward a more static state with a flat-looking surface. + minetest.register_abm({ + label = "oil:oil settles", + nodenames = {"oil:oil_source"}, + neighbors = {water_flowing}, + interval = 1.0, + chance = 1, + catch_up = true, + action = function(pos, node) + local next_pos = {x=pos.x, y=pos.y-1, z=pos.z} + local next_node = minetest.get_node(next_pos) + if next_node.name == water_flowing then + minetest.swap_node(next_pos, {name="oil:oil_source"}) + minetest.swap_node(pos, next_node) + end + end, + }) + +end + +if df_dependencies.bucket_register_liquid then + df_dependencies.bucket_register_liquid( + "oil:oil_source", + "oil:oil_flowing", + "oil:oil_bucket", + "oil_bucket.png", + S("Oil Bucket") + ) + + minetest.register_craft({ + type = "fuel", + recipe = "oil:oil_bucket", + burntime = 370, -- same as coalblock + replacements = {{"oil:oil_bucket", bucket_empty}}, + }) + + if minetest.get_modpath("basic_materials") then + minetest.register_craft({ + type = "cooking", + output = "basic_materials:paraffin", + recipe = "oil:oil_bucket", + cooktime = 5, + replacements = {{"oil:oil_bucket", bucket_empty}}, + }) + end +end \ No newline at end of file diff --git a/mods/dfcaverns/oil/locale/oil.de.tr b/mods/dfcaverns/oil/locale/oil.de.tr new file mode 100644 index 0000000..169a5dd --- /dev/null +++ b/mods/dfcaverns/oil/locale/oil.de.tr @@ -0,0 +1,17 @@ +# textdomain: oil + + +### init.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Buckets of oil can be used as fuel.=Eimer Öl können als Kraftstoff verwendet werden. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flowing Oil=Fließendes Öl + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Liquid hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.=Flüssige Kohlenwasserstoffe, die aus dem Abfall langer toter Pflanzen und Tiere entstehen, die durch Hitze und Druck tief in der Erde verarbeitet werden. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Oil=Öl +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Oil Bucket=Öleimer diff --git a/mods/dfcaverns/oil/locale/oil.it.tr b/mods/dfcaverns/oil/locale/oil.it.tr new file mode 100644 index 0000000..5068509 --- /dev/null +++ b/mods/dfcaverns/oil/locale/oil.it.tr @@ -0,0 +1,17 @@ +# textdomain: oil + + +### init.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Buckets of oil can be used as fuel.=I secchi d'olio possono essere usati come carburante. +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Flowing Oil=Olio che scorre + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Liquid hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.=Idrocarburi liquidi formati dai detriti di piante e animali morti da tempo lavorati dal calore e dalla pressione nelle profondità della terra. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Oil=Olio +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Oil Bucket=Secchio d'olio diff --git a/mods/dfcaverns/oil/locale/template.txt b/mods/dfcaverns/oil/locale/template.txt new file mode 100644 index 0000000..abb1ba6 --- /dev/null +++ b/mods/dfcaverns/oil/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: oil + + +### init.lua ### + +Buckets of oil can be used as fuel.= +Flowing Oil= + +Liquid hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.= + +Oil= +Oil Bucket= diff --git a/mods/dfcaverns/oil/mod.conf b/mods/dfcaverns/oil/mod.conf new file mode 100644 index 0000000..762bc1e --- /dev/null +++ b/mods/dfcaverns/oil/mod.conf @@ -0,0 +1,4 @@ +name = oil +description = Oil liquid type +depends = df_dependencies +optional_depends = dynamic_liquid, doc, basic_materials \ No newline at end of file diff --git a/mods/dfcaverns/oil/sounds/license.txt b/mods/dfcaverns/oil/sounds/license.txt new file mode 100644 index 0000000..7b85763 --- /dev/null +++ b/mods/dfcaverns/oil/sounds/license.txt @@ -0,0 +1,6 @@ +oil footstep 1-4 extracted from https://freesound.org/people/VlatkoBlazek/sounds/318592/ +Released under the CC BY 3.0 license by: +Vlatko Blažek +Varaždin, Croatia +e-mail: vlatkoblazek@gmail.com +http://www.freesound.org/people/VlatkoBlazek/ diff --git a/mods/dfcaverns/oil/sounds/oil_oil_footstep.1.ogg b/mods/dfcaverns/oil/sounds/oil_oil_footstep.1.ogg new file mode 100644 index 0000000..8b33f79 Binary files /dev/null and b/mods/dfcaverns/oil/sounds/oil_oil_footstep.1.ogg differ diff --git a/mods/dfcaverns/oil/sounds/oil_oil_footstep.2.ogg b/mods/dfcaverns/oil/sounds/oil_oil_footstep.2.ogg new file mode 100644 index 0000000..8fc3664 Binary files /dev/null and b/mods/dfcaverns/oil/sounds/oil_oil_footstep.2.ogg differ diff --git a/mods/dfcaverns/oil/sounds/oil_oil_footstep.3.ogg b/mods/dfcaverns/oil/sounds/oil_oil_footstep.3.ogg new file mode 100644 index 0000000..d078937 Binary files /dev/null and b/mods/dfcaverns/oil/sounds/oil_oil_footstep.3.ogg differ diff --git a/mods/dfcaverns/oil/sounds/oil_oil_footstep.4.ogg b/mods/dfcaverns/oil/sounds/oil_oil_footstep.4.ogg new file mode 100644 index 0000000..c8fc513 Binary files /dev/null and b/mods/dfcaverns/oil/sounds/oil_oil_footstep.4.ogg differ diff --git a/mods/dfcaverns/oil/textures/license.txt b/mods/dfcaverns/oil/textures/license.txt new file mode 100644 index 0000000..00a961b --- /dev/null +++ b/mods/dfcaverns/oil/textures/license.txt @@ -0,0 +1,3 @@ +All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license. + +oil_bucket and oil liquid textures modified from default mod's bucket and water textures \ No newline at end of file diff --git a/mods/dfcaverns/oil/textures/oil_bucket.png b/mods/dfcaverns/oil/textures/oil_bucket.png new file mode 100644 index 0000000..64d3374 Binary files /dev/null and b/mods/dfcaverns/oil/textures/oil_bucket.png differ diff --git a/mods/dfcaverns/oil/textures/oil_oil.png b/mods/dfcaverns/oil/textures/oil_oil.png new file mode 100644 index 0000000..ab2064b Binary files /dev/null and b/mods/dfcaverns/oil/textures/oil_oil.png differ diff --git a/mods/dfcaverns/oil/textures/oil_oil_flowing_animated.png b/mods/dfcaverns/oil/textures/oil_oil_flowing_animated.png new file mode 100644 index 0000000..afb58bb Binary files /dev/null and b/mods/dfcaverns/oil/textures/oil_oil_flowing_animated.png differ diff --git a/mods/dfcaverns/oil/textures/oil_oil_source_animated.png b/mods/dfcaverns/oil/textures/oil_oil_source_animated.png new file mode 100644 index 0000000..19c1ca9 Binary files /dev/null and b/mods/dfcaverns/oil/textures/oil_oil_source_animated.png differ diff --git a/mods/dfcaverns/pit_caves/LICENSE.txt b/mods/dfcaverns/pit_caves/LICENSE.txt new file mode 100644 index 0000000..1b07b15 --- /dev/null +++ b/mods/dfcaverns/pit_caves/LICENSE.txt @@ -0,0 +1,22 @@ +License for Code +---------------- + +Copyright (C) 2021 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/pit_caves/README.md b/mods/dfcaverns/pit_caves/README.md new file mode 100644 index 0000000..d604410 --- /dev/null +++ b/mods/dfcaverns/pit_caves/README.md @@ -0,0 +1,18 @@ +A pit cave, shaft cave or vertical cave—or often simply called a pit (in the US) or pot (in the UK); jama in South Slavic languages scientific and colloquial vocabulary (borrowed since early research in the Western Balkan Dinaric Alpine karst)—is a type of cave which contains one or more significant vertical shafts rather than being predominantly a conventional horizontal cave passage. Pit caves typically form in limestone as a result of long-term erosion by water. + +In the real world, the deepest known vertical drop in a cave is 603m in Vrtoglavica Cave in Slovenia. This mod adds pits of varying depth, with some under the default settings being up to 2500m deep. They are widely scattered and not all of them breach the surface, so they are a rare find, but with the right tools a pit cave can give access to a huge swath of underground terrain. + +## Settings and commands + +The following settings are available for configuring pit cave generation: + + pit_caves_min_bottom (Lower limit of bottoms of pits) int -2500 + pit_caves_max_bottom (Upper limit of bottoms of pits) int -500 + pit_caves_min_top (Lower limit of tops of pits) int -100 + pit_caves_max_top (Upper limit of tops of pits) int 100 + pit_caves_mapblock_spacing (Average number of map blocks between pits) int 16 + pit_caves_seal_ocean (Seal off pits that are under ocean water) bool true + +The pit_caves_seal_ocean setting isn't perfect, some map generation scenarios can result in a gap through which water can flow. But it's better than having drain holes everywhere. + +Users with the "server" privilege can use the ``/find_pit_caves`` command, which will list the locations of nearby pit caves. \ No newline at end of file diff --git a/mods/dfcaverns/pit_caves/init.lua b/mods/dfcaverns/pit_caves/init.lua new file mode 100644 index 0000000..46d291f --- /dev/null +++ b/mods/dfcaverns/pit_caves/init.lua @@ -0,0 +1,231 @@ +pit_caves = {} + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator(minetest.get_current_modname()) + +local min_depth = tonumber(minetest.settings:get("pit_caves_min_bottom") or -2500) +local max_depth = tonumber(minetest.settings:get("pit_caves_max_bottom") or -500) +local min_top = tonumber(minetest.settings:get("pit_caves_min_top") or -100) +local max_top = tonumber(minetest.settings:get("pit_caves_max_top") or 100) + +local seal_ocean = minetest.settings:get_bool("pit_caves_seal_ocean", true) + +assert(min_depth < max_depth, "pit_caves_min_bottom is above pit_caves_max_bottom") +assert(min_top < max_top, "pit_caves_min_top is above pit_caves_max_top") +assert(max_depth < min_top, "pit_caves_max_bottom is above pit_caves_min_top") + +local pit_radius = 3 -- approximate minimum radius of pit - noise adds a lot to this + +local region_mapblocks = tonumber(minetest.settings:get("pit_caves_mapblock_spacing") or 16) +local mapgen_chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) +local pit_region_size = region_mapblocks * mapgen_chunksize * 16 + +local c_air = minetest.get_content_id("air") +local c_gravel = c_air +local water_node +if minetest.get_modpath("default") then + c_gravel = minetest.get_content_id("default:gravel") + if seal_ocean then + water_node = "default:water_source" + end +end + +local log_location +if minetest.get_modpath("mapgen_helper") and mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + +local ignore +if minetest.get_modpath("chasms") then + -- the chasms mod already sets up a method to allow chasms to avoid overwriting stalactites and whatnot, + -- hijack that. + ignore = chasms.ignore_content_id +end + +local water_level = tonumber(minetest.get_mapgen_setting("water_level")) +local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) % 2^16 + +local scatter_2d = function(min_xz, gridscale, border_width) + local bordered_scale = gridscale - 2 * border_width + local point = {} + point.x = math.floor(math.random() * bordered_scale + min_xz.x + border_width) + point.y = 0 + point.z = math.floor(math.random() * bordered_scale + min_xz.z + border_width) + return point +end + +-- For some reason, map chunks generate with -32, -32, -32 as the "origin" minp. To make the large-scale grid align with map chunks it needs to be offset like this. +local get_corner = function(pos) + return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32} +end + +local get_pit = function(pos) + local corner_xz = get_corner(pos) + local next_seed = math.random(1, 1000000000) + math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed + 1) + + local location = scatter_2d(corner_xz, pit_region_size, 0) + local depth = math.floor(math.random() * (max_depth - min_depth) + min_depth) + local top = math.floor(math.random() * (max_top - min_top) + min_top) + + math.randomseed(next_seed) + return {location = location, depth = depth, top = top} +end + +pit_caves.get_nearest_pit = get_pit + +local perlin_params = { + offset = 0, + scale = 1, + spread = {x=30, y=30, z=30}, + seed = 45011, + octaves = 3, + persist = 0.67 +} +local data = {} + +minetest.register_on_generated(function(minp, maxp, seed) + if minp.y > max_top or maxp.y < min_depth then + return + end + + local pit = get_pit(minp) + + if pit == nil then + return -- no pit in this map region + end + + local location_x = pit.location.x + local location_z = pit.location.z + + -- early out if the pit is too far away to matter + -- The plus 20 is because the noise being added will generally be in the 0-20 range, see the "distance" calculation below + if location_x - 20 > maxp.x or + location_x + 20 < minp.x or + location_z - 20 > maxp.z or + location_z + 20 < minp.z + then + return + end + + local top = pit.top + local depth = pit.depth + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + vm:get_data(data) + + if water_node and minp.y <= water_level and maxp.y >= water_level-240 then + local test_node = minetest.get_node(vector.new(location_x, water_level, location_z)) + if test_node.name == water_node then + top = math.min(-32, top) -- we're coming up under the ocean, abort the pit. + -- note that this does depend on the water-level map block having been generated already, + -- which could lead to a sharp cutoff if that's not the case - if the player's coming + -- up a pit from below into an unexplored ocean, for example. But it should still at least + -- seal the hole before the ocean pours down into it, so that's acceptable. And I expect + -- most of the time the surface world will be explored first before pits are discovered. + end + end + + local nvals_perlin = mapgen_helper.perlin3d("pit_caves:pit", emin, emax, perlin_params) + + for vi, x, y, z in area:iterp_xyz(emin, emax) do + if not (ignore and ignore(data[vi])) then + local distance_perturbation = (nvals_perlin[vi]+1)*10 + local distance = vector.distance({x=x, y=y, z=z}, {x=location_x, y=y, z=location_z}) - distance_perturbation + local taper_min = top - 40 + + if y < top and y > depth then + if y > top - 40 then + -- taper the top end + distance = distance - ((taper_min - y)/2) + end + + if distance < pit_radius then + if y < depth + 20 and data[vi] ~= c_air then + data[vi] = c_gravel + else + data[vi] = c_air + if log_location then log_location("pit_cave", vector.new(x,y,z)) end + end + end + end + end + end + + --send data back to voxelmanip + vm:set_data(data) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + vm:update_liquids() + --write it to world + vm:write_to_map() +end) + +---------------------------------------------------------------------------------------------- +-- Debugging and sightseeing commands + +function round(val, decimal) + if (decimal) then + return math.floor( (val * 10^decimal) + 0.5) / (10^decimal) + else + return math.floor(val+0.5) + end +end + +local send_pit_state = function(pos, name) + local pit = get_pit(pos) + if pit == nil then + return false + end + local location = {x=math.floor(pit.location.x), y=pit.top, z=math.floor(pit.location.z)} + minetest.chat_send_player(name, S("Pit at @1, bottom @2", minetest.pos_to_string(location), pit.depth)) + return true +end + +local send_nearby_states = function(pos, name) + local retval = false + retval = send_pit_state({x=pos.x-pit_region_size, y=0, z=pos.z+pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x, y=0, z=pos.z+pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x+pit_region_size, y=0, z=pos.z+pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x-pit_region_size, y=0, z=pos.z}, name) or retval + retval = send_pit_state(pos, name) or retval + retval = send_pit_state({x=pos.x+pit_region_size, y=0, z=pos.z}, name) or retval + retval = send_pit_state({x=pos.x-pit_region_size, y=0, z=pos.z-pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x, y=0, z=pos.z-pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x+pit_region_size, y=0, z=pos.z-pit_region_size}, name) or retval + return retval +end + +minetest.register_chatcommand("find_pit_caves", { + params = "pos", -- Short parameter description + description = S("find the pits near the player's map region, or in the map region containing pos if provided"), + func = function(name, param) + if minetest.check_player_privs(name, {server = true}) then + local pos = {} + pos.x, pos.y, pos.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + pos.x = tonumber(pos.x) + pos.y = tonumber(pos.y) + pos.z = tonumber(pos.z) + if pos.x and pos.y and pos.z then + if not send_nearby_states(pos, name) then + minetest.chat_send_player(name, S("No pits near @1", minetest.pos_to_string(pos))) + end + return true + else + local playerobj = minetest.get_player_by_name(name) + pos = playerobj:get_pos() + if not send_nearby_states(pos, name) then + pos.x = math.floor(pos.x) + pos.y = math.floor(pos.y) + pos.z = math.floor(pos.z) + minetest.chat_send_player(name, S("No pits near @1", minetest.pos_to_string(pos))) + end + return true + end + else + return false, S("You need the server privilege to use this command.") + end + end, +}) \ No newline at end of file diff --git a/mods/dfcaverns/pit_caves/locale/template.txt b/mods/dfcaverns/pit_caves/locale/template.txt new file mode 100644 index 0000000..654affe --- /dev/null +++ b/mods/dfcaverns/pit_caves/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: pit_caves + + +### init.lua ### + +No pits near @1= +Pit at @1, bottom @2= +You need the server privilege to use this command.= + +find the pits near the player's map region, or in the map region containing pos if provided= + diff --git a/mods/dfcaverns/pit_caves/mod.conf b/mods/dfcaverns/pit_caves/mod.conf new file mode 100644 index 0000000..cfe309a --- /dev/null +++ b/mods/dfcaverns/pit_caves/mod.conf @@ -0,0 +1,4 @@ +name = pit_caves +description = Inserts very tall "pit" caves underground +depends = +optional_depends = mapgen_helper, default, chasms \ No newline at end of file diff --git a/mods/dfcaverns/pit_caves/settingtypes.txt b/mods/dfcaverns/pit_caves/settingtypes.txt new file mode 100644 index 0000000..63801c1 --- /dev/null +++ b/mods/dfcaverns/pit_caves/settingtypes.txt @@ -0,0 +1,6 @@ +pit_caves_min_bottom (Lower limit of bottoms of pits) int -2500 +pit_caves_max_bottom (Upper limit of bottoms of pits) int -500 +pit_caves_min_top (Lower limit of tops of pits) int -100 +pit_caves_max_top (Upper limit of tops of pits) int 100 +pit_caves_mapblock_spacing (Average number of map blocks between pits) int 16 +pit_caves_seal_ocean (Seal off pits that are under ocean water) bool true \ No newline at end of file diff --git a/mods/dfcaverns/screenshot.png b/mods/dfcaverns/screenshot.png new file mode 100644 index 0000000..a26e82e Binary files /dev/null and b/mods/dfcaverns/screenshot.png differ diff --git a/mods/dfcaverns/subterrane/.gitattributes b/mods/dfcaverns/subterrane/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/mods/dfcaverns/subterrane/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/mods/dfcaverns/subterrane/.gitignore b/mods/dfcaverns/subterrane/.gitignore new file mode 100644 index 0000000..cd2946a --- /dev/null +++ b/mods/dfcaverns/subterrane/.gitignore @@ -0,0 +1,47 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/mods/dfcaverns/subterrane/README.md b/mods/dfcaverns/subterrane/README.md new file mode 100644 index 0000000..695aedb --- /dev/null +++ b/mods/dfcaverns/subterrane/README.md @@ -0,0 +1,105 @@ +# subterrane + +This mod was based off of Caverealms by HeroOfTheWinds, which was in turn based off of Subterrain by Paramat. + +It is intended as a utility mod for other mods to use when creating a more interesting underground experience in Minetest, primarily through the creation of enormous underground "natural" caverns with hooks to add custom decorations. Installing this mod by itself will not do anything. This mod depends in turn on the [mapgen_helper](https://github.com/minetest-mods/mapgen_helper) mod. + +The API has the following methods: + +# Cavern registration + +## subterrane:register_cave_layer(cave_layer_def) + +cave_layer_def is a table of the form: + +``` +{ + name = -- optional, defaults to the string "y_min to y_max" (with actual values inserted in place of y_min and y_max). Used for logging. + y_max = -- required, the highest elevation this cave layer will be generated in. Upper boundaries for cavern depths are most efficient when they fit the formula (x*80-32)-1 where x is an integer, that way you don't generate map blocks that straddle two cavern layers. The "-1" keeps them from intruding on the map block above. + y_min = -- required, the lowest elevation this cave layer will be generated in. Lower boundaries are most efficient when they fit (x*80-32). + cave_threshold = -- optional, Cave threshold. Defaults to 0.5. 1 = small rare caves, 0 = 1/2 ground volume + warren_region_threshold = -- optional, defaults to 0.25. Used to determine how much volume warrens take up around caverns. Set it to be equal to or greater than the cave threshold to disable warrens entirely. + warren_region_variability_threshold = -- optional, defaults to 0.25. Used to determine how much of the region contained within the warren_region_threshold actually has warrens in it. + warren_threshold = -- Optional, defaults to 0.25. Determines how "spongey" warrens are, lower numbers make tighter, less-connected warren passages. + boundary_blend_range = -- optional, range near ymin and ymax over which caves diminish to nothing. Defaults to 128. + perlin_cave = -- optional, a 3D perlin noise definition table to define the shape of the caves + perlin_wave = -- optional, a 3D perlin noise definition table that's averaged with the cave noise to add more horizontal surfaces (squash its spread on the y axis relative to perlin_cave to accomplish this) + perlin_warren_area = -- optional, a 3D perlin noise definition table for defining what places warrens form in + perlin_warrens = -- optional, a 3D perlin noise definition table for defining the warrens + solidify_lava = -- when set to true, lava near the edges of caverns is converted into obsidian to prevent it from spilling in. + columns = -- optional, a column_def table for producing truly enormous dripstone formations. See below for definition. Set to nil to disable columns. + double_frequency = -- when set to true, uses the absolute value of the cavern field to determine where to place caverns instead. This effectively doubles the number of large non-connected caverns. + on_decorate = -- optional, a function that is given a table of indices and a variety of other mapgen information so that it can place custom decorations on floors and ceilings. It is given the parameters (minp, maxp, seed, vm, cavern_data, area, data). See below for the cavern_data table's member definitions. + is_ground_content = -- optional, a function that takes a content_id and returns true if caverns should be carved through that node type. If not provided it defaults to a "is_ground_content" test. +} +``` + +The column_def table is of the form: + +``` +{ + maximum_radius = -- Maximum radius for individual columns, defaults to 10 + minimum_radius = -- Minimum radius for individual columns, defaults to 4 (going lower that this can increase the likelihood of "intermittent" columns with floating sections) + node = -- node name to build columns out of. Defaults to default:stone + warren_node = -- node name to build columns out of in warren areas. If not set, the nodes that would be columns in warrens will be left as original ground contents + weight = -- a floating point value (usually in the range of 0.5-1) to modify how strongly the column is affected by the surrounding cave. Lower values create a more variable, tapered stalactite/stalagmite combination whereas a value of 1 produces a roughly cylindrical column. Defaults to 0.25 + maximum_count = -- The maximum number of columns placed in any given column region (each region being a square 4 times the length and width of a map chunk). Defaults to 50 + minimum_count = -- The minimum number of columns placed in a column region. The actual number placed will be randomly selected between this range. Defaults to 0. +} +``` + + +This causes large caverns to be hollowed out during map generation. By default these caverns are just featureless cavities, but you can add extra subterrane-specific properties to biomes and the mapgen code will use them to add features of your choice using the "on_decorate" callback. The callback is passed a data table with the following information: + +``` +{ + cavern_floor_nodes = {} -- List of data indexes for nodes that are part of cavern floors. *Note:* Use ipairs() when iterating this, not pairs() + cavern_floor_count = 0 -- the count of nodes in the preceeding list. + cavern_ceiling_nodes = {} -- List of data indexes for nodes that are part of cavern ceilings. *Note:* Use ipairs() when iterating this, not pairs() + cavern_ceiling_count = 0 -- the count of nodes in the preceeding list. + warren_floor_nodes = {} -- List of data indexes for nodes that are part of warren floors. *Note:* Use ipairs() when iterating this, not pairs() + warren_floor_count = 0 -- the count of nodes in the preceeding list. + warren_ceiling_nodes = {} -- List of data indexes for nodes that are part of warren floors. *Note:* Use ipairs() when iterating this, not pairs() + warren_ceiling_count = 0 -- the count of nodes in the preceeding list. + tunnel_floor_nodes = {} -- List of data indexes for nodes that are part of floors in pre-existing tunnels (anything generated before this mapgen runs). *Note:* Use ipairs() when iterating this, not pairs() + tunnel_floor_count = 0 -- the count of nodes in the preceeding list. + tunnel_ceiling_nodes = {} -- List of data indexes for nodes that are part of ceiling in pre-existing tunnels (anything generated before this mapgen runs). *Note:* Use ipairs() when iterating this, not pairs() + tunnel_ceiling_count = 0 -- the count of nodes in the preceeding list. + column_nodes = {} -- Nodes that belong to columns. Note that if the warren_node was not set in the column definition these might not have been replaced by anything yet. This list contains *all* column nodes, not just ones on the outer surface of the column. + column_count = 0 -- the count of nodes in the preceeding list. + + contains_cavern = false -- Use this if you want a quick check if the generated map chunk has any cavern volume in it. Don't rely on the node counts above, if the map chunk doesn't intersect the floor or ceiling those could be 0 even if a cavern is present. + contains_warren = false -- Ditto for contains_cavern, but for warrens instead of caverns. + nvals_cave = nvals_cave -- The noise array used to generate the cavern. + cave_area = cave_area -- a VoxelArea for indexing nvals_cave + cavern_def = cave_layer_def -- a reference to the cave layer def. +} +``` + +# Common cavern features + +Subterrane has a number of functions bundled with it for generating some basic features commonly found in caverns, both realistic and fantastical. + +* `subterrane.register_stalagmite_nodes(base_name, base_node_def, drop_base_name)` + * This registers a set of four standardized stalactite/stalagmite nodes that can be used with the subterrane.stalagmite function below. "base name" is a string that forms the prefix of the names of the nodes defined, for example the coolcaves mod might use "coolcaves:crystal_stal" and the resulting nodes registered would be "coolcaves:crystal_stal_1" through "coolcaves:crystal_stal_4". "base_node_def" is a node definition table much like is used with the usual node registration function. register_stalagmite_nodes will amend or substitute properties in this definition as needed, so the simplest base_node_def might just define the textures used. "drop_base_name" is an optional string that will substitute the node drops with stalagmites created by another use of register_stalagmite_nodes, for example if you wrote + * `subterrane.register_stalagmite_nodes("coolcaves:dry_stal", base_dry_node_def)` + * `subterrane.register_stalagmite_nodes("coolcaves:wet_stal", base_wet_node_def, "coolcaves:dry_stal")` + * then when the player mines a dry stalactite they'll get a dry stalactite node and if they mine a wet stalactite they'll get a corresponding dry stalactite node as the drop instead. + * This method returns a table consisting of the content IDs for the four stalactite nodes, which can be used directly in the following methods: + +* `subterrane.stalagmite(vi, area, data, param2_data, param2, height, stalagmite_id)` +* `subterrane.stalactite(vi, area, data, param2_data, param2, height, stalagmite_id)` + * These methods can be used to create a small stalactite or stalagmite, generally no more than 5 nodes tall. Use a negative height to generate a stalactite. The parameter stalagmite_id is a table of four content IDs for the stalagmite nodes, in order from thinnest ("_1") to thickest ("_4"). The register_stalagmite_nodes method returns a table that can be used for this directly. + +* `subterrane.big_stalagmite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material)` +* `subterrane.big_stalactite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material)` + * Generates a very large multi-node stalagmite or stalactite three nodes in diameter (with a five-node-diameter "root"). + +* `subterrane.giant_mushroom(vi, area, data, stem_material, cap_material, gill_material, stem_height, cap_radius)` + * Generates an enormous mushroom. Cap radius works well in the range of around 2-6, larger or smaller than that may look odd. + +# Player spawn + +## subterrane:register_cave_spawn(cave_layer_def, start_depth) + +When the player spawns (or respawns due to death), this method will tell Minetest to attempt to locate a subterrane-generated cavern to place the player in. cave_layer_def is the same format as the cave definition above. Start_depth is the depth at which the game will start searching for a location to place the player. If the game doesn't find a location immediately it may wind up restarting the search for a spawn location at the top of the cave definition, so start_depth is not a guarantee that the player will start at least that deep; he could spawn anywhere within the cave layer's depth range. \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/defaults.lua b/mods/dfcaverns/subterrane/defaults.lua new file mode 100644 index 0000000..50cba73 --- /dev/null +++ b/mods/dfcaverns/subterrane/defaults.lua @@ -0,0 +1,67 @@ +subterrane.defaults = { + --y_max = Must be provided by the user + --y_min = Must be provided by the user + cave_threshold = 0.5, + warren_region_threshold = 0.25, + warren_region_variability_threshold = 0.25, + warren_threshold = 0.25, + boundary_blend_range = 128, + perlin_cave = { + offset = 0, + scale = 1, + spread = {x=256, y=256, z=256}, + seed = -400000000089, + octaves = 3, + persist = 0.67 + }, + perlin_wave = { + offset = 0, + scale = 1, + spread = {x=512, y=256, z=512}, -- squashed 2:1 + seed = 59033, + octaves = 6, + persist = 0.63 + }, + perlin_warren_area = { + offset = 0, + scale = 1, + spread = {x=1024, y=128, z=1024}, + seed = -12554445, + octaves = 2, + persist = 0.67 + }, + perlin_warrens = { + offset = 0, + scale = 1, + spread = {x=32, y=12, z=32}, + seed = 600089, + octaves = 3, + persist = 0.67 + }, + --solidify_lava = + columns = { + maximum_radius = 10, + minimum_radius = 4, + node = "default:stone", + weight = 0.25, + maximum_count = 50, + minimum_count = 0, + }, + --double_frequency = -- when set to true, uses the absolute value of the cavern field to determine where to place caverns instead. This effectively doubles the number of large non-connected caverns. + --decorate = -- optional, a function that is given a table of indices and a variety of other mapgen information so that it can place custom decorations on floors and ceilings. +} + +local recurse_defaults +recurse_defaults = function(target_table, default_table) + for k, v in pairs(default_table) do + if target_table[k] == nil then + target_table[k] = v -- TODO: deep copy if v is a table. + elseif type(target_table[k]) == "table" then + recurse_defaults(target_table[k], v) + end + end +end + +subterrane.set_defaults = function(cave_layer_def) + recurse_defaults(cave_layer_def, subterrane.defaults) +end \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/dependencies.lua b/mods/dfcaverns/subterrane/dependencies.lua new file mode 100644 index 0000000..f5635f6 --- /dev/null +++ b/mods/dfcaverns/subterrane/dependencies.lua @@ -0,0 +1,28 @@ +subterrane.dependencies = {} + +local default_modpath = minetest.get_modpath("default") +local mcl_core_modpath = minetest.get_modpath("mcl_core") + +assert(default_modpath or mcl_core_modpath, "[subterrane] This mod requires either minetest_game (default) or Mineclone2 (mcl_core) to be installed") + +if default_modpath then + +subterrane.dependencies.stone = "default:stone" +subterrane.dependencies.clay = "default:clay" +subterrane.dependencies.desert_stone = "default:desert_stone" +subterrane.dependencies.sandstone = "default:sandstone" +subterrane.dependencies.water = "default:water_source" +subterrane.dependencies.obsidian = "default:obsidian" + +elseif mcl_core_modpath then + +subterrane.dependencies.stone = "mcl_core:stone" +subterrane.dependencies.clay = "mcl_core:clay" +subterrane.dependencies.desert_stone = "mcl_core:redsandstone" +subterrane.dependencies.sandstone = "mcl_core:sandstone" +subterrane.dependencies.water = "mcl_core:water_source" +subterrane.dependencies.obsidian = "mcl_core:obsidian" + +end + +minetest.after(0, function() subterrane.dependencies = nil end) -- ensure these are only used during initialization, to avoid polluting the global namespace with irrelevancies \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/depends.txt b/mods/dfcaverns/subterrane/depends.txt new file mode 100644 index 0000000..0ce7821 --- /dev/null +++ b/mods/dfcaverns/subterrane/depends.txt @@ -0,0 +1,3 @@ +default +intllib? +mapgen_helper \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/description.txt b/mods/dfcaverns/subterrane/description.txt new file mode 100644 index 0000000..593a3eb --- /dev/null +++ b/mods/dfcaverns/subterrane/description.txt @@ -0,0 +1 @@ +A mod that creates vast underground caverns and allows biomes to be defined for them \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/features.lua b/mods/dfcaverns/subterrane/features.lua new file mode 100644 index 0000000..b60f9ec --- /dev/null +++ b/mods/dfcaverns/subterrane/features.lua @@ -0,0 +1,284 @@ +local c_air = minetest.get_content_id("air") + +--------------------------------------------------------------------------- +-- For registering a set of stalactite/stalagmite nodes to use with the small stalactite placement function below + +local x_disp = 0.125 +local z_disp = 0.125 + +local stal_on_place = function(itemstack, placer, pointed_thing) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + if minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.record_protection_violation(pt.above, placer:get_player_name()) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] or not minetest.registered_nodes[above.name] then + return itemstack + end + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + local new_param2 + -- check if pointing at an existing stalactite + if minetest.get_item_group(under.name, "subterrane_stal_align") ~= 0 then + new_param2 = under.param2 + else + new_param2 = math.random(0,3) + end + + -- add the node and remove 1 item from the itemstack + minetest.add_node(pt.above, {name = itemstack:get_name(), param2 = new_param2}) + if not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + return itemstack +end + +local stal_box_1 = {{-0.0625+x_disp, -0.5, -0.0625+z_disp, 0.0625+x_disp, 0.5, 0.0625+z_disp}} +local stal_box_2 = {{-0.125+x_disp, -0.5, -0.125+z_disp, 0.125+x_disp, 0.5, 0.125+z_disp}} +local stal_box_3 = {{-0.25+x_disp, -0.5, -0.25+z_disp, 0.25+x_disp, 0.5, 0.25+z_disp}} +local stal_box_4 = {{-0.375+x_disp, -0.5, -0.375+z_disp, 0.375+x_disp, 0.5, 0.375+z_disp}} + +-- Note that a circular table reference will result in a crash, TODO: guard against that. +-- Unlikely to be needed, though - it'd take a lot of work for users to get into this bit of trouble. +local function deep_copy(table_in) + local table_out = {} + for index, value in pairs(table_in) do + if type(value) == "table" then + table_out[index] = deep_copy(value) + else + table_out[index] = value + end + end + return table_out +end + +subterrane.register_stalagmite_nodes = function(base_name, base_node_def, drop_base_name) + base_node_def.groups = base_node_def.groups or {} + base_node_def.groups.subterrane_stal_align = 1 + base_node_def.groups.flow_through = 1 + base_node_def.drawtype = "nodebox" + base_node_def.paramtype = "light" + base_node_def.paramtype2 = "facedir" + base_node_def.node_box = {type = "fixed"} + + local def1 = deep_copy(base_node_def) + def1.groups.fall_damage_add_percent = 100 + def1.node_box.fixed = stal_box_1 + def1.on_place = stal_on_place + if drop_base_name then + def1.drop = drop_base_name.."_1" + end + minetest.register_node(base_name.."_1", def1) + + local def2 = deep_copy(base_node_def) + def2.groups.fall_damage_add_percent = 50 + def2.node_box.fixed = stal_box_2 + def2.on_place = stal_on_place + if drop_base_name then + def2.drop = drop_base_name.."_2" + end + minetest.register_node(base_name.."_2", def2) + + local def3 = deep_copy(base_node_def) + def3.node_box.fixed = stal_box_3 + def3.on_place = stal_on_place + if drop_base_name then + def3.drop = drop_base_name.."_3" + end + minetest.register_node(base_name.."_3", def3) + + local def4 = deep_copy(base_node_def) + def4.node_box.fixed = stal_box_4 + def4.on_place = stal_on_place + if drop_base_name then + def4.drop = drop_base_name.."_4" + end + minetest.register_node(base_name.."_4", def4) + + return { + minetest.get_content_id(base_name.."_1"), + minetest.get_content_id(base_name.."_2"), + minetest.get_content_id(base_name.."_3"), + minetest.get_content_id(base_name.."_4"), + } +end + +------------------------------------------------------------------------------------------------- +-- Use with stalactite nodes defined above + +-- stalagmite_id is a table of the content ids of the four stalagmite sections, from _1 to _4. +function subterrane.stalagmite(vi, area, data, param2_data, param2, height, stalagmite_id) + if height == nil then height = math.random(1,4) end + if param2 == nil then param2 = math.random(0,3) end + + local sign, id_modifier + if height > 0 then + sign = 1 + id_modifier = 1 -- stalagmites are blunter than stalactites + else + sign = -1 + id_modifier = 0 + end + + for i = 1, math.abs(height) do + local svi = vi + (height - i * sign) * area.ystride + if data[svi] == c_air then -- test for air because we don't want these poking into water + data[svi] = stalagmite_id[math.min(i+id_modifier,4)] + param2_data[svi] = param2 + end + end +end + +function subterrane.stalactite(vi, area, data, param2_data, param2, height, stalagmite_id) + subterrane.stalagmite(vi, area, data, param2_data, param2, -height, stalagmite_id) +end + +------------------------------------------------------------------------------------------------- +-- Builds very large stalactites and stalagmites + +--giant stalagmite spawner +function subterrane.big_stalagmite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material) + local pos = area:position(vi) + local x = pos.x + local y = pos.y + local z = pos.z + + local top = math.random(min_height,max_height) + for j = -2, top do --y + for k = -3, 3 do + for l = -3, 3 do + if j <= 0 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l) + if mapgen_helper.buildable_to(data[vi]) then data[vi] = base_material end + end + elseif j <= top/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l) + data[vi] = root_material + end + elseif j <= top/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l) + data[vi] = shaft_material + end + else + local vi = area:index(x, y+j, z) + data[vi] = shaft_material + end + end + end + end +end + +--giant stalactite spawner +function subterrane.big_stalactite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material) + local pos = area:position(vi) + local x = pos.x + local y = pos.y + local z = pos.z + + local bot = math.random(-max_height, -min_height) --grab a random height for the stalagmite + for j = bot, 2 do --y + for k = -3, 3 do + for l = -3, 3 do + if j >= -1 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l) + if mapgen_helper.buildable_to(data[vi]) then data[vi] = base_material end + end + elseif j >= bot/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l) + data[vi] = root_material + end + elseif j >= bot/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l) + data[vi] = shaft_material + end + else + local vi = area:index(x, y+j, z) + data[vi] = shaft_material + end + end + end + end +end + +---------------------------------------------------------------------------------------- +-- Giant mushrooms + +--function to create giant 'shrooms. Cap radius works well from about 2-6 +--if ignore_bounds is true this function will place the mushroom even if it overlaps the edge of the voxel area. +function subterrane.giant_mushroom(vi, area, data, stem_material, cap_material, gill_material, stem_height, cap_radius, ignore_bounds) + + if not ignore_bounds and + not (area:containsi(vi - cap_radius - area.zstride*cap_radius) and + area:containsi(vi + cap_radius + stem_height*area.ystride + area.zstride*cap_radius)) then + return false -- mushroom overlaps the bounds of the voxel area, abort. + end + + local pos = area:position(vi) + local x = pos.x + local y = pos.y + local z = pos.z + + --cap + for k = -cap_radius, cap_radius do + for l = -cap_radius, cap_radius do + if k*k + l*l <= cap_radius*cap_radius then + local vi = area:index(x+k, y+stem_height, z+l) + if mapgen_helper.buildable_to(data[vi]) then data[vi] = cap_material end + end + if k*k + l*l <= (cap_radius-1)*(cap_radius-1) and (cap_radius-1) > 0 then + local vi = area:index(x+k, y+stem_height+1, z+l) + data[vi] = cap_material + vi = area:index(x+k, y+stem_height, z+l) + if data[vi] == cap_material then data[vi] = gill_material end + end + if k*k + l*l <= (cap_radius-2)*(cap_radius-2) and (cap_radius-2) > 0 then + local vi = area:index(x+k, y+stem_height+2, z+l) + if mapgen_helper.buildable_to(data[vi]) then data[vi] = cap_material end + end + if k*k + l*l <= (cap_radius-3)*(cap_radius-3) and (cap_radius-3) > 0 then + local vi = area:index(x+k, y+stem_height+3, z+l) + if mapgen_helper.buildable_to(data[vi]) then data[vi] = cap_material end + end + end + end + --stem + for j = -2, stem_height do -- going down to -2 to ensure the stem is flush with the ground + local vi = area:index(x, y+j, z) + if j >= 0 or area:containsi(vi) then -- since -2 puts us below the bounds we've already tested, add a contains check here. + if mapgen_helper.buildable_to(data[vi]) or data[vi] == gill_material then data[vi] = stem_material end + if cap_radius > 3 then + local ai = area:index(x, y+j, z+1) + if mapgen_helper.buildable_to(data[ai]) or data[ai] == gill_material then data[ai] = stem_material end + ai = area:index(x, y+j, z-1) + if mapgen_helper.buildable_to(data[ai]) or data[ai] == gill_material then data[ai] = stem_material end + ai = area:index(x+1, y+j, z) + if mapgen_helper.buildable_to(data[ai]) or data[ai] == gill_material then data[ai] = stem_material end + ai = area:index(x-1, y+j, z) + if mapgen_helper.buildable_to(data[ai]) or data[ai] == gill_material then data[ai] = stem_material end + end + end + end + return true +end \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/init.lua b/mods/dfcaverns/subterrane/init.lua new file mode 100644 index 0000000..fa0169a --- /dev/null +++ b/mods/dfcaverns/subterrane/init.lua @@ -0,0 +1,619 @@ +-- original cave code modified from paramat's subterrain +-- Modified by HeroOfTheWinds for caverealms +-- Modified by FaceDeer for subterrane +-- Depends default +-- License: code MIT + +subterrane = {} --create a container for functions and constants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +dofile(modpath.."/dependencies.lua") + +local c_stone = minetest.get_content_id(subterrane.dependencies.stone) +local c_clay = minetest.get_content_id(subterrane.dependencies.clay) +local c_desert_stone = minetest.get_content_id(subterrane.dependencies.desert_stone) +local c_sandstone = minetest.get_content_id(subterrane.dependencies.sandstone) + +local c_air = minetest.get_content_id("air") +local c_water = minetest.get_content_id(subterrane.dependencies.water) + +local c_obsidian = minetest.get_content_id(subterrane.dependencies.obsidian) + +local c_cavern_air = c_air +local c_warren_air = c_air + +local subterrane_enable_singlenode_mapping_mode = minetest.settings:get_bool("subterrane_enable_singlenode_mapping_mode", false) +if subterrane_enable_singlenode_mapping_mode then + c_cavern_air = c_stone + c_warren_air = c_clay +end + +local c_lava_set -- will be populated with a set of nodes that count as lava + +-- Performance instrumentation +local t_start = os.clock() + +subterrane.registered_layers = {} + +dofile(modpath.."/defaults.lua") +dofile(modpath.."/features.lua") -- some generic cave features useful for a variety of mapgens +dofile(modpath.."/player_spawn.lua") -- Function for spawning a player in a giant cavern +dofile(modpath.."/test_pos.lua") -- Function other mapgens can use to test if a position is inside a cavern +dofile(modpath.."/legacy.lua") -- contains old node definitions and functions, will be removed at some point in the future. + +local disable_mapgen_caverns = function() + local mg_name = minetest.get_mapgen_setting("mg_name") + local flags_name + local default_flags + + if mg_name == "v7" then + flags_name = "mgv7_spflags" + default_flags = "mountains,ridges,nofloatlands" + elseif mg_name == "v5" then + flags_name = "mgv5_spflags" + default_flags = "" + else + return + end + + local function split(source, delimiters) + local elements = {} + local pattern = '([^'..delimiters..']+)' + string.gsub(source, pattern, function(value) elements[#elements + 1] = value; end); + return elements + end + + local flags_setting = minetest.get_mapgen_setting(flags_name) or default_flags + local new_flags = {} + local flags = split(flags_setting, ", ") + local nocaverns_present = false + for _, flag in pairs(flags) do + if flag ~= "caverns" then + table.insert(new_flags, flag) + end + if flag == "nocaverns" then + nocaverns_present = true + end + end + if not nocaverns_present then + table.insert(new_flags, "nocaverns") + end + minetest.set_mapgen_setting(flags_name, table.concat(new_flags, ","), true) +end +disable_mapgen_caverns() + +-- Column stuff +---------------------------------------------------------------------------------- + +local grid_size = mapgen_helper.block_size * 4 + +subterrane.get_column_points = function(minp, maxp, column_def) + local grids = mapgen_helper.get_nearest_regions(minp, grid_size) + local points = {} + for _, grid in ipairs(grids) do + --The y value of the returned point will be the radius of the column + local minp = {x=grid.x, y = column_def.minimum_radius*100, z=grid.z} + local maxp = {x=grid.x+grid_size-1, y=column_def.maximum_radius*100, z=grid.z+grid_size-1} + for _, point in ipairs(mapgen_helper.get_random_points(minp, maxp, column_def.minimum_count, column_def.maximum_count)) do + point.y = point.y / 100 + if point.x > minp.x - point.y + and point.x < maxp.x + point.y + and point.z > minp.z - point.y + and point.z < maxp.z + point.y then + table.insert(points, point) + end + end + end + return points +end + +subterrane.get_column_value = function(pos, points) + local heat = 0 + for _, point in ipairs(points) do + local axis_point = {x=point.x, y=pos.y, z=point.z} + local radius = point.y + if (pos.x >= axis_point.x-radius and pos.x <= axis_point.x+radius + and pos.z >= axis_point.z-radius and pos.z <= axis_point.z+radius) then + + local dist = vector.distance(pos, axis_point) + if dist < radius then + heat = math.max(heat, 1 - dist/radius) + end + + end + end + return heat +end + + +-- Decoration node lists +---------------------------------------------------------------------------------- + +-- States any given node can be in. Used to detect boundaries +local outside_region = 1 +local inside_ground = 2 +local inside_tunnel = 3 +local inside_cavern = 4 +local inside_warren = 5 +local inside_column = 6 + +-- These arrays will contain the indices of various nodes relevant to decoration +-- Note that table.getn and # will not correctly report the number of items in these since they're reused +-- between calls and are not cleared for efficiency. You can iterate through them using ipairs, +-- and you can get their content count from the similarly-named variable associated with them. +local cavern_data +local cavern_floor_nodes +local cavern_ceiling_nodes +local warren_floor_nodes +local warren_ceiling_nodes +local tunnel_floor_nodes +local tunnel_ceiling_nodes +local column_nodes + +local initialize_node_arrays = function() + cavern_data = {} + cavern_floor_nodes = {} + cavern_data.cavern_floor_nodes = cavern_floor_nodes + cavern_data.cavern_floor_count = 0 + cavern_ceiling_nodes = {} + cavern_data.cavern_ceiling_nodes = cavern_ceiling_nodes + cavern_data.cavern_ceiling_count = 0 + warren_floor_nodes = {} + cavern_data.warren_floor_nodes = warren_floor_nodes + cavern_data.warren_floor_count = 0 + warren_ceiling_nodes = {} + cavern_data.warren_ceiling_nodes = warren_ceiling_nodes + cavern_data.warren_ceiling_count = 0 + tunnel_floor_nodes = {} + cavern_data.tunnel_floor_nodes = tunnel_floor_nodes + cavern_data.tunnel_floor_count = 0 + tunnel_ceiling_nodes = {} + cavern_data.tunnel_ceiling_nodes = tunnel_ceiling_nodes + cavern_data.tunnel_ceiling_count = 0 + column_nodes = {} + cavern_data.column_nodes = column_nodes + cavern_data.column_count = 0 +end +initialize_node_arrays() + +-- inserts nil after the last node so that ipairs will function correctly +local close_node_arrays = function() + cavern_ceiling_nodes[cavern_data.cavern_ceiling_count + 1] = nil + cavern_floor_nodes[cavern_data.cavern_floor_count + 1] = nil + warren_ceiling_nodes[cavern_data.warren_ceiling_count + 1] = nil + warren_floor_nodes[cavern_data.warren_floor_count + 1] = nil + tunnel_ceiling_nodes[cavern_data.tunnel_ceiling_count + 1] = nil + tunnel_floor_nodes[cavern_data.tunnel_floor_count + 1] = nil + column_nodes[cavern_data.column_count + 1] = nil +end + +-- clear the tables without deleting them - easer on memory management this way +local clear_node_arrays = function() + cavern_data.cavern_ceiling_count = 0 + cavern_data.cavern_floor_count = 0 + cavern_data.warren_ceiling_count = 0 + cavern_data.warren_floor_count = 0 + cavern_data.tunnel_ceiling_count = 0 + cavern_data.tunnel_floor_count = 0 + cavern_data.column_count = 0 + +-- for k,v in pairs(cavern_ceiling_nodes) do cavern_ceiling_nodes[k] = nil end +-- for k,v in pairs(cavern_floor_nodes) do cavern_floor_nodes[k] = nil end +-- for k,v in pairs(warren_ceiling_nodes) do warren_ceiling_nodes[k] = nil end +-- for k,v in pairs(warren_floor_nodes) do warren_floor_nodes[k] = nil end +-- for k,v in pairs(tunnel_ceiling_nodes) do tunnel_ceiling_nodes[k] = nil end +-- for k,v in pairs(tunnel_floor_nodes) do tunnel_floor_nodes[k] = nil end +-- for k,v in pairs(column_nodes) do column_nodes[k] = nil end + + close_node_arrays() +end + +-- cave_layer_def +--{ +-- name = -- optional, defaults to the string "y_min to y_max" (with actual values inserted in place of y_min and y_max). Used for logging. +-- y_max = -- required, the highest elevation this cave layer will be generated in. +-- y_min = -- required, the lowest elevation this cave layer will be generated in. +-- cave_threshold = -- optional, Cave threshold. Defaults to 0.5. 1 = small rare caves, 0 = 1/2 ground volume +-- warren_region_threshold = -- optional, defaults to 0.25. Used to determine how much volume warrens take up around caverns. Set it to be equal to or greater than the cave threshold to disable warrens entirely. +-- warren_region_variability_threshold = -- optional, defaults to 0.25. Used to determine how much of the region contained within the warren_region_threshold actually has warrens in it. +-- warren_threshold = -- Optional, defaults to 0.25. Determines how "spongey" warrens are, lower numbers make tighter, less-connected warren passages. +-- boundary_blend_range = -- optional, range near ymin and ymax over which caves diminish to nothing. Defaults to 128. +-- perlin_cave = -- optional, a 3D perlin noise definition table to define the shape of the caves +-- perlin_wave = -- optional, a 3D perlin noise definition table that's averaged with the cave noise to add more horizontal surfaces (squash its spread on the y axis relative to perlin_cave to accomplish this) +-- perlin_warren_area = -- optional, a 3D perlin noise definition table for defining what places warrens form in +-- perlin_warrens = -- optional, a 3D perlin noise definition table for defining the warrens +-- solidify_lava = -- when set to true, lava near the edges of caverns is converted into obsidian to prevent it from spilling in. +-- columns = -- optional, a column_def table for producing truly enormous dripstone formations. See below for definition. Set to nil to disable columns. +-- double_frequency = -- when set to true, uses the absolute value of the cavern field to determine where to place caverns instead. This effectively doubles the number of large non-connected caverns. +-- decorate = -- optional, a function that is given a table of indices and a variety of other mapgen information so that it can place custom decorations on floors and ceilings. It is given the parameters (minp, maxp, seed, vm, cavern_data, area, data). See below for the cavern_data table's member definitions. +-- is_ground_content = -- optional, a function that takes a content_id and returns true if caverns should be carved through that node type. If not provided it defaults to a "is_ground_content" test. +--} + +-- column_def +--{ +-- maximum_radius = -- Maximum radius for individual columns, defaults to 10 +-- minimum_radius = -- Minimum radius for individual columns, defaults to 4 (going lower that this can increase the likelihood of "intermittent" columns with floating sections) +-- node = -- node name to build columns out of. Defaults to default:stone +-- warren_node = -- node name to build columns out of in warren areas. If not set, the nodes that would be columns in warrens will be left as original ground contents +-- weight = -- a floating point value (usually in the range of 0.5-1) to modify how strongly the column is affected by the surrounding cave. Lower values create a more variable, tapered stalactite/stalagmite combination whereas a value of 1 produces a roughly cylindrical column. Defaults to 0.25 +-- maximum_count = -- The maximum number of columns placed in any given column region (each region being a square 4 times the length and width of a map chunk). Defaults to 50 +-- minimum_count = -- The minimum number of columns placed in a column region. The actual number placed will be randomly selected between this range. Defaults to 0. +--} + +-- cavern_data -- This is passed into the decorate method. +--{ +-- cavern_floor_nodes = {} -- List of data indexes for nodes that are part of cavern floors. Note: Use ipairs() when iterating this, not pairs() +-- cavern_floor_count = 0 -- the count of nodes in the preceeding list. +-- cavern_ceiling_nodes = {} -- List of data indexes for nodes that are part of cavern ceilings. Note: Use ipairs() when iterating this, not pairs() +-- cavern_ceiling_count = 0 -- the count of nodes in the preceeding list. +-- warren_floor_nodes = {} -- List of data indexes for nodes that are part of warren floors. Note: Use ipairs() when iterating this, not pairs() +-- warren_floor_count = 0 -- the count of nodes in the preceeding list. +-- warren_ceiling_nodes = {} -- List of data indexes for nodes that are part of warren floors. Note: Use ipairs() when iterating this, not pairs() +-- warren_ceiling_count = 0 -- the count of nodes in the preceeding list. +-- tunnel_floor_nodes = {} -- List of data indexes for nodes that are part of floors in pre-existing tunnels (anything generated before this mapgen runs). Note: Use ipairs() when iterating this, not pairs() +-- tunnel_floor_count = 0 -- the count of nodes in the preceeding list. +-- tunnel_ceiling_nodes = {} -- List of data indexes for nodes that are part of ceiling in pre-existing tunnels (anything generated before this mapgen runs). Note: Use ipairs() when iterating this, not pairs() +-- tunnel_ceiling_count = 0 -- the count of nodes in the preceeding list. +-- column_nodes = {} -- Nodes that belong to columns. Note that if the warren_node was not set in the column definition these might not have been replaced by anything yet. This list contains *all* column nodes, not just ones on the surface. +-- column_count = 0 -- the count of nodes in the preceeding list. + +-- contains_cavern = false -- Use this if you want a quick check if the generated map chunk has any cavern volume in it. Don't rely on the node counts above, if the map chunk doesn't intersect the floor or ceiling those could be 0 even if a cavern is present. +-- contains_warren = false -- Ditto for contains_cavern +-- nvals_cave = nvals_cave -- The noise array used to generate the cavern. +-- cave_area = cave_area -- a VoxelArea for indexing nvals_cave +-- cavern_def = cave_layer_def -- a reference to the cave layer def. +--} + +subterrane.register_layer = function(cave_layer_def) + local error_out = false + if cave_layer_def.y_min == nil then + minetest.log("error", "[subterrane] cave layer def " .. tostring(cave_layer_def.name) .. " did not have a y_min defined. Not registered.") + error_out = true + end + if cave_layer_def.y_max == nil then + minetest.log("error", "[subterrane] cave layer def " .. tostring(cave_layer_def.name) .. " did not have a y_max defined. Not registered.") + error_out = true + end + if error_out then return end + + subterrane.set_defaults(cave_layer_def) + + local YMIN = cave_layer_def.y_min + local YMAX = cave_layer_def.y_max + + if cave_layer_def.name == nil then + cave_layer_def.name = tostring(YMIN) .. " to " .. tostring(YMAX) + end + + local cave_name = cave_layer_def.name + + if subterrane.registered_layers[cave_name] ~= nil then + minetest.log("warning", "[subterrane] cave layer def " .. tostring(cave_name) .. " has already been registered. Overriding with new definition.") + end + subterrane.registered_layers[cave_name] = cave_layer_def + + local block_size = mapgen_helper.block_size + + if (YMAX+32+1)%block_size ~= 0 then + local boundary = YMAX -(YMAX+32+1)%block_size + minetest.log("warning", "[subterrane] The y_max setting "..tostring(YMAX).. + " for cavern layer " .. cave_name .. " is not aligned with map chunk boundaries. Consider ".. + tostring(boundary) .. " or " .. tostring(boundary+block_size) .. " for maximum mapgen efficiency.") + end + if (YMIN+32)%block_size ~= 0 then + local boundary = YMIN - (YMIN+32)%block_size + minetest.log("warning", "[subterrane] The y_min setting "..tostring(YMIN).. + " for cavern layer " .. cave_name .. " is not aligned with map chunk boundaries. Consider ".. + tostring(boundary) .. " or " .. tostring(boundary+block_size) .. " for maximum mapgen efficiency.") + end + + local BLEND = math.min(cave_layer_def.boundary_blend_range, (YMAX-YMIN)/2) + + local TCAVE = cave_layer_def.cave_threshold + local warren_area_threshold = cave_layer_def.warren_region_threshold -- determines how much volume warrens are found in around caverns + local warren_area_variability_threshold = cave_layer_def.warren_region_variability_threshold -- determines how much of the warren_area_threshold volume actually has warrens in it + local warren_threshold = cave_layer_def.warren_threshold -- determines narrowness of warrens themselves + + local solidify_lava = cave_layer_def.solidify_lava + + local np_cave = cave_layer_def.perlin_cave + local np_wave = cave_layer_def.perlin_wave + local np_warren_area = cave_layer_def.perlin_warren_area + local np_warrens = cave_layer_def.perlin_warrens + + local y_blend_min = YMIN + BLEND * 1.5 + local y_blend_max = YMAX - BLEND * 1.5 + + local column_def = cave_layer_def.columns + local c_column + local c_warren_column + + if column_def then + c_column = minetest.get_content_id(column_def.node) + if column_def.warren_node then + c_warren_column = minetest.get_content_id(column_def.warren_node) + end + end + + local double_frequency = cave_layer_def.double_frequency + + local decorate = cave_layer_def.decorate + + if subterrane_enable_singlenode_mapping_mode then + decorate = nil + c_column = c_air + c_warren_column = nil + end + + local is_ground_content = cave_layer_def.is_ground_content + if is_ground_content == nil then + is_ground_content = mapgen_helper.is_ground_content + end + +-- On generated +---------------------------------------------------------------------------------- + +minetest.register_on_generated(function(minp, maxp, seed) + --if out of range of cave definition limits, abort + if minp.y > YMAX or maxp.y < YMIN then + return + end + t_start = os.clock() + + if c_lava_set == nil then + c_lava_set = {} + for name, def in pairs(minetest.registered_nodes) do + if def.groups ~= nil and def.groups.lava ~= nil then + c_lava_set[minetest.get_content_id(name)] = true + end + end + end + + local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2() + local emin = area.MinEdge + local emax = area.MaxEdge + local nvals_cave, cave_area = mapgen_helper.perlin3d("subterrane:cave", emin, emax, np_cave) --cave noise for structure + local nvals_wave = mapgen_helper.perlin3d("subterrane:wave", emin, emax, np_wave) --wavy structure of cavern ceilings and floors + + -- pre-average everything so that the final values can be passed + -- along to the decorate function if it wants them + for vi, value in ipairs(nvals_cave) do + nvals_cave[vi] = (value + nvals_wave[vi])/2 + end + + local warren_area_uninitialized = true + local nvals_warren_area + local warrens_uninitialized = true + local nvals_warrens + + local previous_y = emin.y + local previous_node_state = outside_region + local this_node_state = outside_region + + local column_points = nil + local column_weight = nil + + -- This information might be of use to the decorate function. + cavern_data.contains_cavern = false + cavern_data.contains_warren = false + cavern_data.nvals_cave = nvals_cave + cavern_data.cave_area = cave_area + cavern_data.cavern_def = cave_layer_def + + -- The interp_yxz iterator iterates upwards in columns along the y axis. + -- starts at miny, goes to maxy, then switches to a new x,z and repeats. + for vi, x, y, z in area:iterp_yxz(emin, emax) do + -- We're "over-generating" when carving out the empty space of the cave volume so that decorations + -- can slop over the boundaries of the mapblock without being cut off. + -- We only want to add vi to the various decoration node lists if we're actually within the mapblock. + local is_within_current_mapblock = mapgen_helper.is_pos_within_box({x=x, y=y, z=z}, minp, maxp) + + if y < previous_y then + -- we've switched to a new column + previous_node_state = outside_region + else + previous_node_state = this_node_state + end + previous_y = y + this_node_state = inside_ground + + local cave_local_threshold + if y < y_blend_min then + cave_local_threshold = TCAVE + ((y_blend_min - y) / BLEND) ^ 2 + elseif y > y_blend_max then + cave_local_threshold = TCAVE + ((y - y_blend_max) / BLEND) ^ 2 + else + cave_local_threshold = TCAVE + end + + local cave_value = nvals_cave[vi] + if double_frequency then + if cave_value < 0 then + cave_value = -cave_value + if subterrane_enable_singlenode_mapping_mode then + c_cavern_air = c_desert_stone + c_warren_air = c_sandstone + end + else + if subterrane_enable_singlenode_mapping_mode then + c_cavern_air = c_stone + c_warren_air = c_clay + end + + end + end + + -- inside a giant cavern + if cave_value > cave_local_threshold then + local column_value = 0 + if column_def then + if column_points == nil then + column_points = subterrane.get_column_points(emin, maxp, column_def) + column_weight = column_def.weight + end + column_value = subterrane.get_column_value({x=x, y=y, z=z}, column_points) + end + + if column_value > 0 and cave_value - column_value * column_weight < cave_local_threshold then + -- only add column nodes if we're within the current mapblock because + -- otherwise we're adding column nodes that the decoration loop won't know about + if is_ground_content(data[vi]) and is_within_current_mapblock then + data[vi] = c_column -- add a column node + end + this_node_state = inside_column + else + if is_ground_content(data[vi]) then + data[vi] = c_cavern_air --hollow it out to make the cave + end + this_node_state = inside_cavern + if is_within_current_mapblock then + cavern_data.contains_cavern = true + end + end + end + + -- If there's lava near the edges of the cavern, solidify it. + if solidify_lava and cave_value > cave_local_threshold - 0.05 and c_lava_set[data[vi]] then + data[vi] = c_obsidian + end + + --borderlands of a giant cavern, possible warren area + if cave_value <= cave_local_threshold and cave_value > warren_area_threshold then + + if warren_area_uninitialized then + nvals_warren_area = mapgen_helper.perlin3d("subterrane:warren_area", emin, emax, np_warren_area) -- determine which areas are spongey with warrens + warren_area_uninitialized = false + end + + local warren_area_value = nvals_warren_area[vi] + if warren_area_value > warren_area_variability_threshold then + -- we're in a warren-containing area + if solidify_lava and c_lava_set[data[vi]] then + data[vi] = c_obsidian + end + + if warrens_uninitialized then + nvals_warrens = mapgen_helper.perlin3d("subterrane:warrens", emin, emax, np_warrens) --spongey warrens + warrens_uninitialized = false + end + + -- we don't want warrens "cutting off" abruptly at the large-scale boundary noise thresholds, so turn these into gradients + -- that can be applied to choke off the warren gradually. + local cave_value_edge = math.min(1, (cave_value - warren_area_threshold) * 20) -- make 0.3 = 0 and 0.25 = 1 to produce a border gradient + local warren_area_value_edge = math.min(1, warren_area_value * 50) -- make 0 = 0 and 0.02 = 1 to produce a border gradient + + local warren_value = nvals_warrens[vi] + local warren_local_threshold = warren_threshold + (2 - warren_area_value_edge - cave_value_edge) + if warren_value > warren_local_threshold then + + local column_value = 0 + if column_def then + if column_points == nil then + column_points = subterrane.get_column_points(emin, emax, column_def) + column_weight = column_def.weight + end + column_value = subterrane.get_column_value({x=x, y=y, z=z}, column_points) + end + + if column_value > 0 and column_value + (warren_local_threshold - warren_value) * column_weight > 0 then + if c_warren_column then + if is_ground_content(data[vi]) then + data[vi] = c_warren_column -- add a column node + end + this_node_state = inside_column + end + else + if is_ground_content(data[vi]) then + data[vi] = c_warren_air --hollow it out to make the cave + end + if is_within_current_mapblock then + cavern_data.contains_warren = true + end + this_node_state = inside_warren + end + end + end + end + + -- If decorate is defined, we want to track all this stuff + if decorate ~= nil then + local c_current_node = data[vi] + local current_node_is_open = c_current_node == c_air -- mapgen_helper.buildable_to(c_current_node) + if current_node_is_open and this_node_state == inside_ground then + -- we're in a preexisting open space (tunnel). + this_node_state = inside_tunnel + end + + if is_within_current_mapblock then + if this_node_state == inside_column then + cavern_data.column_count = cavern_data.column_count + 1 + column_nodes[cavern_data.column_count] = vi + elseif previous_node_state ~= this_node_state and previous_node_state ~= inside_column then + if previous_node_state == inside_ground then + if this_node_state == inside_tunnel then + -- we just entered a tunnel from below. + cavern_data.tunnel_floor_count = cavern_data.tunnel_floor_count + 1 + tunnel_floor_nodes[cavern_data.tunnel_floor_count] = vi-area.ystride + elseif this_node_state == inside_cavern then + -- we just entered the cavern from below + cavern_data.cavern_floor_count = cavern_data.cavern_floor_count + 1 + cavern_floor_nodes[cavern_data.cavern_floor_count] = vi - area.ystride + elseif this_node_state == inside_warren then + -- we just entered the warren from below + cavern_data.warren_floor_count = cavern_data.warren_floor_count + 1 + warren_floor_nodes[cavern_data.warren_floor_count] = vi - area.ystride + end + elseif this_node_state == inside_ground then + if previous_node_state == inside_tunnel then + -- we just left a tunnel from below + cavern_data.tunnel_ceiling_count = cavern_data.tunnel_ceiling_count + 1 + tunnel_ceiling_nodes[cavern_data.tunnel_ceiling_count] = vi + elseif previous_node_state == inside_cavern then + --we just left the cavern from below + cavern_data.cavern_ceiling_count = cavern_data.cavern_ceiling_count + 1 + cavern_ceiling_nodes[cavern_data.cavern_ceiling_count] = vi + elseif previous_node_state == inside_warren then + --we just left the cavern from below + cavern_data.warren_ceiling_count = cavern_data.warren_ceiling_count + 1 + warren_ceiling_nodes[cavern_data.warren_ceiling_count] = vi + end + end + end + end + end + end + + if decorate then + close_node_arrays() -- inserts nil after the last node so that ipairs will function correctly + decorate(minp, maxp, seed, vm, cavern_data, area, data) + clear_node_arrays() -- if decorate is not defined these arrays will never have anything added to them, so it's safe to not call this in that case + end + + --send data back to voxelmanip + vm:set_data(data) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + vm:update_liquids() + --write it to world + vm:write_to_map() + + local time_taken = os.clock() - t_start -- how long this chunk took, in seconds + mapgen_helper.record_time(cave_name, time_taken) +end) + +end + +local last_check = os.clock() +minetest.register_globalstep(function(dtime) + local current_time = os.clock() + local threshold = t_start + 60 + if last_check < threshold and current_time > threshold then + -- It's been 60 seconds since we last generated a cavern, release the memory the cavern arrays are being stored in. + initialize_node_arrays() + end + last_check = current_time +end) + +minetest.log("info", "[Subterrane] loaded!") diff --git a/mods/dfcaverns/subterrane/legacy.lua b/mods/dfcaverns/subterrane/legacy.lua new file mode 100644 index 0000000..bd57b0d --- /dev/null +++ b/mods/dfcaverns/subterrane/legacy.lua @@ -0,0 +1,137 @@ +--These nodes used to be defined by subterrane but were pulled due to not wanting to force all mods that use it to create these nodes. +--For backwards compatibility they can still be defined here, however. + +local enable_legacy = minetest.settings:get_bool("subterrane_enable_legacy_dripstone", false) + +if enable_legacy then + +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +subterrane.register_stalagmite_nodes("subterrane:dry_stal", { + description = S("Dry Dripstone"), + tiles = { + "default_stone.png^[brighten", + }, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +local flowstone_drops +if minetest.get_modpath("default") then + flowstone_drops = 'default:cobble' +end + +minetest.register_node("subterrane:dry_flowstone", { + description = S("Dry Flowstone"), + tiles = {"default_stone.png^[brighten"}, + groups = {cracky = 3, stone = 1}, + drop = flowstone_drops, + sounds = default.node_sound_stone_defaults(), +}) + +----------------------------------------------- + +subterrane.register_stalagmite_nodes("subterrane:wet_stal", { + description = S("Wet Dripstone"), + tiles = { + "default_stone.png^[brighten^subterrane_dripstone_streaks.png", + }, + groups = {cracky = 3, stone = 2, subterrane_wet_dripstone = 1}, + sounds = default.node_sound_stone_defaults(), +}, "subterrane:dry_stal") + +minetest.register_node("subterrane:wet_flowstone", { + description = S("Wet Flowstone"), + tiles = {"default_stone.png^[brighten^subterrane_dripstone_streaks.png"}, + groups = {cracky = 3, stone = 1, subterrane_wet_dripstone = 1}, + drop = flowstone_drops, + sounds = default.node_sound_stone_defaults(), +}) + +end + +function subterrane:small_stalagmite(vi, area, data, param2_data, param2, height, stalagmite_id) + subterrane.stalagmite(vi, area, data, param2_data, param2, height, stalagmite_id) +end + +function subterrane:giant_stalagmite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material) + subterrane.big_stalagmite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material) +end + +function subterrane:giant_stalactite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material) + subterrane.big_stalactite(vi, area, data, min_height, max_height, base_material, root_material, shaft_material) +end + +function subterrane:giant_shroom(vi, area, data, stem_material, cap_material, gill_material, stem_height, cap_radius, ignore_bounds) + subterrane.giant_mushroom(vi, area, data, stem_material, cap_material, gill_material, stem_height, cap_radius, ignore_bounds) +end + +--FUNCTIONS-- + +local grid_size = mapgen_helper.block_size * 4 + +function subterrane:vertically_consistent_randomp(pos) + local next_seed = math.floor(math.random() * 2^31) + math.randomseed(minetest.hash_node_position({x=pos.x, y=0, z=pos.z})) + local output = math.random() + math.randomseed(next_seed) + return output +end + +function subterrane:vertically_consistent_random(vi, area) + local pos = area:position(vi) + return subterrane:vertically_consistent_randomp(pos) +end + +subterrane.get_point_heat = function(pos, points) + local heat = 0 + for _, point in ipairs(points) do + local axis_point = {x=point.x, y=pos.y, z=point.z} + local radius = point.y + if (pos.x >= axis_point.x-radius and pos.x <= axis_point.x+radius + and pos.z >= axis_point.z-radius and pos.z <= axis_point.z+radius) then + + local dist = vector.distance(pos, axis_point) + if dist < radius then + heat = math.max(heat, 1 - dist/radius) + end + + end + end + return heat +end + +-- Unfortunately there's no easy way to override a single biome, so do it by wiping everything and re-registering +-- Not only that, but the decorations also need to be wiped and re-registered - it appears they keep +-- track of the biome they belong to via an internal ID that gets changed when the biomes +-- are re-registered, resulting in them being left assigned to the wrong biomes. +function subterrane:override_biome(biome_def) + + --Minetest 0.5 adds this "unregister biome" method + if minetest.unregister_biome and biome_def.name then + minetest.unregister_biome(biome_def.name) + minetest.register_biome(biome_def) + return + end + + local registered_biomes_copy = {} + for old_biome_key, old_biome_def in pairs(minetest.registered_biomes) do + registered_biomes_copy[old_biome_key] = old_biome_def + end + local registered_decorations_copy = {} + for old_decoration_key, old_decoration_def in pairs(minetest.registered_decorations) do + registered_decorations_copy[old_decoration_key] = old_decoration_def + end + + registered_biomes_copy[biome_def.name] = biome_def + + minetest.clear_registered_decorations() + minetest.clear_registered_biomes() + for biome_key, new_biome_def in pairs(registered_biomes_copy) do + minetest.register_biome(new_biome_def) + end + for decoration_key, new_decoration_def in pairs(registered_decorations_copy) do + minetest.register_decoration(new_decoration_def) + end +end diff --git a/mods/dfcaverns/subterrane/license.txt b/mods/dfcaverns/subterrane/license.txt new file mode 100644 index 0000000..fb59050 --- /dev/null +++ b/mods/dfcaverns/subterrane/license.txt @@ -0,0 +1,19 @@ +Copyright 2017 by FaceDeer, HeroOfTheWinds, Paramat. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/locale/subterrane.de.tr b/mods/dfcaverns/subterrane/locale/subterrane.de.tr new file mode 100644 index 0000000..b292807 --- /dev/null +++ b/mods/dfcaverns/subterrane/locale/subterrane.de.tr @@ -0,0 +1,9 @@ +# textdomain: subterrane + + +### legacy.lua ### + +Dry Dripstone=Trockener Tropfstein +Dry Flowstone=Trockener Fließstein +Wet Dripstone=Nasser Tropfstein +Wet Flowstone=Nasser Fließstein diff --git a/mods/dfcaverns/subterrane/locale/subterrane.it.tr b/mods/dfcaverns/subterrane/locale/subterrane.it.tr new file mode 100644 index 0000000..9f2838a --- /dev/null +++ b/mods/dfcaverns/subterrane/locale/subterrane.it.tr @@ -0,0 +1,13 @@ +# textdomain: subterrane + + +### legacy.lua ### + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dry Dripstone=Pietra gocciolante secca +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Dry Flowstone=Flowstone secco +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Wet Dripstone=Dripstone bagnato +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Wet Flowstone=Flowstone bagnato diff --git a/mods/dfcaverns/subterrane/locale/template.txt b/mods/dfcaverns/subterrane/locale/template.txt new file mode 100644 index 0000000..c548448 --- /dev/null +++ b/mods/dfcaverns/subterrane/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: subterrane + + +### legacy.lua ### + +Dry Dripstone= +Dry Flowstone= +Wet Dripstone= +Wet Flowstone= diff --git a/mods/dfcaverns/subterrane/mod.conf b/mods/dfcaverns/subterrane/mod.conf new file mode 100644 index 0000000..8f3396e --- /dev/null +++ b/mods/dfcaverns/subterrane/mod.conf @@ -0,0 +1,4 @@ +name = subterrane +description = A mapgen helper mod that facilitates the creation of vast underground caverns +optional_depends = default, mcl_core +depends = mapgen_helper \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/player_spawn.lua b/mods/dfcaverns/subterrane/player_spawn.lua new file mode 100644 index 0000000..864826d --- /dev/null +++ b/mods/dfcaverns/subterrane/player_spawn.lua @@ -0,0 +1,141 @@ +local sidelen = mapgen_helper.block_size + +local snap_to_minp = function(ydepth) + return ydepth - (ydepth+32) % sidelen -- put ydepth at the minp.y of mapblocks +end + +function subterrane:register_cave_spawn(cave_layer_def, start_depth) + minetest.register_on_newplayer(function(player) + local ydepth = snap_to_minp(start_depth or cave_layer_def.y_max) + local spawned = false + while spawned ~= true do + spawned = spawnplayer(cave_layer_def, player, ydepth) + ydepth = ydepth - sidelen + if ydepth < cave_layer_def.y_min then + ydepth = snap_to_minp(cave_layer_def.y_max) + end + end + end) + + minetest.register_on_respawnplayer(function(player) + local ydepth = snap_to_minp(start_depth or cave_layer_def.y_max) + local spawned = false + while spawned ~= true do + spawned = spawnplayer(cave_layer_def, player, ydepth) + ydepth = ydepth - sidelen + if ydepth < cave_layer_def.y_min then + ydepth = snap_to_minp(cave_layer_def.y_max) + end + end + return true + end) +end + +local outside_region = 0 +local inside_ground = 1 +local inside_cavern = 2 + +-- Spawn player underground in a giant cavern +function spawnplayer(cave_layer_def, player, ydepth) + subterrane.set_defaults(cave_layer_def) + + local YMIN = cave_layer_def.y_min + local YMAX = cave_layer_def.y_max + local BLEND = math.min(cave_layer_def.boundary_blend_range, (YMAX-YMIN)/2) + + local TCAVE = cave_layer_def.cave_threshold + + local np_cave = cave_layer_def.perlin_cave + local np_wave = cave_layer_def.perlin_wave + + local y_blend_min = YMIN + BLEND * 1.5 + local y_blend_max = YMAX - BLEND * 1.5 + + local column_def = cave_layer_def.columns + local double_frequency = cave_layer_def.double_frequency + + local options = {} + + for chunk = 1, 64 do + minetest.log("info", "[subterrane] searching for spawn "..chunk) + + local minp = {x = sidelen * math.random(-32, 32) - 32, z = sidelen * math.random(-32, 32) - 32, y = ydepth} + local maxp = {x = minp.x + sidelen - 1, z = minp.z + sidelen - 1, y = ydepth + sidelen - 1} + + local nvals_cave, cave_area = mapgen_helper.perlin3d("subterrane:cave", minp, maxp, np_cave) --cave noise for structure + local nvals_wave = mapgen_helper.perlin3d("subterrane:wave", minp, maxp, np_wave) --wavy structure of cavern ceilings and floors + + -- pre-average everything + for vi, value in ipairs(nvals_cave) do + nvals_cave[vi] = (value + nvals_wave[vi])/2 + end + local column_points = nil + local column_weight = nil + + local previous_y = minp.y + local previous_node_state = outside_region + + for vi, x, y, z in cave_area:iterp_yxz(vector.add(minp, 2), vector.subtract(maxp, 2)) do + + if y < previous_y then + previous_node_state = outside_region + end + previous_y = y + + local cave_local_threshold + if y < y_blend_min then + cave_local_threshold = TCAVE + ((y_blend_min - y) / BLEND) ^ 2 + elseif y > y_blend_max then + cave_local_threshold = TCAVE + ((y - y_blend_max) / BLEND) ^ 2 + else + cave_local_threshold = TCAVE + end + + local cave_value = nvals_cave[vi] + if double_frequency then + cave_value = math.abs(cave_value) + end + + -- inside a giant cavern + if cave_value > cave_local_threshold then + local column_value = 0 + local inside_column = false + if column_def then + if column_points == nil then + column_points = subterrane.get_column_points(minp, maxp, column_def) + column_weight = column_def.weight + end + column_value = subterrane.get_column_value({x=x, y=y, z=z}, column_points) + end + inside_column = column_value > 0 and cave_value - column_value * column_weight < cave_local_threshold + if previous_node_state == inside_ground and not inside_column then + -- we just entered the cavern from below. Do a quick check for head space. + local val_above = nvals_cave[vi+cave_area.ystride] + if double_frequency then + val_above = math.abs(val_above) + end + if val_above > cave_local_threshold then + table.insert(options, {x=x, y=y+1, z=z}) + end + end + if not inside_column then + previous_node_state = inside_cavern + else + previous_node_state = inside_ground + end + + else + previous_node_state = inside_ground + end + end + + if table.getn(options) > 20 then -- minimum 20 to ensure the player is put in a place with a modicum of size + local choice = math.random(1, table.getn(options)) + local spawnpoint = options[ choice ] + minetest.log("action", "[subterrane] spawning player " .. minetest.pos_to_string(spawnpoint)) + player:setpos(spawnpoint) + return true + end + end + return false +end diff --git a/mods/dfcaverns/subterrane/screenshot.png b/mods/dfcaverns/subterrane/screenshot.png new file mode 100644 index 0000000..5351817 Binary files /dev/null and b/mods/dfcaverns/subterrane/screenshot.png differ diff --git a/mods/dfcaverns/subterrane/settingtypes.txt b/mods/dfcaverns/subterrane/settingtypes.txt new file mode 100644 index 0000000..8a41054 --- /dev/null +++ b/mods/dfcaverns/subterrane/settingtypes.txt @@ -0,0 +1,3 @@ +subterrane_enable_legacy_dripstone (Adds old dripstone node definitions) bool false +#Use this mode with singlenode mapgen to produce a large-scale map of a particular world's caverns +subterrane_enable_singlenode_mapping_mode (Fills cavern volume with stone and warrens with desertstone) bool false \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/test_pos.lua b/mods/dfcaverns/subterrane/test_pos.lua new file mode 100644 index 0000000..5733bb4 --- /dev/null +++ b/mods/dfcaverns/subterrane/test_pos.lua @@ -0,0 +1,65 @@ +-- If pos is located inside a cavern volume, returns the list of cavern definitions that +-- are responsible for that cavern volume. If not inside a cavern volume returns an empty list. + +-- This is a somewhat expensive function, take care not to use it more than necessary +subterrane.is_in_cavern = function(pos) + local results = {} + + for _, cave_layer_def in pairs(subterrane.registered_layers) do + local YMIN = cave_layer_def.y_min + local YMAX = cave_layer_def.y_max + local y = pos.y + if y <= YMAX and y >= YMIN then + local block_size = mapgen_helper.block_size + local BLEND = math.min(cave_layer_def.boundary_blend_range, (YMAX-YMIN)/2) + local TCAVE = cave_layer_def.cave_threshold + local np_cave = cave_layer_def.perlin_cave + local np_wave = cave_layer_def.perlin_wave + local y_blend_min = YMIN + BLEND * 1.5 + local y_blend_max = YMAX - BLEND * 1.5 + local nval_cave = minetest.get_perlin(np_cave):get_3d(pos) --cave noise for structure + local nval_wave = minetest.get_perlin(np_wave):get_3d(pos) --wavy structure of cavern ceilings and floors + nval_cave = (nval_cave + nval_wave)/2 + local cave_local_threshold + if y < y_blend_min then + cave_local_threshold = TCAVE + ((y_blend_min - y) / BLEND) ^ 2 + elseif y > y_blend_max then + cave_local_threshold = TCAVE + ((y - y_blend_max) / BLEND) ^ 2 + else + cave_local_threshold = TCAVE + end + if cave_layer_def.double_frequency and nval_cave < 0 then + nval_cave = -nval_cave + end + if nval_cave > cave_local_threshold then + table.insert(results, cave_layer_def) + end + end + end + + return results +end + +-- returns the value of the cavern field at a particular location for a particular cavern definition. +subterrane.get_cavern_value = function(name, pos) + local cave_layer_def = subterrane.registered_layers[name] + + local YMIN = cave_layer_def.y_min + local YMAX = cave_layer_def.y_max + local y = pos.y + if y > YMAX or y < YMIN then + return nil + end + + local block_size = mapgen_helper.block_size + local BLEND = math.min(cave_layer_def.boundary_blend_range, (YMAX-YMIN)/2) + local TCAVE = cave_layer_def.cave_threshold + local np_cave = cave_layer_def.perlin_cave + local np_wave = cave_layer_def.perlin_wave + local y_blend_min = YMIN + BLEND * 1.5 + local y_blend_max = YMAX - BLEND * 1.5 + local nval_cave = minetest.get_perlin(np_cave):get_3d(pos) --cave noise for structure + local nval_wave = minetest.get_perlin(np_wave):get_3d(pos) --wavy structure of cavern ceilings and floors + nval_cave = (nval_cave + nval_wave)/2 + return nval_cave +end \ No newline at end of file diff --git a/mods/dfcaverns/subterrane/textures/subterrane_dripstone_streaks.png b/mods/dfcaverns/subterrane/textures/subterrane_dripstone_streaks.png new file mode 100644 index 0000000..dc792f9 Binary files /dev/null and b/mods/dfcaverns/subterrane/textures/subterrane_dripstone_streaks.png differ diff --git a/mods/dfcaverns/subterrane/tools/updatepo.sh b/mods/dfcaverns/subterrane/tools/updatepo.sh new file mode 100755 index 0000000..74332e0 --- /dev/null +++ b/mods/dfcaverns/subterrane/tools/updatepo.sh @@ -0,0 +1,22 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/ebiomes/README.txt b/mods/ebiomes/README.txt new file mode 100644 index 0000000..be8cc10 --- /dev/null +++ b/mods/ebiomes/README.txt @@ -0,0 +1,171 @@ +######################################### +################ebiomes################## +######################################### + +Version 1.5.4 - By CowboyLv + +## Changes + +1.5.4 + +Updated swamp water +Minor Latvian translation fixes +Removal of depends.txt +Namespace update (minetest.thing is now core.thing) + +1.5.3 + +Toggles for disabling mobs (mobs, forgotten_monsters) +Addition of eatable group +Russian (by adikalon) and Latvian translations + +1.5.2 + +Merged changes by adikalon to eliminate conflicts with nether mods + +1.5.1 + +Added setting descriptions +Implemented a setting to make quagmires generate without cranberries + +1.5.0 + +Added Maple and Oak trees which are found in deciduous forest variants if extensions are enabled(default on) +Made cooking recipes with buckets have the cookable item be placed on top, instead of right +Added dyes to flowers - Credit to Skivling +Added sands with debris +Reworked reregistration so it only affects snowy grassland without touching other mods. + +1.4.1 + +Implemented a light mapgen(decorations) toggle to reduce mapgen lag on the denser biomes + +1.4.0 + +Biomes +Jungle Savanna - Biome between Humid Savanna and Rainforest +Temperate Rainforest - Thick wet forest found near various Temperate forest biomes, has beech tree +Grassland and Deciduous Forest extensions that blend with nearby biomes + +Color adjustments in steppes and warm grass biomes +Various tweaks and fixes + + +1.3.0 + +Code refactor - Biomes made before 1.2.0 release are now toggleable, closely related biomes are lumped into groups. + +Cowberries can also be now disabled, disabling them will disable reregistering of decorations even if reregistering toggle is set to enabled. (Since they are the only reason for that to begin with) + +Support for nssm. However nssm seems to significantly slow down mapgen, even when it's the only mod active. Therefore it's recommended only for the biggest fans of it. Support toggle can be left on, it's fine as long as nssm isn't actually loaded. + +Player can now also disable buffer biomes. (Since 1.2.0 there were only two Sandstone Desert Buffer and Cold Desert Buffer) + +Slight adjustments to mob spawns - e.g. Bunnies now spawn in more biomes. + +1.2.3 + +Typo fixes +Uppdated grassland code with normal_grass group to match current minetest game versions +Wilhelmines Animal World (animalworld) by liil support + + +1.2.2 + +Warm steppe underground parameters fixed, small general cleanup. +Before version bump - Reeds fixed and cranberries retexture. + +1.2.1 + +Humid Savanna ground layer fix. +Added settings for Humid Savanna and Japanese Rainforest. + +1.2.0 + +Added Humid Savanna and Japanese Rainforest biomes. +Bamboo - Can be turned off if need be. (Don't do this on worlds where it was on) +Filled in missing aliases. +Removed 2 "biome fillers"(Humid Rainforest, Humid Deiciduous Forest). Those do not add anything, they merelly fill space with a preexisting biome to prevent abnormalities. +Tweaks in arid grasslands. Colors and Cool Arid Grassland now has more grass. + + +1.1.2 + +Added a setting to disable reregistering decorations, so that the mod can be made compatible with other biome mods. + + +1.1.1 + +Reduced the unregisters. +Previously reregister.lua unregistered all biomes, ore and decorations before reregistering them. +Now it unregisters and reregisters decorations only. + + +1.1.0 + +Reworked swamp - Now has 2 parts. Swampland and Bog. + + +1.0.1 + +Added Forgotten Monsters by DuckGo support. + + + +## General + +This is a vanilla themed mod for minetest game, designed to bring vanilla like biomes with least amount of changes to the vanilla minetest. + +Several popular mods are supported - bonemeal, mobs_animal, mobs_monster, mobs_npc, mob_horse, moreblocks, flowerpot +Post 1.0.0 - forgotten_monsters, animalworld, nssm + +As of 1.2.0 the player can disable bamboo in Extra Biomes modmenu, either as a preference. +Or if a different mod will be used for adding bamboo. + +Some biomes depend on others like: + +Jungle Savanna - Humid Savanna +Temperate Rainforest - Cold and Warm Deciduous Forests +Extensions - Cold Deciduous, Warm Deciduous, Steppes + +Don't use v6 mapgen, everything else is fine. + +## Additions + +- Deciduous forest variants - Warm and Cold Deciduous forests +- A swamp biome on humid Cold Deciduous Forest zones near sea level. +- Mediterranean biome. +- Dry grasslands - Found between grasslands and deserts +- Warm grassland - Intended as a transition biome +- Steppes - Between Grassland and Snowy Grassland +- Bog - Internal Swamp biome (1.1.0) +- Humid Savanna (1.2.0) +- Japanese Rainforest (1.2.0) +- Jungle Savanna (1.4.0) +- Temperate Rainforest (1.4.0) +- Grassland and Deciduous Forest Extensions (1.4.0) + +## Notes + +Tips: + +Bonemeal mod is highly recommended + +There is a hurful bush in game which can only be cut with bronze or a better sword. + +Bog is nasty, watch Your step. + +As of version 1.2.0 the player can encounter moss patches in the Japanese Rainforest. Those are useful for making mossy cobblestone. Or the player can use bonemeal to grow the occasional moss patch out of the rainforest litter there. + +Bamboo patches occur on Japanese and regular Rainforest. (By default) + +Things lacking - Fireflies on the mods biomes(a bug on mtg end as of July 13th 2022, the code for them is in the mod) + +## Issues + +To remove blackberry from snowy_grassland the default mods snowy grassland biome has been reregistered. So far there is no method(dev term, look up the minetest modding wiki or doc folder in install/build minetest directory(not .minetest)) designed to remove or change a single decoration. + +Fireflies are bugged outside of mtg. Has been tested in Ethereal as well. + + +Support for nssm is included but currently not listed in mod.conf because it greatly slows down mapgen as of march 2026. (Some players may be inclined to get all optional mods for something) diff --git a/mods/ebiomes/animalworld.lua b/mods/ebiomes/animalworld.lua new file mode 100644 index 0000000..3c62594 --- /dev/null +++ b/mods/ebiomes/animalworld.lua @@ -0,0 +1,703 @@ +-- Wilhelmines Animal World Spawns + +mobs:spawn({ + name = "animalworld:ant", + nodes = {"ebiomes:dirt_with_grass_cold"}, + neighbors = {"animalworld:anthill"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + active_object_count = 7, + min_height = 0, + max_height = 50, + day_toggle = true +}) + + core.register_decoration({ + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + y_max = 50, + y_min = 0, + decoration = "animalworld:anthill" + }) + +mobs:spawn({ + name = "animalworld:bat", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool", "ebiomes:peat_with_swamp_moss_yellow", "ebiomes:wet_peat_with_swamp_moss_green", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 5, + min_height = -100, + max_height = 50, + day_toggle = false, +}) + +mobs:spawn({ + name = "animalworld:bear", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_forest_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = -15, + max_height = 120, + +}) + core.register_decoration({ + name = "ebiomes:animalworld_beavernest", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_forest_litter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00018, + biomes = {"cold_deciduous", "swamp"}, + y_max = 1, + y_min = 0, + schematic = core.get_modpath("animalworld") .. "/schematics/animalworld_beavernest.mts", + flags = "place_center_x", + flags = "force_placement", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_forest_litter"}, + num_spawn_by = 8, + }) + +mobs:spawn({ + name = "animalworld:blackbird", + nodes = {"ebiomes:dirt_with_grass_warm"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 100, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:blackgrouse", + nodes = {"ebiomes:dirt_with_grass_cold"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 5, + max_height = 60, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:boar", + nodes = {"ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_forest_litter"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 1, + max_height = 80, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:camel", + nodes = {"ebiomes:dry_dirt_with_grass_arid"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 0, + max_height = 40, +}) + +mobs:spawn({ + name = "animalworld:cockroach", + nodes = {"default:dirt_with_rainforest_litter"}, + min_light = 0, + interval = 30, + chance = 100, -- 15000 + active_object_count = 3, + min_height = 5, + max_height = 31000, + day_toggle = false, +}) + +mobs:spawn({ + name = "animalworld:crocodile", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 0, + max_height = 3, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:elephant", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 65, + day_toggle = true, +}) + + +--[[ + +mobs:spawn({ + name = "animalworld:fox", + nodes = {"default:permafrost", "default:permafrost_with_moss", "default:permafrost_with_stones"}, + neighbors = {"animalworld:animalworld_tundrashrub1", "animalworld:animalworld_tundrashrub2"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 2, + min_height = 1, + max_height = 80, +}) + +--]] + + +mobs:spawn({ + name = "animalworld:frog", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = -10, + max_height = 2, +}) + +mobs:spawn({ + name = "animalworld:giraffe", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 5, + max_height = 100, + day_toggle = true, +}) + +--[[ + +mobs:spawn({ + name = "animalworld:gnu", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 20, + max_height = 50, + day_toggle = true, +}) + +--]] + +--[[ + +mobs:spawn({ + name = "animalworld:goldenmole", + nodes = {"default:desert_sand"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 10, + max_height = 55, + +}) + +--]] + + +mobs:spawn({ + name = "animalworld:goose", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_forest_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 4, + min_height = -1, + max_height = 2, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:hare", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 5, + max_height = 100, + day_toggle = true, +}) + +--[[ + +mobs:spawn({ + name = "animalworld:hermitcrab", + nodes = {"naturalbiomes:palmbeach_sand"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + active_object_count = 4, + min_height = 2, + max_height = 6, +}) + +--]] + + +mobs:spawn({ + name = "animalworld:hyena", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 20, + max_height = 60, +}) + +mobs:spawn({ + name = "animalworld:hippo", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 5, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:yak", + nodes = {"ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 50, + max_height = 200, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:ibex", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dry_dirt_with_grass_arid"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 30, + max_height = 31000, + day_toggle = true, +}) +--[[ +mobs:spawn({ + name = "animalworld:iguana", + nodes = {"default:dirt_with_rainforest_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 1, + max_height = 31000, + day_toggle = true, +}) +--]] +mobs:spawn({ + name = "animalworld:indianrhino", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 5, + max_height = 50, + day_toggle = true, +}) + +--[[ + +mobs:spawn({ + name = "animalworld:kangaroo", + nodes = {"default:desert_sand", "naturalbiomes:outback_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 5, + max_height = 45, + day_toggle = true, +}) + +--]] + +mobs:spawn({ + name = "animalworld:kobra", + nodes = {"ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = -30, + max_height = 10, +}) + +mobs:spawn({ + name = "animalworld:locust", + nodes = {"ebiomes:dry_dirt_with_grass_arid"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 10, + max_height = 75, + day_toggle = true, +}) + +--[[ + +mobs:spawn({ + name = "animalworld:marmot", + nodes = {"naturalbiomes:alpine_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 4, + min_height = 30, + max_height = 31000, + day_toggle = true, +}) + +--]] + +--[[ + +mobs:spawn({ + name = "animalworld:monitor", + nodes = {"default:desert_sand", "default:desert_sandstone", "naturalbiomes:outback_litter"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + min_height = 20, + max_height = 45, + day_toggle = true, +}) + +--]] + + +mobs:spawn({ + name = "animalworld:monkey", + nodes = {"ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 6, + min_height = 30, + max_height = 75, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:moose", + nodes = {"ebiomes:dirt_with_grass_cold"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = 0, + max_height = 120, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:mosquito", + nodes = {"ebiomes:reeds"}, + neighbors = {"air"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 50, + day_toggle = false +}) + +--[[ + +mobs:spawn({ + name = "animalworld:owl", + nodes = {"default:dirt_with_coniferous_litter"}, {"default:pine_needles"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = 10, + max_height = 60, + day_toggle = false, +}) + +--]] + + +mobs:spawn({ + name = "animalworld:scorpion", + nodes = {"ebiomes:dry_dirt_with_grass_arid"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = -20, + max_height = 50, + day_toggle = false, +}) + +mobs:spawn({ + name = "animalworld:snail", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_forest_litter"}, + neighbors = {"farming:cucumber", "farming:cabbage_6", "farming:lettuce_5", "farming:beetroot_5", "flowers:dandelion_yellow"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + active_object_count = 3, + min_height = 6, + max_height = 40, +}) + +mobs:spawn({ + name = "animalworld:snowleopard", + nodes = {"ebiomes:dirt_with_steppe_grass_cold"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = 60, + max_height = 300, + +}) + +--[[ + +mobs:spawn({ + name = "animalworld:spider", + nodes = {"default:stone", "default:desert_stone", "default:sandstone"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = -30, + max_height = 1, +}) + +--]] + +mobs:spawn({ + name = "animalworld:spidermale", + nodes = {"ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = -10, + max_height = 20, + day_toggle = false, +}) + +--[[ + +mobs:spawn({ + name = "animalworld:stingray", + nodes = {"default:water_source", "default:river_water_source"}, + neighbors = {"naturalbiomes:palmbeach_sand"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 8000, -- 15000 + min_height = 0, + max_height = 5, +}) + +--]] + +mobs:spawn({ + name = "animalworld:tapir", + nodes = {"default:dirt_with_rainforest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 1, + max_height = 31000, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:termite", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + neighbors = {"animalworld:termitemould"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + active_object_count = 7, + min_height = 0, + max_height = 50, +}) + + core.register_decoration({ + deco_type = "simple", + place_on = {"ebiomes:dry_dirt_with_huid_savanna_grass"}, + neighbors = {"ebiomes:jaragua_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + y_max = 50, + y_min = 0, + decoration = "animalworld:termitemould" + }) + +mobs:spawn({ + name = "animalworld:tiger", + nodes = {"ebiomes:dirt_with_grass_steppe"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = 10, + max_height = 50, + +}) + +mobs:spawn({ + name = "animalworld:tortoise", + nodes = {"ebiomes:dirt_with_grass_med"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = 5, + max_height = 70, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:viper", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_forest_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 50, + day_toggle = true, +}) + +mobs:spawn({ + name = "animalworld:volverine", + nodes = {"ebiomes:dirt_with_steppe_grass_cold"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + min_height = 20, + max_height = 60, + day_toggle = false, + +}) + +mobs:spawn({ + name = "animalworld:vulture", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_grass_steppe"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 50, + max_height = 300, + day_toggle = true, +}) + +--[[ + +mobs:spawn({ + name = "animalworld:wasp", + nodes = {"animalworld:waspnest"}, + neighbors = {"air"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + active_object_count = 7, + min_height = 0, + max_height = 50, + day_toggle = true +}) + +--]] + +--[[ + core.register_decoration({ + deco_type = "simple", + place_on = {"default:aspen_leaves"}, + neighbors = {"animalworld:waspnest"}, + sidelen = 16, + noise_params = { + offset = 1, + scale = 1, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + y_max = 75, + y_min = 0, + decoration = "animalworld:waspnest" + }) +--]] + + +mobs:spawn({ + name = "animalworld:wolf", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_forest_litter"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 4, + min_height = 30, + max_height = 31000, + day_toggle = false, +}) + +mobs:spawn({ + name = "animalworld:zebra", + nodes = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + min_light = 0, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 6, + max_height = 50, + day_toggle = true, +}) + + diff --git a/mods/ebiomes/arids.lua b/mods/ebiomes/arids.lua new file mode 100644 index 0000000..c6ee54c --- /dev/null +++ b/mods/ebiomes/arids.lua @@ -0,0 +1,617 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +-- Aliases + +core.register_alias("dry_dirt_with_grass", "ebiomes:dry_dirt_with_grass_arid") +core.register_alias("dry_dirt_with_grass_footsteps", "ebiomes:dry_dirt_with_grass_arid_footsteps") +core.register_alias("cool_dry_dirt_with_grass", "ebiomes:dry_dirt_with_grass_arid_cool") +core.register_alias("cool_dry_dirt_with_grass_footsteps", "ebiomes:dry_dirt_with_grass_arid_cool_footsteps") + +core.register_alias("hardy_bush_stem", "ebiomes:hardy_bush_stem") +core.register_alias("hardy_bush_leaves", "ebiomes:hardy_bush_leaves") +core.register_alias("hardy_bush_sapling", "ebiomes:hardy_bush_sapling") +core.register_alias("thorn_bush_leaves", "ebiomes:thorn_bush_leaves") +core.register_alias("thorn_bush_sapling", "ebiomes:thorn_bush_sapling") + + +-- Biome bases + +-- Arid grassland + + core.register_node("ebiomes:dry_dirt_with_grass_arid", { + description = S("Dry Dirt with Arid Grass"), + tiles = {"ebiomes_grass_arid.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^ebiomes_grass_arid_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:dry_dirt_with_grass_arid_footsteps", { + description = S("Dry Dirt with Arid Grass and Footsteps"), + tiles = {"ebiomes_grass_arid.png^default_footprint.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^ebiomes_grass_arid_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_arid_1", { + description = S("Arid Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_arid_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_arid_3.png", + wield_image = "ebiomes_grass_arid_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_arid_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_arid_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_arid_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_arid_" .. i, { + description = S("Arid Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_arid_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_arid_" .. i .. ".png", + wield_image = "ebiomes_grass_arid_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_arid_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_arid_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "grassland_arid", + node_top = "ebiomes:dry_dirt_with_grass_arid", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 60, + humidity_point = 20, + }) + + core.register_biome({ + name = "grassland_arid_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 5, + y_min = -1, + heat_point = 60, + humidity_point = 20, + }) + + core.register_biome({ + name = "grassland_arid_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 60, + humidity_point = 20, + }) + + core.register_biome({ + name = "grassland_arid_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 60, + humidity_point = 20, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_arid_"..length, + deco_type = "simple", + place_on = {"ebiomes:dry_dirt_with_grass_arid"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_arid_"..length, + }) +end + +-- Arid grassland Cool + + core.register_node("ebiomes:dry_dirt_with_grass_arid_cool", { + description = S("Dry Dirt with Cool Arid Grass"), + tiles = {"ebiomes_grass_arid_cool.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^ebiomes_grass_arid_cool_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:dry_dirt_with_grass_arid_cool_footsteps", { + description = S("Dry Dirt with Cool Arid Grass and Footsteps"), + tiles = {"ebiomes_grass_arid_cool.png^default_footprint.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^ebiomes_grass_arid_cool_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_arid_cool_1", { + description = S("Cool Arid Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_arid_cool_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_arid_cool_3.png", + wield_image = "ebiomes_grass_arid_cool_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_arid_cool_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_arid_cool_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_arid_cool_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_arid_cool_" .. i, { + description = S("Cool Arid Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_arid_cool_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_arid_cool_" .. i .. ".png", + wield_image = "ebiomes_grass_arid_cool_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_arid_cool_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_arid_cool_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "grassland_arid_cool", + node_top = "ebiomes:dry_dirt_with_grass_arid_cool", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 40, + humidity_point = 20, + }) + + core.register_biome({ + name = "grassland_arid_cool_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 5, + y_min = -1, + heat_point = 40, + humidity_point = 20, + }) + + core.register_biome({ + name = "grassland_arid_cool_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 40, + humidity_point = 20, + }) + + core.register_biome({ + name = "grassland_arid_cool_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 40, + humidity_point = 20, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_arid_cool_"..length, + deco_type = "simple", + place_on = {"ebiomes:dry_dirt_with_grass_arid_cool"}, + sidelen = 16, + noise_params = { + offset = 0.07, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_arid_cool_"..length, + }) +end + +--Folliage + +--Biome specific + +--Hardy bush + +local function grow_new_hardy_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y-1, z = pos.z-1}, modpath.."/schematics/ebiomes_hardy_bush.mts", "0", nil, false) +end + + core.register_node("ebiomes:hardy_bush_stem", { + description = S("Hardy Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"ebiomes_hardy_bush_stem.png"}, + inventory_image = "ebiomes_hardy_bush_stem.png", + wield_image = "ebiomes_hardy_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 1}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, + }) + + core.register_node("ebiomes:hardy_bush_leaves", { + description = S("Hardy Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_hardy_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 1, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:hardy_bush_sapling"}, rarity = 5}, + {items = {"ebiomes:hardy_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:hardy_bush_sapling", { + description = S("Hardy Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_hardy_bush_sapling.png"}, + inventory_image = "ebiomes_hardy_bush_sapling.png", + wield_image = "ebiomes_hardy_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:hardy_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + + default.register_leafdecay({ + trunks = {"ebiomes:hardy_bush_stem"}, + leaves = {"ebiomes:hardy_bush_leaves"}, + radius = 1, + }) + + core.register_decoration({ + name = "ebiomes:hardy_bush", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland_arid", "grassland_arid_cool"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hardy_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {"ebiomes:hardy_bush_sapling", grow_new_hardy_bush, "soil"}, + }) +end + + core.register_craft({ + output = "default:wood", + recipe = { + {"ebiomes:hardy_bush_stem"}, + } + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:hardy_bush_stem", + burntime = 8, + }) + + +--Thorn bush + +local function grow_new_thorn_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_thorn_bush.mts", "0", nil, false) +end + + core.register_node("ebiomes:thorn_bush_leaves", { + description = S("Thorn Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_thorn_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 1, flammable = 1, leaves = 1}, + walkable = false, + damage_per_second = 2, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:thorn_bush_sapling"}, rarity = 5}, + {items = {"ebiomes:thorn_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:thorn_bush_sapling", { + description = S("Thorn Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_thorn_bush_sapling.png"}, + inventory_image = "ebiomes_thorn_bush_sapling.png", + wield_image = "ebiomes_thorn_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_thorn_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:thorn_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:thorn_bush", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 969, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland_arid", "grassland_arid_cool"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_thorn_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:thorn_bush_sapling", grow_new_thorn_bush, "soil"}, +}) +end + +--Bonemeal +if core.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"ebiomes:dry_dirt_with_grass_arid", {"ebiomes:grass_arid_1", "ebiomes:grass_arid_2", "ebiomes:grass_arid_3", "ebiomes:grass_arid_4", "ebiomes:grass_arid_5"}, + {"default:dry_shrub"} } + }) + + bonemeal:add_deco({ + {"ebiomes:dry_dirt_with_grass_arid_cool", {"ebiomes:grass_arid_cool_1", "ebiomes:grass_arid_cool_2", "ebiomes:grass_arid_cool_3", "ebiomes:grass_arid_cool_4", "ebiomes:grass_arid_cool_5"}, + {"default:dry_shrub"} } + }) +end + + +-- Peripheral mod support + +-- Support for flowerpot +if core.global_exists("flowerpot") then + flowerpot.register_node("ebiomes:hardy_bush_sapling") + flowerpot.register_node("ebiomes:thorn_bush_sapling") +end diff --git a/mods/ebiomes/bamboo.lua b/mods/ebiomes/bamboo.lua new file mode 100644 index 0000000..3801f93 --- /dev/null +++ b/mods/ebiomes/bamboo.lua @@ -0,0 +1,282 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Aliases + +core.register_alias("bamboo", "ebiomes:bamboo") +core.register_alias("bamboo_leaves", "ebiomes:bamboo_leaves") +core.register_alias("bamboo_sprout", "ebiomes:bamboo_sprout") + + +--Bamboo + + core.register_node("ebiomes:bamboo", { + description = S("Bamboo"), + drawtype = "plantlike", + tiles = {"ebiomes_bamboo.png"}, + inventory_image = "ebiomes_bamboo.png", + wield_image = "ebiomes_bamboo.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16}, + }, + groups = {choppy = 3, snappy = 2, flammable = 2, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_wood_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, + }) + + core.register_craft({ + output = "default:stick 8", + recipe = { + {"ebiomes:bamboo"}, + } + }) + + core.register_node("ebiomes:bamboo_leaves", { + description = S("Bamboo Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_bamboo_leaves.png"}, + waving = 1, + walkable = false, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:bamboo_sprout"}, rarity = 20}, + {items = {"ebiomes:bamboo_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:bamboo"}, + leaves = {"ebiomes:bamboo_leaves"}, + radius = 3, + }) + +local function grow_new_bamboo(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_bamboo.mts", "0", nil, false) +end + + core.register_node("ebiomes:bamboo_sprout", { + description = S("Bamboo Sprout"), + drawtype = "plantlike", + tiles = {"ebiomes_bamboo_sprout.png"}, + inventory_image = "ebiomes_bamboo_sprout.png", + wield_image = "ebiomes_bamboo_sprout.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_bamboo, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:bamboo_sprout", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -1, y = 1, z = -1}, + {x = 1, y = 6, z = 1}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("reg_jprainforest", true) then + + core.register_decoration({ + name = "ebiomes:bamboo_l1", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter", "default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.0001, + scale = 0.0001, + spread = {x = 250, y = 250, z = 250}, + seed = 221, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest", "rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bamboo.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + + core.register_decoration({ + name = "ebiomes:bamboo_l2", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter", "default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 222, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest", "rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bamboo.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "ebiomes:bamboo", + num_spawn_by = 1 + }) + + core.register_decoration({ + name = "ebiomes:bamboo_l3", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter", "default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 223, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest", "rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bamboo.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "ebiomes:bamboo", + num_spawn_by = 1 + }) + +else + + core.register_decoration({ + name = "ebiomes:bamboo_l1", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.0001, + scale = 0.0001, + spread = {x = 250, y = 250, z = 250}, + seed = 221, + octaves = 3, + persist = 0.66 + }, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bamboo.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + + core.register_decoration({ + name = "ebiomes:bamboo_l2", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 222, + octaves = 3, + persist = 0.66 + }, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bamboo.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "ebiomes:bamboo", + num_spawn_by = 1 + }) + + core.register_decoration({ + name = "ebiomes:bamboo_l3", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 223, + octaves = 3, + persist = 0.66 + }, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bamboo.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + spawn_by = "ebiomes:bamboo", + num_spawn_by = 1 + }) + +end + + +if core.global_exists("dungeon_loot") then + dungeon_loot.register ({ + {name = "ebiomes:bamboo", chance = 0.3, count = {5, 13}}, + }) +end + +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {"ebiomes:bamboo_sprout", grow_new_bamboo, "soil"}, + }) +end + +if core.global_exists("flowerpot") then + flowerpot.register_node("ebiomes:bamboo_sprout") +end + + + diff --git a/mods/ebiomes/buffers.lua b/mods/ebiomes/buffers.lua new file mode 100644 index 0000000..07e2085 --- /dev/null +++ b/mods/ebiomes/buffers.lua @@ -0,0 +1,102 @@ + + +-- Sandstone desert Buffer + + core.register_biome({ + name = "sandstone_desert_buffer", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone_block", + y_max = 31000, + y_min = 4, + heat_point = 60, + humidity_point = 15, + }) + + core.register_biome({ + name = "sandstone_desert_ocean_buffer", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:sandstone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone_block", + y_max = 3, + y_min = -255, + heat_point = 60, + humidity_point = 15, + }) + + core.register_biome({ + name = "sandstone_desert_under_buffer", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 60, + humidity_point = 15, + }) + + + +-- Cold desert Buffer + + core.register_biome({ + name = "cold_desert_buffer", + node_top = "default:silver_sand", + depth_top = 1, + node_filler = "default:silver_sand", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 40, + humidity_point = 15, + }) + + core.register_biome({ + name = "cold_desert_ocean_buffer", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 40, + humidity_point = 15, + }) + + core.register_biome({ + name = "cold_desert_under_buffer", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 40, + humidity_point = 15, + }) diff --git a/mods/ebiomes/bugs.lua b/mods/ebiomes/bugs.lua new file mode 100644 index 0000000..27f56f8 --- /dev/null +++ b/mods/ebiomes/bugs.lua @@ -0,0 +1,98 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + + +--Fireflies +if core.get_modpath("fireflies") then + + core.register_decoration({ + name = "ebiomes:firefly_low", + deco_type = "simple", + place_on = { + "default:dirt", + "ebiomes:dirt_with_grass_cold", + "ebiomes:dirt_with_grass_swamp", + "ebiomes:dirt_with_grass_warm", + "ebiomes:peat_with_swamp_moss_yellow", + "ebiomes:peat_wet_with_swamp_moss_green", + "ebiomes:dirt_with_japanese_rainforest_litter", + "ebiomes:dirt_with_forest_litter", + "default:dirt_with_grass" + }, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.0005, + biomes = { + "deciduous_forest_cold", + "swamp", + "deciduous_forest_warm", + "bog", + "japanese_rainforest", + "temperate_rainforest", + "deciduous_forest_woody", + "deciduous_forest_fruity" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:hidden_firefly", + }) + + core.register_decoration({ + name = "ebiomes:firefly_high", + deco_type = "simple", + place_on = { + "default:dirt", + "ebiomes:dirt_with_grass_cold", + "ebiomes:dirt_with_grass_swamp", + "ebiomes:dirt_with_grass_warm", + "ebiomes:peat_with_swamp_moss_yellow", + "ebiomes:peat_wet_with_swamp_moss_green", + "ebiomes:dirt_with_japanese_rainforest_litter", + "ebiomes:dirt_with_forest_litter", + "default:dirt_with_grass" + }, + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.0005, + biomes = { + "deciduous_forest_cold", + "swamp", + "deciduous_forest_warm", + "bog", + "japanese_rainforest", + "temperate_rainforest", + "deciduous_forest_woody", + "deciduous_forest_fruity" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:hidden_firefly", + }) + +end + + +core.register_decoration({ + name = "ebiomes:butterfly", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_swamp", "ebiomes:peat_with_swamp_moss_yellow", "ebiomes:peat_wet_with_swamp_moss_green", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dry_dirt_with_humid_savanna_grass", "default:dirt_with_grass"}, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"mediterranean", "warm_steppe", "steppe", "cold_steppe", "deciduous_forest_warm", "grassland_warm", "swamp", "bog", "japanese_rainforest", "humid_savanna", "deciduous_forest_woody", "grassland_coldish", "deciduous_forest_fruity"}, + y_max = 31000, + y_min = 1, + decoration = { + "butterflies:butterfly_white", + "butterflies:butterfly_red", + "butterflies:butterfly_violet", + }, + spawn_by = "group:flower", + num_spawn_by = 1 + }) + + diff --git a/mods/ebiomes/coldnswamps.lua b/mods/ebiomes/coldnswamps.lua new file mode 100644 index 0000000..720dd75 --- /dev/null +++ b/mods/ebiomes/coldnswamps.lua @@ -0,0 +1,2864 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Aliases + +core.register_alias("dirt_cold_grass", "ebiomes:dirt_with_grass_cold") +core.register_alias("dirt_with_cold_grass_footsteps", "ebiomes:dirt_with_grass_cold_footsteps") +core.register_alias("dirt_with_swamp_grass", "ebiomes:dirt_with_grass_swamp") +core.register_alias("dirt_with_swamp_grass_footsteps", "ebiomes:dirt_with_grass_swamp_footsteps") +core.register_alias("swamp_water", "ebiomes:swamp_water_source") +core.register_alias("wet_peat_with_green_swamp_moss", "ebiomes:peat_wet_with_swamp_moss_green") +core.register_alias("wet_peat_with_green_swamp_moss_footsteps", "ebiomes:peat_wet_with_swamp_moss_green_footsteps") +core.register_alias("peat_with_yellow_swamp_moss", "ebiomes:peat_with_swamp_moss_yellow") +core.register_alias("peat_with_yellow_swamp_moss_footsteps", "ebiomes:peat_with_swamp_moss_yellow_footsteps") + +core.register_alias("reeds", "ebiomes:reeds") +core.register_alias("green_marsh_grass", "ebiomes:marsh_grass_green") +core.register_alias("yellow_marsh_grass", "ebiomes:marsh_grass_yellow") + +core.register_alias("blackcurrant_bush_leaves", "ebiomes:blackcurrant_bush_leaves") +core.register_alias("blackcurrant_bush_leaves", "ebiomes:blackcurrant_bush_leaves_with_berries") +core.register_alias("blackcurrant_bush_sapling", "ebiomes:blackcurrant_bush_sapling") +core.register_alias("blackcurrants", "ebiomes:blackcurrants") +core.register_alias("redcurrant_bush_leaves", "ebiomes:redcurrant_bush_leaves") +core.register_alias("redcurrant_bush_leaves", "ebiomes:redcurrant_bush_leaves_with_berries") +core.register_alias("redcurrant_bush_sapling", "ebiomes:redcurrant_bush_sapling") +core.register_alias("redcurrants", "ebiomes:redcurrants") +core.register_alias("gooseberry_bush_leaves", "ebiomes:gooseberry_bush_leaves") +core.register_alias("gooseberry_bush_leaves", "ebiomes:gooseberry_bush_leaves_with_berries") +core.register_alias("gooseberry_bush_sapling", "ebiomes:gooseberry_bush_sapling") +core.register_alias("gooseberries", "ebiomes:gooseberries") + +core.register_alias("cranberry_patch", "ebiomes:cranberry_patch") +core.register_alias("cranberries", "ebiomes:cranberries") +core.register_alias("sundew", "ebiomes:sundew") +core.register_alias("marigold", "ebiomes:marigold") +core.register_alias("marsh_stitchwort", "ebiomes:marsh_stitchwort") + +core.register_alias("alder_tree", "ebiomes:alder_tree") +core.register_alias("alder_wood", "ebiomes:alder_wood") +core.register_alias("alder_leaves", "ebiomes:alder_leaves") +core.register_alias("alder_sapling", "ebiomes:alder_sapling") +core.register_alias("ash_tree", "ebiomes:ash_tree") +core.register_alias("ash_wood", "ebiomes:ash_wood") +core.register_alias("ash_leaves", "ebiomes:ash_leaves") +core.register_alias("ash_sapling", "ebiomes:ash_sapling") +core.register_alias("birch_tree", "ebiomes:birch_tree") +core.register_alias("birch_wood", "ebiomes:birch_wood") +core.register_alias("birch_leaves", "ebiomes:birch_leaves") +core.register_alias("birch_sapling", "ebiomes:birch_sapling") +core.register_alias("willow_tree", "ebiomes:willow_tree") +core.register_alias("willow_wood", "ebiomes:willow_wood") +core.register_alias("willow_leaves", "ebiomes:willow_leaves") +core.register_alias("willow_sapling", "ebiomes:willow_sapling") + +core.register_alias("downy_birch_tree", "ebiomes:downy_birch_tree") +core.register_alias("downy_birch_wood", "ebiomes:downy_birch_wood") +core.register_alias("downy_birch_leaves", "ebiomes:downy_birch_leaves") +core.register_alias("downy_birch_sapling", "ebiomes:downy_birch_sapling") + +--Cold deciduous + + core.register_node("ebiomes:dirt_with_grass_cold", { + description = S("Dirt with Cold Grass"), + tiles = {"ebiomes_grass_cold.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_cold_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_grass_cold", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_grass_cold_footsteps", { + description = S("Dirt with Cold Grass and Footsteps"), + tiles = {"ebiomes_grass_cold.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_cold_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_cold_1", { + description = S("Cold Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_cold_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_cold_3.png", + wield_image = "ebiomes_grass_cold_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_cold_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_cold_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_cold_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_cold_" .. i, { + description = S("Cold Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_cold_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_cold_" .. i .. ".png", + wield_image = "ebiomes_grass_cold_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_cold_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_cold_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "deciduous_forest_cold", + node_top = "ebiomes:dirt_with_grass_cold", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 53, + humidity_point = 75, + }) + + core.register_biome({ + name = "deciduous_forest_cold_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -1, + heat_point = 53, + humidity_point = 75, + }) + + core.register_biome({ + name = "deciduous_forest_cold_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 53, + humidity_point = 75, + }) + + core.register_biome({ + name = "deciduous_forest_cold_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 53, + humidity_point = 75, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_cold_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_cold_"..length, + }) +end + +--Swamp + + core.register_node("ebiomes:dirt_with_grass_swamp", { + description = S("Dirt with Swamp Grass"), + tiles = {"ebiomes_grass_swamp.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_swamp_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:dirt_with_grass_swamp_footsteps", { + description = S("Dirt with Swamp Grass and Footsteps"), + tiles = {"ebiomes_grass_swamp.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_swamp_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_swamp_1", { + description = S("Swamp Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_swamp_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_swamp_3.png", + wield_image = "ebiomes_grass_swamp_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_swamp_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_swamp_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_swamp_" .. i, { + description = S("Swamp Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_swamp_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_swamp_" .. i .. ".png", + wield_image = "ebiomes_grass_swamp_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_swamp_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "swamp", + node_top = "ebiomes:dirt_with_grass_swamp", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 8, + y_min = 1, + heat_point = 53, + humidity_point = 85, + }) + + core.register_biome({ + name = "swamp_shore", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 53, + humidity_point = 85, + }) + + core.register_biome({ + name = "swamp_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 53, + humidity_point = 85, + }) + + core.register_biome({ + name = "swamp_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 53, + humidity_point = 85, + }) + + + core.register_node("ebiomes:swamp_water_source", { + description = S("Swamp Water Source"), + drawtype = "liquid", + tiles = { + { + name = "ebiomes_swamp_water_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "ebiomes_swamp_water_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "ebiomes:swamp_water_flowing", + liquid_alternative_source = "ebiomes:swamp_water_source", + liquid_viscosity = 1, + -- Not renewable to avoid horizontal spread of water sources in sloping + -- rivers that can cause water to overflow riverbanks and cause floods. + -- River water source is instead made renewable by the 'force renew' + -- option used in the 'bucket' mod by the river water bucket. + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 128, r = 24, g = 20, b = 16}, + groups = {water = 3, liquid = 3, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), + }) + + core.register_node("ebiomes:swamp_water_flowing", { + description = S("Swamp Water"), + drawtype = "flowingliquid", + tiles = {"ebiomes_swamp_water.png"}, + special_tiles = { + { + name = "ebiomes_swamp_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "ebiomes_swamp_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "ebiomes:swamp_water_flowing", + liquid_alternative_source = "ebiomes:swamp_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 128, r = 24, g = 20, b = 16}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, + sounds = default.node_sound_water_defaults(), + }) + + + bucket.register_liquid( + "ebiomes:swamp_water_source", + "ebiomes:swamp_water_flowing", + "ebiomes:bucket_swamp_water", + "ebiomes_bucket_swamp_water.png", + S("Swamp Water Bucket"), + {tool = 1, water_bucket = 1}, + true + ) + + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_swamp_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_swamp"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_swamp_"..length, + }) +end + + +--Bog + + +--Peats + + core.register_node("ebiomes:peat", { + description = S("Peat"), + tiles = {"ebiomes_peat.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), + }) + + core.register_node("ebiomes:peat_with_swamp_moss_yellow", { + description = S("Peat with Yellow Swamp Moss"), + tiles = {"ebiomes_swamp_moss_yellow.png", "ebiomes_peat.png", + {name = "ebiomes_peat.png^ebiomes_swamp_moss_yellow_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "ebiomes:peat", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:peat_with_swamp_moss_yellow_footsteps", { + description = S("Peat with Yellow Swamp Moss and Footsteps"), + tiles = {"ebiomes_swamp_moss_yellow.png^default_footprint.png", "ebiomes_peat.png", + {name = "ebiomes_peat.png^ebiomes_swamp_moss_yellow_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "ebiomes:peat", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:peat_dry", { + description = S("Dry Peat"), + tiles = {"ebiomes_peat_dry.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), + }) + + core.register_node("ebiomes:peat_wet", { + description = S("Wet Peat"), + tiles = {"ebiomes_peat_wet.png"}, + drop = "ebiomes:peat_wet", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "ebiomes:peat_wet", + liquid_alternative_source = "ebiomes:peat_wet", + liquid_renewable = false, + liquid_range = 0, + drowning = 1, + walkable = false, + climbable = false, + groups = {crumbly = 3, soil = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_dirt_defaults(), + }) + + + +--peat +--Wet peat made from a code saple of ethereal quicksand + + core.register_node("ebiomes:peat_wet_with_swamp_moss_green", { + description = S("Wet Peat with Green Swamp Moss"), + tiles = {"ebiomes_swamp_moss_green.png", "ebiomes_peat_wet.png", + {name = "ebiomes_peat_wet.png^ebiomes_swamp_moss_green_side.png", + tileable_vertical = false}}, + drop = "ebiomes:peat_wet", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "ebiomes:peat_wet_with_swamp_moss_green", + liquid_alternative_source = "ebiomes:peat_wet_with_swamp_moss_green", + liquid_renewable = false, + liquid_range = 0, + drowning = 1, + walkable = false, + climbable = false, + groups = {crumbly = 3, soil = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:peat_wet_with_swamp_moss_green_footsteps", { + description = S("Wet Peat with Green Swamp Moss and Footsteps"), + tiles = {"ebiomes_swamp_moss_green.png^default_footprint.png", "ebiomes_peat_wet.png", + {name = "ebiomes_peat_wet.png^ebiomes_swamp_moss_green_side.png", + tileable_vertical = false}}, + drop = "ebiomes:peat_wet", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "ebiomes:peat_wet_with_swamp_moss_green_footsteps", + liquid_alternative_source = "ebiomes:peat_wet_with_swamp_moss_green_footsteps", + liquid_renewable = false, + liquid_range = 0, + drowning = 1, + walkable = false, + climbable = false, + groups = {crumbly = 3, soil = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + +--crafts + + core.register_craft({ + output = "ebiomes:peat", + recipe = { + {"ebiomes:peat_wet"}, + } + }) + + core.register_craft({ + type = "shapeless", + output = "ebiomes:peat_wet", + recipe = {"ebiomes:peat", "group:water_bucket"}, + replacements = {{"group:water_bucket", "bucket:bucket_empty"}} + }) + + core.register_craft({ + type = "cooking", + output = "ebiomes:peat_dry", + recipe = "ebiomes:peat", + burntime = 4 + }) + + core.register_craft({ + type = "shapeless", + output = "ebiomes:peat", + recipe = {"ebiomes:peat_dry", "group:water_bucket"}, + replacements = {{"group:water_bucket", "bucket:bucket_empty"}} + }) + + + stairs.register_stair_and_slab("peat_dry", "ebiomes:peat_dry", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_peat_dry.png"}, + S("Dry Peat Stair"), + S("Dry Peat Slab"), + default.node_sound_dirt_defaults(), + true, + S("Inner Dry Peat Stair"), + S("Outer Dry Peat Stair") + ) + + + core.register_craftitem("ebiomes:burning_peat", { + description = S("Burning Peat"), + inventory_image = "ebiomes_burning_peat.png" + }) + + core.register_craft({ + type = "shapeless", + output = "ebiomes:burning_peat 2", + recipe = {"ebiomes:peat_dry", "group:wood"}, + replacements = {{"group:water_bucket", "bucket:bucket_empty"}} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:burning_peat", + burntime = 30, + }) + + + +if core.get_modpath("bonemeal") ~= nil then + core.register_craft({ +-- type = "shapeless", + output = "bonemeal:mulch 9", + recipe = { + {"ebiomes:peat"}, + } + }) +end + + + core.register_biome({ + name = "bog", + node_water = "ebiomes:swamp_water_source", + node_top = "ebiomes:peat_with_swamp_moss_yellow", + depth_top = 1, + node_filler = "ebiomes:peat_wet", + depth_filler = 2, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 6, + y_min = 3, + heat_point = 53, + humidity_point = 100, + }) + + core.register_decoration({ + name = "ebiomes:peat_l1", + deco_type = "simple", + place_on = {"ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.5, + scale = 0.4, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, + biomes = {"bog"}, + height = 1, + y_min = 1, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:peat_wet_with_swamp_moss_green", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + +if core.settings:get_bool("pl_quagmires", true) then + + core.register_decoration({ + name = "ebiomes:quagmire_small", + deco_type = "schematic", + place_on = {"ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.0003, + spread = {x = 250, y = 250, z = 250}, + seed = 78, + octaves = 3, + persist = 0.66 + }, + biomes = {"bog"}, + height = 1, + y_min = 1, + y_max = 31000, + place_offset_y = -3, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_quagmire_small_np.mts", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:quagmire_vsmall", + deco_type = "schematic", + place_on = {"ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.0009, + spread = {x = 250, y = 250, z = 250}, + seed = 76, + octaves = 3, + persist = 0.66 + }, + biomes = {"bog"}, + height = 1, + y_min = 1, + y_max = 31000, + place_offset_y = -3, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_quagmire_vsmall_np.mts", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + +else + + core.register_decoration({ + name = "ebiomes:quagmire_small", + deco_type = "schematic", + place_on = {"ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.0003, + spread = {x = 250, y = 250, z = 250}, + seed = 78, + octaves = 3, + persist = 0.66 + }, + biomes = {"bog"}, + height = 1, + y_min = 1, + y_max = 31000, + place_offset_y = -3, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_quagmire_small.mts", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:quagmire_vsmall", + deco_type = "schematic", + place_on = {"ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.0009, + spread = {x = 250, y = 250, z = 250}, + seed = 76, + octaves = 3, + persist = 0.66 + }, + biomes = {"bog"}, + height = 1, + y_min = 1, + y_max = 31000, + place_offset_y = -3, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_quagmire_vsmall.mts", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + +end + + + core.register_node("ebiomes:reeds", { + description = S("Reeds"), + drawtype = "plantlike", +-- drawtype = "firelike", + tiles = {"ebiomes_reeds.png"}, + inventory_image = "ebiomes_reeds.png", + wield_image = "ebiomes_reeds.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16}, + }, + groups = {snappy = 3, flammable = 2, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + }) + + core.register_decoration({ + name = "ebiomes:reeds", + deco_type = "simple", + place_on = {"ebiomes:peat_wet_with_swamp_moss_green", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 357, + octaves = 3, + persist = 0.7 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:reeds", + }) + + core.register_node("ebiomes:marsh_grass_green", { + description = S("Green Marsh Grass"), + tiles = {"ebiomes_marsh_grass_green.png"}, + inventory_image = "ebiomes_marsh_grass_green.png", + wield_image = "ebiomes_marsh_grass_green.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + } + }) + + core.register_decoration({ + name = "ebiomes:marsh_grass_green", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_swamp", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 360, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:marsh_grass_green", + }) + + core.register_node("ebiomes:marsh_grass_yellow", { + description = S("Yellow Marsh Grass"), + tiles = {"ebiomes_marsh_grass_yellow.png"}, + inventory_image = "ebiomes_marsh_grass_yellow.png", + wield_image = "ebiomes_marsh_grass_yellow.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + } + }) + + core.register_decoration({ + name = "ebiomes:marsh_grass_yellow", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_swamp", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 361, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:marsh_grass_yellow", + }) + + + core.register_node("ebiomes:grass_bog_1", { + description = S("Bog Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_bog_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_bog_3.png", + wield_image = "ebiomes_grass_bog_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_bog_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_bog_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_bog_" .. i, { + description = S("Bog Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_bog_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_bog_" .. i .. ".png", + wield_image = "ebiomes_grass_bog_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_bog_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_bog_"..length, + deco_type = "simple", + place_on = {"ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_bog_"..length, + }) +end + +--Folliage + +--Biome specific + +--Cold deciduous + +local function grow_new_blackcurrant(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_blackcurrant_bush.mts", "0", nil, false) +end + + core.register_craftitem("ebiomes:blackcurrants", { + description = S("Blackcurants"), + inventory_image = "ebiomes_blackcurrants.png", + groups = {food_blackcurrants = 1, food_berry = 1, eatable = 2}, + on_use = core.item_eat(2), + }) + + + core.register_node("ebiomes:blackcurrant_bush_leaves_with_berries", { + description = S("Blackcurrant Bush Leaves with Berries"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_blackcurrant_bush_leaves.png^ebiomes_blackcurrant_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + walkable = false, + drop = "ebiomes:blackcurrants", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "ebiomes:blackcurrant_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, {name = "ebiomes:blackcurrant_bush_leaves"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + }) + + + core.register_node("ebiomes:blackcurrant_bush_leaves", { + description = S("Blackcurrant Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_blackcurrant_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + walkable = false, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:blackcurrant_bush_sapling"}, rarity = 5}, + {items = {"ebiomes:blackcurrant_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:blackcurrant_bush_leaves_with_berries"}) + end + end, + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:blackcurrant_bush_sapling", { + description = S("Blackcurrant Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_blackcurrant_bush_sapling.png"}, + inventory_image = "ebiomes_blackcurrant_bush_sapling.png", + wield_image = "ebiomes_blackcurrant_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_blackcurrant, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:blackcurrant_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:blackcurrant_bush", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 787, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_blackcurrant_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:blackcurrant_bush_sapling", grow_new_blackcurrant, "soil"}, +}) +end + + + +local function grow_new_redcurrant(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_redcurrant_bush.mts", "0", nil, false) +end + + core.register_craftitem("ebiomes:redcurrants", { + description = S("Redcurants"), + inventory_image = "ebiomes_redcurrants.png", + groups = {food_redcurrants = 1, food_berry = 1, eatable = 2}, + on_use = core.item_eat(2), + }) + + + core.register_node("ebiomes:redcurrant_bush_leaves_with_berries", { + description = S("Redcurrant Bush Leaves with Berries"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_redcurrant_bush_leaves.png^ebiomes_redcurrant_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + walkable = false, + drop = "ebiomes:redcurrants", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "ebiomes:redcurrant_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, {name = "ebiomes:redcurrant_bush_leaves"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + }) + + + core.register_node("ebiomes:redcurrant_bush_leaves", { + description = S("Redcurrant Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_redcurrant_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + walkable = false, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:redcurrant_bush_sapling"}, rarity = 5}, + {items = {"ebiomes:redcurrant_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:redcurrant_bush_leaves_with_berries"}) + end + end, + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:redcurrant_bush_sapling", { + description = S("Redcurrant Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_redcurrant_bush_sapling.png"}, + inventory_image = "ebiomes_redcurrant_bush_sapling.png", + wield_image = "ebiomes_redcurrant_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_redcurrant, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:redcurrant_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:redcurrant_bush", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 878, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_redcurrant_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:redcurrant_bush_sapling", grow_new_redcurrant, "soil"}, +}) +end + + + +local function grow_new_gooseberry(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_gooseberry_bush.mts", "0", nil, false) +end + + core.register_craftitem("ebiomes:gooseberries", { + description = S("Gooseberries"), + inventory_image = "ebiomes_gooseberries.png", + groups = {food_gooseberries = 1, food_berry = 1, eatable = 2}, + on_use = core.item_eat(2), + }) + + + core.register_node("ebiomes:gooseberry_bush_leaves_with_berries", { + description = S("Gooseberry Bush Leaves with Berries"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_gooseberry_bush_leaves.png^ebiomes_gooseberry_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + walkable = false, + damage_per_second = 1, + drop = "ebiomes:gooseberries", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "ebiomes:gooseberry_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, {name = "ebiomes:gooseberry_bush_leaves"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + }) + + + core.register_node("ebiomes:gooseberry_bush_leaves", { + description = S("Gooseberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_gooseberry_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + walkable = false, + damage_per_second = 1, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:gooseberry_bush_sapling"}, rarity = 5}, + {items = {"ebiomes:gooseberry_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:gooseberry_bush_leaves_with_berries"}) + end + end, + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:gooseberry_bush_sapling", { + description = S("Gooseberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_gooseberry_bush_sapling.png"}, + inventory_image = "ebiomes_gooseberry_bush_sapling.png", + wield_image = "ebiomes_gooseberry_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_gooseberry, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:gooseberry_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:gooseberry_bush", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 969, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_gooseberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:gooseberry_bush_sapling", grow_new_gooseberry, "soil"}, +}) +end + + + +--Bog + + core.register_node("ebiomes:cranberry_patch", { + description = S("Cranberry Patch"), + tiles = {"ebiomes_cranberry_patch.png"}, + inventory_image = "ebiomes_cranberry_patch.png", + wield_image = "ebiomes_cranberry_patch.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + drop = { + max_items = 2, + items = { + {items = {"ebiomes:cranberries"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:cranberry_patch", param2 = 1}) + end, + selection_box = { + type = "fixed", + fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, -3 / 16, 5 / 16}, + } + }) + + core.register_craftitem("ebiomes:cranberries", { + description = S("Cranberries"), + inventory_image = "ebiomes_cranberries.png", + groups = {food_cranberries = 1, food_berry = 1, eatable = 2}, + on_use = core.item_eat(2), + }) + + + core.register_decoration({ + name = "ebiomes:cranberry", + deco_type = "simple", + place_on = {"ebiomes:peat_wet_with_swamp_moss_green", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.03, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 131, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:cranberry_patch", + }) + + + core.register_node("ebiomes:sundew", { + description = S("Sundew"), + tiles = {"ebiomes_sundew.png"}, + inventory_image = "ebiomes_sundew.png", + wield_image = "ebiomes_sundew.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -6 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:red", + recipe = { + {"ebiomes:sundew"} + }, + }) + + core.register_decoration({ + name = "ebiomes:sundew", + deco_type = "simple", + place_on = {"ebiomes:peat_wet_with_swamp_moss_green", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 513, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:sundew", + }) + + core.register_node("ebiomes:marigold", { + description = S("Marsh Marigold"), + tiles = {"ebiomes_marigold.png"}, + inventory_image = "ebiomes_marigold.png", + wield_image = "ebiomes_marigold.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -6 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:yellow 4", + recipe = { + {"ebiomes:marigold"} + }, + }) + + core.register_decoration({ + name = "ebiomes:marigold", + deco_type = "simple", + place_on = {"ebiomes:peat_wet_with_swamp_moss_green", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 514, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:marigold", + }) + + core.register_node("ebiomes:marsh_stitchwort", { + description = S("Marsh Stitchwort"), + tiles = {"ebiomes_marsh_stitchwort.png"}, + inventory_image = "ebiomes_marsh_stitchwort.png", + wield_image = "ebiomes_marsh_stitchwort.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, + } + }) + + core.register_craft({ + output = "dye:white 4", + recipe = { + {"ebiomes:marsh_stitchwort"} + }, + }) + + core.register_decoration({ + name = "ebiomes:marsh_stitchwort", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_swamp", "ebiomes:peat_wet_with_swamp_moss_green", "ebiomes:peat_with_swamp_moss_yellow"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 515, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:marsh_stitchwort", + }) + +--Woods + +--Willow + + core.register_node("ebiomes:willow_tree", { + description = S("Willow Tree"), + tiles = {"ebiomes_willow_tree_top.png", "ebiomes_willow_tree_top.png", + "ebiomes_willow_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:willow_wood", { + description = S("Willow Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_willow_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:willow_wood 4", + recipe = { + {"ebiomes:willow_tree"}, + } + }) + + core.register_node("ebiomes:willow_leaves", { + description = S("Willow Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_willow_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + walkable = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:willow_sapling"}, rarity = 20}, + {items = {"ebiomes:willow_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:willow_tree"}, + leaves = {"ebiomes:willow_leaves"}, + radius = 3, + }) + +--left this credit but erased it's identicals further down the line +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_willow_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_willow_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_willow.mts" + + core.register_node("ebiomes:willow_sapling", { + description = S("Willow Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_willow_sapling.png"}, + inventory_image = "ebiomes_willow_sapling.png", + wield_image = "ebiomes_willow_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_willow_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:willow_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 11, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:willow_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 100, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_willow_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:willow_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_willow_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:willow_sapling", grow_new_willow_tree, "soil"}, +}) +end + + --forms sampled from pigiron mod + stairs.register_stair_and_slab("willow_wood", "ebiomes:willow_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_willow_wood.png"}, + S("Willow Wood Stair"), + S("Willow Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Willow Wood Stair"), + S("Outer Willow Wood Stair") + ) + + default.register_fence("ebiomes:fence_willow_wood", { + description = S("Willow Wood Fence"), + texture = "ebiomes_fence_willow_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_willow_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_willow_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:willow_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_willow_wood", { + description = S("Willow Wood Fence Rail"), + texture = "ebiomes_fence_rail_willow_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_willow_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_willow_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:willow_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_willow_wood", { + description = S("Willow Wood Mese Post Light"), + texture = "ebiomes_fence_willow_wood.png", + material = "ebiomes:willow_wood", + }) + + doors.register_fencegate("ebiomes:gate_willow_wood", { + description = S("Willow Wood Fence Gate"), + texture = "ebiomes_willow_wood.png", + material = "ebiomes:willow_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_willow_wood_closed", + burntime = 9, + }) + + + +--Alder + + core.register_node("ebiomes:alder_tree", { + description = S("Alder Tree"), + tiles = {"ebiomes_alder_tree_top.png", "ebiomes_alder_tree_top.png", + "ebiomes_alder_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:alder_wood", { + description = S("Alder Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_alder_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:alder_wood 4", + recipe = { + {"ebiomes:alder_tree"}, + } + }) + + core.register_node("ebiomes:alder_leaves", { + description = S("Alder Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_alder_leaves.png"}, + special_tiles = {"ebiomes_alder_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:alder_sapling"}, rarity = 20}, + {items = {"ebiomes:alder_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:alder_tree"}, + leaves = {"ebiomes:alder_leaves"}, + radius = 3, + }) + +local function grow_new_alder_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_alder_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:alder_sapling", { + description = S("Alder Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_alder_sapling.png"}, + inventory_image = "ebiomes_alder_sapling.png", + wield_image = "ebiomes_alder_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alder_tree, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:alder_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 10, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:alder_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 103, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_alder_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +else + core.register_decoration({ + name = "ebiomes:alder_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 103, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_alder_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:alder_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_alder_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:alder_sapling", grow_new_alder_tree, "soil"}, +}) +end + + stairs.register_stair_and_slab("alder_wood", "ebiomes:alder_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_alder_wood.png"}, + S("Alder Wood Stair"), + S("Alder Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Alder Wood Stair"), + S("Outer Alder Wood Stair") + ) + + default.register_fence("ebiomes:fence_alder_wood", { + description = S("Alder Wood Fence"), + texture = "ebiomes_fence_alder_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_alder_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_alder_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:alder_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_alder_wood", { + description = S("Alder Wood Fence Rail"), + texture = "ebiomes_fence_rail_alder_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_alder_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_alder_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:alder_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_alder_wood", { + description = S("Alder Wood Mese Post Light"), + texture = "ebiomes_fence_alder_wood.png", + material = "ebiomes:alder_wood", + }) + + doors.register_fencegate("ebiomes:gate_alder_wood", { + description = S("Alder Wood Fence Gate"), + texture = "ebiomes_alder_wood.png", + material = "ebiomes:alder_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_alder_wood_closed", + burntime = 9, + }) + + +--Ash + + + core.register_node("ebiomes:ash_tree", { + description = S("Ash Tree"), + tiles = {"ebiomes_ash_tree_top.png", "ebiomes_ash_tree_top.png", + "ebiomes_ash_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:ash_wood", { + description = S("Ash Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_ash_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:ash_wood 4", + recipe = { + {"ebiomes:ash_tree"}, + } + }) + + core.register_node("ebiomes:ash_leaves", { + description = S("Ash Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_ash_leaves.png"}, + special_tiles = {"ebiomes_ash_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:ash_sapling"}, rarity = 20}, + {items = {"ebiomes:ash_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:ash_tree"}, + leaves = {"ebiomes:ash_leaves"}, + radius = 3, + }) + +local function grow_new_ash_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/ebiomes_ash_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:ash_sapling", { + description = S("Ash Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_ash_sapling.png"}, + inventory_image = "ebiomes_ash_sapling.png", + wield_image = "ebiomes_ash_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_ash_tree, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 7 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:ash_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -4, y = 1, z = -4}, + {x = 4, y = 11, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + +if core.settings:get_bool("light_mapgen", true) then + + core.register_decoration({ + name = "ebiomes:ash_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 102, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +else + core.register_decoration({ + name = "ebiomes:ash_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.009, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 102, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:ash_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:ash_sapling", grow_new_ash_tree, "soil"}, +}) +end + + stairs.register_stair_and_slab("ash_wood", "ebiomes:ash_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_ash_wood.png"}, + S("Ash Wood Stair"), + S("Ash Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Ash Wood Stair"), + S("Outer Ash Wood Stair") + ) + + default.register_fence("ebiomes:fence_ash_wood", { + description = S("Ash Wood Fence"), + texture = "ebiomes_fence_ash_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_ash_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_ash_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:ash_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_ash_wood", { + description = S("Ash Wood Fence Rail"), + texture = "ebiomes_fence_rail_ash_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_ash_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_ash_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:ash_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_ash_wood", { + description = S("Ash Wood Mese Post Light"), + texture = "ebiomes_fence_ash_wood.png", + material = "ebiomes:ash_wood", + }) + + doors.register_fencegate("ebiomes:gate_ash_wood", { + description = S("Ash Wood Fence Gate"), + texture = "ebiomes_ash_wood.png", + material = "ebiomes:ash_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_ash_wood_closed", + burntime = 8, + }) + +--Birch + + + core.register_node("ebiomes:birch_tree", { + description = S("Birch Tree"), + tiles = {"ebiomes_birch_tree_top.png", "ebiomes_birch_tree_top.png", + "ebiomes_birch_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:birch_wood", { + description = S("Birch Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_birch_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:birch_wood 4", + recipe = { + {"ebiomes:birch_tree"}, + } + }) + + core.register_node("ebiomes:birch_leaves", { + description = S("Birch Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_birch_leaves.png"}, + special_tiles = {"ebiomes_birch_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:birch_sapling"}, rarity = 20}, + {items = {"ebiomes:birch_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:birch_tree"}, + leaves = {"ebiomes:birch_leaves"}, + radius = 3, + }) + +local function grow_new_birch_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_birch_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:birch_sapling", { + description = S("Birch Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_birch_sapling.png"}, + inventory_image = "ebiomes_birch_sapling.png", + wield_image = "ebiomes_birch_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_birch_tree, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:birch_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 13, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:birch_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.003, + spread = {x = 250, y = 250, z = 250}, + seed = 104, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_birch_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:birch_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.003, + spread = {x = 250, y = 250, z = 250}, + seed = 104, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_birch_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + + core.register_decoration({ + name = "ebiomes:birch_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_birch_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:birch_sapling", grow_new_birch_tree, "soil"}, +}) +end + + stairs.register_stair_and_slab("birch_wood", "ebiomes:birch_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_birch_wood.png"}, + S("Birch Wood Stair"), + S("Birch Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Birch Wood Stair"), + S("Outer Birch Wood Stair") + ) + + default.register_fence("ebiomes:fence_birch_wood", { + description = S("Birch Wood Fence"), + texture = "ebiomes_fence_birch_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_birch_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_birch_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_birch_wood", { + description = S("Birch Wood Fence Rail"), + texture = "ebiomes_fence_rail_birch_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_birch_wood", { + description = S("Birch Wood Mese Post Light"), + texture = "ebiomes_fence_birch_wood.png", + material = "ebiomes:birch_wood", + }) + + doors.register_fencegate("ebiomes:gate_birch_wood", { + description = S("Birch Wood Fence Gate"), + texture = "ebiomes_birch_wood.png", + material = "ebiomes:birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_birch_wood_closed", + burntime = 6, + }) + + +--Swamp + + core.register_decoration({ + name = "ebiomes:willow_tree_sw", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_swamp"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 100, + octaves = 3, + persist = 0.66 + }, + biomes = {"swamp", "swamp_shore"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_willow_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:ash_tree_sw", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_swamp"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 102, + octaves = 3, + persist = 0.66 + }, + biomes = {"swamp", "swamp_shore"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + +--Downy Birch + + + core.register_node("ebiomes:downy_birch_tree", { + description = S("Downy Birch Tree"), + tiles = {"ebiomes_downy_birch_tree_top.png", "ebiomes_downy_birch_tree_top.png", + "ebiomes_downy_birch_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:downy_birch_wood", { + description = S("Downy Birch Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_downy_birch_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:downy_birch_wood 4", + recipe = { + {"ebiomes:downy_birch_tree"}, + } + }) + + core.register_node("ebiomes:downy_birch_leaves", { + description = S("Downy Birch Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_downy_birch_leaves.png"}, + special_tiles = {"ebiomes_downy_birch_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:downy_birch_sapling"}, rarity = 20}, + {items = {"ebiomes:downy_birch_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:downy_birch_tree"}, + leaves = {"ebiomes:downy_birch_leaves"}, + radius = 3, + }) + +local function grow_new_downy_birch_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_downy_birch_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:downy_birch_sapling", { + description = S("Downy Birch Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_downy_birch_sapling.png"}, + inventory_image = "ebiomes_downy_birch_sapling.png", + wield_image = "ebiomes_downy_birch_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_downy_birch_tree, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:downy_birch_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -1, y = 1, z = -1}, + {x = 1, y = 7, z = 1}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:downy_birch_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_swamp"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 104, + octaves = 3, + persist = 0.66 + }, + biomes = {"swamp"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_downy_birch_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:downy_birch_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_swamp"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"swamp"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_downy_birch_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_swamp"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:downy_birch_sapling", grow_new_downy_birch_tree, "soil"}, +}) +end + + stairs.register_stair_and_slab("downy_birch_wood", "ebiomes:downy_birch_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_downy_birch_wood.png"}, + S("Downy Birch Wood Stair"), + S("Downy Birch Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Downy Birch Wood Stair"), + S("Outer Downy Birch Wood Stair") + ) + + default.register_fence("ebiomes:fence_downy_birch_wood", { + description = S("Downy Birch Wood Fence"), + texture = "ebiomes_fence_downy_birch_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_downy_birch_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_downy_birch_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:downy_birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_downy_birch_wood", { + description = S("Downy Birch Wood Fence Rail"), + texture = "ebiomes_fence_rail_downy_birch_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_downy_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_downy_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:downy_birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_downy_birch_wood", { + description = S("Downy Birch Wood Mese Post Light"), + texture = "ebiomes_fence_downy_birch_wood.png", + material = "ebiomes:downy_birch_wood", + }) + + doors.register_fencegate("ebiomes:gate_downy_birch_wood", { + description = S("Downy Birch Wood Fence Gate"), + texture = "ebiomes_downy_birch_wood.png", + material = "ebiomes:downy_birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_downy_birch_wood_closed", + burntime = 6, + }) + +--Loot + +if core.global_exists("dungeon_loot") then + dungeon_loot.register ({ + {name = "ebiomes:redcurrants", chance = 0.3, count = {1, 4}}, + {name = "ebiomes:blackcurrants", chance = 0.3, count = {1, 4}}, + {name = "ebiomes:gooseberries", chance = 0.3, count = {1, 4}}, + {name = "ebiomes:cranberries", chance = 0.2, count = {1, 6}}, + }) +end + +--Bonemeal +if core.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_cold", {"ebiomes:grass_cold_1", "ebiomes:grass_cold_2", "ebiomes:grass_cold_3", "ebiomes:grass_cold_4", "ebiomes:grass_cold_5"}, + {"flowers:dandelion_yellow", "flowers:dandelion_white", "flowers:tulip", "flowers:tulip_black", "flowers:chrysanthemum_green"} } + }) + + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_swamp", {"ebiomes:grass_swamp_1", "ebiomes:grass_swamp_2", "ebiomes:grass_swamp_3", "ebiomes:grass_swamp_4", "ebiomes:grass_swamp_5"}, + {"ebiomes:marsh_stitchwort", "ebiomes:marsh_grass_yellow", "ebiomes:marsh_grass_green"} } + }) + + bonemeal:add_deco({ + {"ebiomes:peat_with_swamp_moss_yellow", {"ebiomes:grass_bog_1", "ebiomes:grass_bog_2", "ebiomes:grass_bog_3", "ebiomes:grass_bog_4", "ebiomes:grass_bog_5", "ebiomes:reeds"}, + {"ebiomes:cranberry_patch", "ebiomes:sundew", "ebiomes:marigold", "ebiomes:marsh_stitchwort", "ebiomes:marsh_grass_yellow", "ebiomes:marsh_grass_green"} } + }) + + bonemeal:add_deco({ + {"ebiomes:peat_wet_with_swamp_moss_green", {"ebiomes:reeds"}, + {"ebiomes:cranberry_patch", "ebiomes:sundew", "ebiomes:marigold"} } + }) +end + + + +--Peripheral mod support + + +--Moreblocks + +--sampled from cool_trees +-- stairsplus/moreblocks +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("alder_tree", "wood", "ebiomes:alder_wood", { + description = "Alder Wood", + tiles = {"ebiomes_alder_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("ash_tree", "wood", "ebiomes:ash_wood", { + description = "Ash Wood", + tiles = {"ebiomes_ash_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("birch_tree", "wood", "ebiomes:birch_wood", { + description = "Birch Wood", + tiles = {"ebiomes_birch_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("downy_birch_tree", "wood", "ebiomes:downy_birch_wood", { + description = "Downy Birch Wood", + tiles = {"ebiomes_downy_birch_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("willow_tree", "wood", "ebiomes:willow_wood", { + description = "Willow Wood", + tiles = {"ebiomes_willow_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +--If someone wants glorious peat stuff they may uncomment this. Whether this works righ out of bat, no idea. +--[[ + stairsplus:register_all("peat_dry", "soil", "ebiomes:peat_dry", { + description = "Dry Peat", + tiles = {"ebiomes_peat_dry.png"}, + groups = {crumbly = 2, oddly_breakable_by_hand = 1}, + sounds = default.node_sound_wood_defaults(), + }) +--]] + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:ash_sapling") + flowerpot.register_node("ebiomes:alder_sapling") + flowerpot.register_node("ebiomes:birch_sapling") + flowerpot.register_node("ebiomes:downy_birch_sapling") + flowerpot.register_node("ebiomes:willow_sapling") + + flowerpot.register_node("ebiomes:blackcurrant_bush_sapling") + flowerpot.register_node("ebiomes:gooseberry_bush_sapling") + flowerpot.register_node("ebiomes:redcurrant_bush_sapling") + + flowerpot.register_node("ebiomes:cranberry_patch") + flowerpot.register_node("ebiomes:marsh_stitchwort") -- All respect to the plant, but lol + flowerpot.register_node("ebiomes:marigold") + flowerpot.register_node("ebiomes:sundew") + +end diff --git a/mods/ebiomes/cowberries.lua b/mods/ebiomes/cowberries.lua new file mode 100644 index 0000000..d0e6b8a --- /dev/null +++ b/mods/ebiomes/cowberries.lua @@ -0,0 +1,145 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +-- Aliases + +core.register_alias("cowberry_bush_leaves", "ebiomes:cowberry_bush_leaves") +core.register_alias("cowberry_bush_leaves", "ebiomes:cowberry_bush_leaves_with_berries") +core.register_alias("cowberry_bush_sapling", "ebiomes:cowberry_bush_sapling") +core.register_alias("cowberries", "ebiomes:cowberries") + +-- Cowberry + +local function grow_new_cowberry(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x, y = pos.y, z = pos.z}, modpath.."/schematics/ebiomes_cowberry_bush.mts", "0", nil, false) +end + + core.register_craftitem("ebiomes:cowberries", { + description = S("Cowberries"), + inventory_image = "ebiomes_cowberries.png", + groups = {food_cowberries = 1, food_berry = 1, eatable = 2}, + on_use = core.item_eat(2), + }) + + + core.register_node("ebiomes:cowberry_bush_leaves_with_berries", { + description = S("Cowberry Bush Leaves with Berries"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_cowberry_bush_leaves.png^ebiomes_cowberry_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + walkable = false, + drop = "ebiomes:cowberries", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "ebiomes:cowberry_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, {name = "ebiomes:cowberry_bush_leaves"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + }) + + + core.register_node("ebiomes:cowberry_bush_leaves", { + description = S("Cowberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_cowberry_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + walkable = false, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:cowberry_bush_sapling"}, rarity = 5}, + {items = {"ebiomes:cowberry_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:cowberry_bush_leaves_with_berries"}) + end + end, + + after_place_node = default.after_place_leaves, + }) + + + core.register_node("ebiomes:cowberry_bush_sapling", { + description = S("Cowberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_cowberry_bush_sapling.png"}, + inventory_image = "ebiomes_cowberry_bush_sapling.png", + wield_image = "ebiomes_cowberry_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_cowberry, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, -1 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:cowberry_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:cowberry_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:permafrost_with_moss"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"taiga", "snowy_grassland", "tundra"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_cowberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {"ebiomes:cowberry_bush_sapling", grow_new_cowberry, "soil"}, + }) +end + +if core.global_exists("flowerpot") then + flowerpot.register_node("ebiomes:cowberry_bush_sapling") +end diff --git a/mods/ebiomes/extensions.lua b/mods/ebiomes/extensions.lua new file mode 100644 index 0000000..86f5dc2 --- /dev/null +++ b/mods/ebiomes/extensions.lua @@ -0,0 +1,1540 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + + +--Aliases + +core.register_alias("oak_tree", "ebiomes:oak_tree") +core.register_alias("oak_wood", "ebiomes:oak_wood") +core.register_alias("oak_leaves", "ebiomes:oak_leaves") +core.register_alias("oak_sapling", "ebiomes:oak_sapling") +core.register_alias("acorns", "ebiomes:acorns") +core.register_alias("bucket_acorns", "ebiomes:bucket_acorns") +core.register_alias("acorns_cooked", "ebiomes:acorns_cooked") + +core.register_alias("maple_tree", "ebiomes:maple_tree") +core.register_alias("maple_wood", "ebiomes:maple_wood") +core.register_alias("maple_leaves", "ebiomes:maple_leaves") +core.register_alias("maple_sapling", "ebiomes:maple_sapling") + + +--Global ores/dirt patches + + core.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:dirt"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = -1, + y_min = -3, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"} + }) + + -- Dirt + + core.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + -- Only where default:dirt is present as surface material + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"} + }) + + + -- Deciduous forests + + -- Warmish/Fruity + + + core.register_biome({ + name = "deciduous_forest_fruity", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 64, + humidity_point = 68, + }) + + core.register_biome({ + name = "deciduous_forest_fruity_shore", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 64, + humidity_point = 68, + }) + + core.register_biome({ + name = "deciduous_forest_fruity_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 64, + humidity_point = 68, + }) + + core.register_biome({ + name = "deciduous_forest_fruity_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 64, + humidity_point = 68, + }) + + + + -- Coldish/Woody + + core.register_biome({ + name = "deciduous_forest_woody", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 56, + humidity_point = 68, + }) + + core.register_biome({ + name = "deciduous_forest_woody_shore", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 56, + humidity_point = 68, + }) + + core.register_biome({ + name = "deciduous_forest_woody_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 56, + humidity_point = 68, + }) + + core.register_biome({ + name = "deciduous_forest_woody_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 56, + humidity_point = 68, + }) + + + + + + -- Grasslands + + + -- Coldish + + core.register_biome({ + name = "grassland_coldish", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 42, + humidity_point = 35, + }) + + core.register_biome({ + name = "grassland_coldish_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 42, + humidity_point = 35, + }) + + core.register_biome({ + name = "grassland_coldish_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 42, + humidity_point = 35, + }) + + core.register_biome({ + name = "grassland_coldish_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 42, + humidity_point = 35, + }) + +-- Common All + +--Grass + + + for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grassext_"..length, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.01, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "default:grass_"..length, + }) + end + +-- Flowers + + --flowers + + core.register_decoration({ + name = "ebiomes:dandelionext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:dandelion_yellow", + }) + + core.register_decoration({ + name = "ebiomes:dandelion_whiteext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:dandelion_white", + }) + + + core.register_decoration({ + name = "ebiomes:tulipext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:tulip", + }) + + + core.register_decoration({ + name = "ebiomes:tulip_blackext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:tulip_black", + }) + + core.register_decoration({ + name = "ebiomes:roseext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:rose", + }) + + core.register_decoration({ + name = "ebiomes:chrysanthemum_greenext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:chrysanthemum_green", + }) + + core.register_decoration({ + name = "ebiomes:geraniumext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland_coldish", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:geranium", + }) + + +-- Common Forest + + -- Apple tree and log + + core.register_decoration({ + name = "ebiomes:apple_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.024, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/apple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:apple_logext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/apple_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, + }) + + + core.register_decoration({ + name = "ebiomes:waterlilyext", + deco_type = "simple", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = {"deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 0, + y_min = 0, + decoration = "flowers:waterlily_waving", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) + + --mushrooms + + core.register_decoration({ + name = "ebiomes:mushroom_brownext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:mushroom_brown", + }) + + core.register_decoration({ + name = "ebiomes:mushroom_redext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:mushroom_brown", + }) + +-- Common Grassland + + core.register_decoration({ + name = "ebiomes:bushext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland_coldish"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x, place_center_z", + }) + + + core.register_decoration({ + name = "ebiomes:blueberry_bushext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland_coldish"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("default") .. "/schematics/blueberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + + +-- Specifics + +-- Warmish/Fruity deciduous forest + + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:pear_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 100, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pear_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:pear_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 100, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pear_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:pear_logext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_fruity"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pear_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_grass"}, + num_spawn_by = 8, + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:hornbeam_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:hornbeam_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_fruity"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:hornbeam_log", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_fruity"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_grass"}, + num_spawn_by = 8, + }) + + + -- Coldish/Woody deciduous + + -- Aspen + + core.register_decoration({ + name = "ebiomes:aspen_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = -0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 104, + octaves = 3, + persist = 0.06 + }, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:aspen_logext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_aspen_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_grass"}, + num_spawn_by = 8, + }) + + -- Berries + + core.register_decoration({ + name = "ebiomes:blackcurrant_bushext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 787, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_blackcurrant_bush.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:redcurrant_bushext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 878, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_redcurrant_bush.mts", + flags = "place_center_x, place_center_z", + }) + + + core.register_decoration({ + name = "ebiomes:gooseberry_bushext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 969, + octaves = 3, + persist = 0.7, + }, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_gooseberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:ash_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 102, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:ash_treeext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.009, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 102, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:ash_logext", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_woody"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_ash_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_grass"}, + num_spawn_by = 8, + }) + + + +--[[ + -- Grassland warmish + + core.register_decoration({ + name = "ebiomes:larkspurext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 384, + octaves = 3, + persist = 0.05 + }, + biomes = {"grassland_warmish"}, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:larkspur", + }) +--]] + -- Grassland coldish + + core.register_decoration({ + name = "ebiomes:russian_irisext", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 350, + octaves = 3, + persist = 0.05 + }, + biomes = {"grassland_coldish"}, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:russian_iris", + }) + + + + +--Trees + +--Oak + + core.register_node("ebiomes:oak_tree", { + description = S("Oak Tree"), + tiles = {"ebiomes_oak_tree_top.png", "ebiomes_oak_tree_top.png", + "ebiomes_oak_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:oak_wood", { + description = S("Oak Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_oak_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:oak_wood 4", + recipe = { + {"ebiomes:oak_tree"}, + } + }) + + core.register_node("ebiomes:oak_leaves", { + description = S("Oak Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_oak_leaves.png"}, +-- special_tiles = {"ebiomes_oak_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:oak_sapling"}, rarity = 20}, + {items = {"ebiomes:oak_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:oak_tree"}, + leaves = {"ebiomes:oak_leaves"}, + radius = 3, + }) + +local function grow_new_oak_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-5, y = pos.y, z = pos.z-5}, modpath.."/schematics/ebiomes_oak_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:oak_sapling", { + description = S("Oak Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_oak_sapling.png"}, + inventory_image = "ebiomes_oak_sapling.png", + wield_image = "ebiomes_oak_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_oak_tree, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:oak_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -6, y = 1, z = -6}, + {x = 6, y = 10, z = 6}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:oak_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold", "default:dirt_with_grass", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.0001, + scale = 0.003, + spread = {x = 250, y = 250, z = 250}, + seed = 813, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest", "deciduous_forest_warm", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_oak_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:oak_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold", "default:dirt_with_grass", "ebiomes:dirt_with_grass_warm"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold", "deciduous_forest", "deciduous_forest_warm", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_oak_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:oak_sapling", grow_new_oak_tree, "soil"}, +}) +end + + stairs.register_stair_and_slab("oak_wood", "ebiomes:oak_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_oak_wood.png"}, + S("Oak Wood Stair"), + S("Oak Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Oak Wood Stair"), + S("Outer Oak Wood Stair") + ) + + default.register_fence("ebiomes:fence_oak_wood", { + description = S("Oak Wood Fence"), + texture = "ebiomes_fence_oak_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_oak_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_oak_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:oak_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_oak_wood", { + description = S("Oak Wood Fence Rail"), + texture = "ebiomes_fence_rail_oak_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_oak_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_oak_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:oak_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_oak_wood", { + description = S("Oak Wood Mese Post Light"), + texture = "ebiomes_fence_oak_wood.png", + material = "ebiomes:oak_wood", + }) + + doors.register_fencegate("ebiomes:gate_oak_wood", { + description = S("Oak Wood Fence Gate"), + texture = "ebiomes_oak_wood.png", + material = "ebiomes:oak_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_oak_wood_closed", + burntime = 9, + }) + + +-- Acorns + + core.register_node("ebiomes:acorns", { + description = S("Acorns"), + drawtype = "plantlike", + tiles = {"ebiomes_acorns_hanging.png"}, + inventory_image = "ebiomes_acorns.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, 8 / 16, -6 / 16, 6 / 16, 2 /16, 6 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, +-- on_use = core.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:acorns", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, {name = "ebiomes:acorns_mark"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, + }) + + core.register_node("ebiomes:acorns_mark", { + description = S("Acorns Marker"), + inventory_image = "ebiomes_acorns.png^default_invisible_node_overlay.png", + wield_image = "ebiomes_acorns.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, "ebiomes:acorns_leaves") then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:acorns"}) + end + end + }) + + core.register_craftitem("ebiomes:acorns_cooked", { + description = S("Cooked Acorns"), + inventory_image = "ebiomes_acorns_cooked.png", + groups = {food_acorns = 1, eatable = 4}, + on_use = core.item_eat(4), + }) + + + core.register_craftitem("ebiomes:bucket_acorns", { + description = S("Bucket of Acorns"), + inventory_image = "ebiomes_bucket_acorns.png", + groups = {cookables_acorns = 1}, + }) + + core.register_craft({ + output = "ebiomes:bucket_acorns", + recipe = { + {"ebiomes:acorns"}, + {"bucket:bucket_water"}, + } + }) + + core.register_craft({ + output = "ebiomes:bucket_acorns", + recipe = { + {"ebiomes:acorns"}, + {"bucket:bucket_river_water"}, + } + }) + + core.register_craft({ + output = "ebiomes:oak_sapling", + recipe = { + {"ebiomes:acorns"}, + } + }) + + core.register_craft({ + type = "cooking", + output = "ebiomes:acorns_cooked", + recipe = "ebiomes:bucket_acorns", + replacements = {{"ebiomes:bucket_acorns", "bucket:bucket_empty"}}, + cooktime = 3, + }) + + + + +--Peripheral mod support + + +--Moreblocks + +--sampled from cool_trees +-- stairsplus/moreblocks +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("oak_tree", "wood", "ebiomes:oak_wood", { + description = "Oak Wood", + tiles = {"ebiomes_oak_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:oak_sapling") + +end + + + + + + + + + + +--Maple + + core.register_node("ebiomes:maple_tree", { + description = S("Maple Tree"), + tiles = {"ebiomes_maple_tree_top.png", "ebiomes_maple_tree_top.png", + "ebiomes_maple_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:maple_wood", { + description = S("Maple Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_maple_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:maple_wood 4", + recipe = { + {"ebiomes:maple_tree"}, + } + }) + + core.register_node("ebiomes:maple_leaves", { + description = S("Maple Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_maple_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + walkable = true, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:maple_sapling"}, rarity = 20}, + {items = {"ebiomes:maple_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:maple_tree"}, + leaves = {"ebiomes:maple_leaves"}, + radius = 3, + }) + +--left this credit but erased it's identicals further down the line +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_maple_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_maple_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_maple.mts" + + core.register_node("ebiomes:maple_sapling", { + description = S("Maple Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_maple_sapling.png"}, + inventory_image = "ebiomes_maple_sapling.png", + wield_image = "ebiomes_maple_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_maple_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:maple_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 11, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:maple_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold", "default:dirt_with_grass", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 162, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest", "deciduous_forest_warm", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_maple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:maple_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold", "default:dirt_with_grass", "ebiomes:dirt_with_grass_warm"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold", "deciduous_forest", "deciduous_forest_warm", "deciduous_forest_fruity", "deciduous_forest_woody"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_maple_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold", "default:dirt_with_grass", "ebiomes:dirt_with_grass_warm"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:maple_sapling", grow_new_maple_tree, "soil"}, +}) +end + + --forms sampled from pigiron mod + stairs.register_stair_and_slab("maple_wood", "ebiomes:maple_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_maple_wood.png"}, + S("Maple Wood Stair"), + S("Maple Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Maple Wood Stair"), + S("Outer Maple Wood Stair") + ) + + default.register_fence("ebiomes:fence_maple_wood", { + description = S("Maple Wood Fence"), + texture = "ebiomes_fence_maple_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_maple_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_maple_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:maple_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_maple_wood", { + description = S("Maple Wood Fence Rail"), + texture = "ebiomes_fence_rail_maple_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_maple_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_maple_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:maple_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_maple_wood", { + description = S("Maple Wood Mese Post Light"), + texture = "ebiomes_fence_maple_wood.png", + material = "ebiomes:maple_wood", + }) + + doors.register_fencegate("ebiomes:gate_maple_wood", { + description = S("Maple Wood Fence Gate"), + texture = "ebiomes_maple_wood.png", + material = "ebiomes:maple_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_maple_wood_closed", + burntime = 9, + }) + + + +--Peripheral mod support + + +--Moreblocks + +--sampled from cool_trees +-- stairsplus/moreblocks +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("maple_tree", "wood", "ebiomes:maple_wood", { + description = "Maple Wood", + tiles = {"ebiomes_maple_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:maple_sapling") + +end diff --git a/mods/ebiomes/forgotten_monsters.lua b/mods/ebiomes/forgotten_monsters.lua new file mode 100644 index 0000000..a92857c --- /dev/null +++ b/mods/ebiomes/forgotten_monsters.lua @@ -0,0 +1,114 @@ +--Forgotten monsters compatibility +--For specified mobs(ones that dont spawn in a highly generalized way like in air or on stone) + +--hungry +if not mobs.custom_spawn_monster then +mobs:spawn({ + name = "hungry:hungry", +-- nodes = {"default:dirt_with_grass","default:dirt_with_rainforest_litter"}, + nodes = {"ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_japanese_rainforest_litter"}, +-- biomes = {"deciduous_forest_cold", "deciduous_forest_warm"}, + min_light = 14, + --interval = 30, -- 60 + chance = 9000, + min_height = 0, + max_height = 200, +}) +end + +--skullmobs +local fmeb = { +"ebiomes:dirt_with_grass_cold", +"ebiomes:dirt_with_grass_warm", +"ebiomes:dirt_with_grass_med", +"ebiomes:dirt_with_grass_swamp", +"ebiomes:dry_dirt_with_grass_arid", +"ebiomes:dry_dirt_with_grass_arid_cool", +"ebiomes:dirt_with_grass_steppe_cold", +"ebiomes:dirt_with_grass_steppe", +"ebiomes:dirt_with_grass_steppe_warm", +"ebiomes:peat_with_swamp_moss_yellow", +"ebiomes:dirt_with_japanese_rainforest_litter", +"ebiomes:dry_dirt_with_humid_savanna_grass", +"ebiomes:dirt_with_forest_litter", +"ebiomes:dirt_with_jungle_savanna_grass" + +} + +--skull archers +if not mobs.custom_spawn_monster then +mobs:spawn({ + name = "skullarchers:sarchers", + nodes = fmeb, + min_light = 0, + max_light = 14, + chance = 7000, + --min_height = 0, + --max_height = 200, + max_height = 200, +}) +end + +--skulls +if not mobs.custom_spawn_monster then +mobs:spawn({ + name = "skulls:skull", + nodes = fmeb, + min_light = 0, + max_light = 14, + chance = 7000, + --min_height = 0, + --max_height = 200, + max_height = 200, + +}) +end + +--skullswords +if not mobs.custom_spawn_monster then +mobs:spawn({ + name = "skullsword:ssword", + nodes = fmeb, + min_light = 0, + max_light = 14, + chance = 7000, + --min_height = 0, + --max_height = 200, + max_height = 200, +}) +end + +--berserker +mobs:spawn({ + name = "forgotten_monsters:skull_berserker", + nodes = fmeb, + neighbors = "air", + min_light = 0, + max_light = max_light_skull, + chance = 7000, + --min_height = 0, + --max_height = 200, + max_height = 200, +}) +--[[ +--spoky (old version monster) +if not mobs.custom_spawn_monster then +mobs:spawn({ + name = "spoky:spoky", + nodes = fmeb, + min_light = 0, + max_light = 14, + interval = 60, + chance = 15000, + --min_height = 0, + --max_height = 200, + max_height = 200, + +}) +end +--]] + + + + + diff --git a/mods/ebiomes/globals.lua b/mods/ebiomes/globals.lua new file mode 100644 index 0000000..e57edf2 --- /dev/null +++ b/mods/ebiomes/globals.lua @@ -0,0 +1,866 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Globals + +--Aliases + +core.register_alias("desert_sand_with_debris", "ebiomes:desert_sand_with_debris") +core.register_alias("sand_with_debris", "ebiomes:sand_with_debris") +core.register_alias("silver_sand_with_debris", "ebiomes:silver_sand_with_debris") + +--Biome basics + + -- Blob ore. + -- These before scatter ores to avoid other ores in blobs. + + -- Clay + + core.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:dirt"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = -1, + y_min = -3, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest_cold_shore", "deciduous_forest_warm", "deciduous_forest_warm_shore", "temperate_rainforest"} + }) + + -- Dirt + + core.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + -- Only where default:dirt is present as surface material + biomes = {"deciduous_forest_cold", "meditarranean", "warm_steppe", "steppe", "cold_steppe", "deciduous_forest_warm", "japanese_rainforest", "temperate_rainforest", "jungle_savanna"} + }) + + +--Debris + +-- Desert sand with debris + + core.register_node("ebiomes:desert_sand_with_debris", { + description = S("Desert Sand with Debris"), + tiles = {"ebiomes_desert_sand_with_debris.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "default:desert_sand", + sounds = default.node_sound_sand_defaults(), + }) + + core.register_craft({ + output = "ebiomes:desert_sand_with_debris", + recipe = { + {"default:desert_sand"} + } + }) + + core.register_craft({ + output = "default:desert_sand", + recipe = { + {"ebiomes:desert_sand_with_debris"} + } + }) + + + core.register_decoration({ + name = "ebiomes:desert_sand_with_debris_l1", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.04, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"sandstone_desert", "sandstone_desert_buffer"}, + height = 1, + y_min = 7, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:desert_sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:desert_sand_with_debris_l1_low", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.04, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"sandstone_desert", "sandstone_desert_buffer"}, + height = 1, + y_min = -1, + y_max = 6, + place_offset_y = -1, + decoration = "ebiomes:desert_sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:desert_sand_with_debris_l2", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"sandstone_desert", "sandstone_desert_buffer"}, + height = 1, + y_min = -1, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:desert_sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + spawn_by = "ebiomes:desert_sand_with_debris", + num_spawn_by = 1 + }) + + +-- Sand with debris + + core.register_node("ebiomes:sand_with_debris", { + description = S("Sand with Debris"), + tiles = {"ebiomes_sand_with_debris.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "default:sand", + sounds = default.node_sound_sand_defaults(), + }) + + core.register_craft({ + output = "ebiomes:sand_with_debris", + recipe = { + {"default:sand"} + } + }) + + core.register_craft({ + output = "default:sand", + recipe = { + {"ebiomes:sand_with_debris"} + } + }) + + core.register_decoration({ + name = "ebiomes:sand_with_debris_l1", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.04, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"desert"}, + height = 1, + y_min = 7, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:sand_with_debris_l1_low", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.04, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"desert"}, + height = 1, + y_min = -1, + y_max = 6, + place_offset_y = -1, + decoration = "ebiomes:sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:sand_with_debris_l2", + deco_type = "simple", + place_on = {"default_sand"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"desert"}, + height = 1, + y_min = -1, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + spawn_by = "ebiomes:sand_with_debris", + num_spawn_by = 1 + }) + + +-- Silver sand with debris + + core.register_node("ebiomes:silder_sand_with_debris", { + description = S("Silver Sand with Debris"), + tiles = {"ebiomes_desert_sand_with_debris.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "default:silver_sand", + sounds = default.node_sound_sand_defaults(), + }) + + core.register_craft({ + output = "ebiomes:silver_sand_with_debris", + recipe = { + {"default:silver_sand"} + } + }) + + core.register_craft({ + output = "default:silver_sand", + recipe = { + {"ebiomes:silver_sand_with_debris"} + } + }) + + + core.register_decoration({ + name = "ebiomes:silver_sand_with_debris_l1", + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.04, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"cold_desert", "cold_desert_buffer"}, + height = 1, + y_min = 7, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:silver_sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:silver_sand_with_debris_l1_low", + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.04, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"cold_desert", "cold_desert_buffer"}, + height = 1, + y_min = -1, + y_max = 6, + place_offset_y = -1, + decoration = "ebiomes:silver_sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:silver_sand_with_debris_l2", + deco_type = "simple", + place_on = {"default_silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, +-- biomes = {"cold_desert"}, + height = 1, + y_min = -1, + y_max = 31000, + place_offset_y = -1, + decoration = "ebiomes:silver_sand_with_debris", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + spawn_by = "ebiomes:silver_sand_with_debris", + num_spawn_by = 1 + }) + +--[[ +--Marram grass (template) + + core.register_decoration({ + name = "ebiomes:marram_grass", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 4, + noise_params = { + offset = -0.7, + scale = 4.0, + spread = {x = 16, y = 16, z = 16}, + seed = 513337, + octaves = 1, + persist = 0.0, + flags = "absvalue, eased" + }, + biomes = {"warm_steppe_dunes", "steppe_dunes", "cold_steppe_dunes", "deciduous_forest_cold_shore"}, + y_max = 6, + y_min = 4, + decoration = { + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + }, + }) +--]] + +--Marram grass on debris + + -- Marram grass + + core.register_decoration({ + name = "ebiomes:marram_grass_debris", + deco_type = "simple", + place_on = {"ebiomes:sand_with_debris"}, + sidelen = 4, + noise_params = { + offset = -0.7, + scale = 4.0, + spread = {x = 16, y = 16, z = 16}, + seed = 513337, + octaves = 1, + persist = 0.0, + flags = "absvalue, eased" + }, + biomes = {"coniferous_forest_dunes", "grassland_dunes"}, + y_max = 6, + y_min = 4, + decoration = { + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + }, + }) + + +--Decors + + core.register_decoration({ + name = "ebiomes:coral", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = {x = 50, y = 50, z = 50}, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { + "humid_savanna_ocean", + "jungle_savanna_ocean", + }, + y_max = -2, + y_min = -8, + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton", + }, + }) + + + core.register_decoration({ + name = "ebiomes:bush", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"warm_steppe", "deciduous_forest_cold", "deciduous_forest_warm", "grassland_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:pine_bush", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 278, + octaves = 3, + persist = 0.7, + }, + biomes = {"steppe", "cold_steppe", "deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) + +--Trees + + core.register_decoration({ + name = "ebiomes:aspen_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = -0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 104, + octaves = 3, + persist = 0.06 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:aspen_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_aspen_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + + + + core.register_decoration({ + name = "ebiomes:small_pine_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = -0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 101, + octaves = 3, + persist = 0.03 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:pine_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_cold"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pine_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + + --Acacia + + core.register_decoration({ + name = "ebiomes:acacia_tree", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:acacia_log", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/acacia_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dry_dirt_with_dry_grass" + }) + + + --flowers + + core.register_decoration({ + name = "ebiomes:dandelion", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.016, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 352, + octaves = 3, + persist = 0.05 + }, + biomes = {"warm_steppe", "deciduous_forest_cold", "deciduous_forest_warm", "grassland_warm"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:dandelion_yellow", + }) + + core.register_decoration({ + name = "ebiomes:dandelion_white", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 353, + octaves = 3, + persist = 0.05 + }, + biomes = {"warm_steppe", "deciduous_forest_cold", "deciduous_forest_warm", "grassland_warm"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:dandelion_white", + }) + + + core.register_decoration({ + name = "ebiomes:tulip", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.012, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 356, + octaves = 3, + persist = 0.05 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:tulip", + }) + + + core.register_decoration({ + name = "ebiomes:tulip_black", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold"}, + sidelen = 16, + noise_params = { + offset = 0.016, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 355, + octaves = 3, + persist = 0.05 + }, + biomes = {"deciduous_forest_cold"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:tulip_black", + }) + + core.register_decoration({ + name = "ebiomes:rose", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 357, + octaves = 3, + persist = 0.05 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:rose", + }) + + core.register_decoration({ + name = "ebiomes:chrysanthemum_green", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.016, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 354, + octaves = 3, + persist = 0.05 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:chrysanthemum_green", + }) + + core.register_decoration({ + name = "ebiomes:blueberry_bush", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"warm_steppe", "grassland_warm"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("default") .. "/schematics/blueberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:waterlily", + deco_type = "simple", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = {"deciduous_forest_cold_shore", "swamp_shore", "deciduous_forest_warm_shore"}, + y_max = 0, + y_min = 0, + decoration = "flowers:waterlily_waving", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) + + --mushrooms + + core.register_decoration({ + name = "ebiomes:mushroom_brown", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest_warm", "japanese_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:mushroom_brown", + }) + + core.register_decoration({ + name = "ebiomes:mushroom_red", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_cold", "deciduous_forest_warm", "japanese_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:mushroom_brown", + }) + +-- Kelp + + core.register_decoration({ + name = "ebiomes:kelp", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = { + "deciduous_forest_cold_ocean", + "cold_steppe_ocean", + "steppe_ocean", + "warm_steppe_ocean", + "sandstone_desert_buffer_ocean", + "cold_desert_buffer_ocean", + "arid_grassland_cool_ocean" + }, + y_max = -5, + y_min = -10, + flags = "force_placement", + decoration = "default:sand_with_kelp", + param2 = 48, + param2_max = 96, + }) + + + core.register_decoration({ + name = "ebiomes:dry_shrub", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool", "default:desert_sand", "default:silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"cold_steppe", "grassland_arid", "grassland_arid_cool", "sandstone_desert_buffer", "cold_desert_buffer"}, + y_max = 31000, + y_min = 2, + decoration = "default:dry_shrub", + param2 = 4, + }) + + diff --git a/mods/ebiomes/init.lua b/mods/ebiomes/init.lua new file mode 100644 index 0000000..c2ffdba --- /dev/null +++ b/mods/ebiomes/init.lua @@ -0,0 +1,98 @@ +local path = core.get_modpath("ebiomes") + +--quick access template +--[[ +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") +--]] + +-- Base + + dofile(path .. "/rereg.lua") + dofile(path .. "/cowberries.lua") + + +if core.settings:get_bool("reg_arids", true) then + dofile(path .. "/arids.lua") +end + +if core.settings:get_bool("reg_buffers", true) then + dofile(path .. "/buffers.lua") +end + +if core.settings:get_bool("reg_cswamps", true) then + dofile(path .. "/coldnswamps.lua") +end + +if core.settings:get_bool("reg_mediterranean", true) then + dofile(path .. "/mediterranean.lua") +end + +if core.settings:get_bool("reg_steppes", true) then + dofile(path .. "/steppes.lua") +end + +if core.settings:get_bool("reg_warms", true) then + dofile(path .. "/warms.lua") +end + + +if core.settings:get_bool("reg_hsavanna", true) then + dofile(path .. "/savanna.lua") +end + +if core.settings:get_bool("reg_jprainforest", true) then + dofile(path .. "/jprainforest.lua") +end + +if core.settings:get_bool("reg_bamboo", true) then + dofile(path .. "/bamboo.lua") +end + +-- Global + + dofile(path .. "/globals.lua") + dofile(path .. "/bugs.lua") + +-- Extended support + +if core.settings:get_bool("supp_mobs", true) then + dofile(path .. "/mobs.lua") +end + +if core.settings:get_bool("supp_forgotten_monsters", true) then + if core.get_modpath("forgotten_monsters") then + dofile(path .. "/forgotten_monsters.lua") + end +end + +-- Extended support + +if core.settings:get_bool("supp_animalworld", true) then + if core.get_modpath("animalworld") then + dofile(path .. "/animalworld.lua") + end +end + +if core.settings:get_bool("supp_nssm", true) then + if core.get_modpath("nssm") then + dofile(path .. "/nssm.lua") + end +end + + + + +if core.settings:get_bool("reg_hsavanna", true) and core.settings:get_bool("reg_jsavanna", true) then + dofile(path .. "/jsavanna.lua") +end + +if core.settings:get_bool("reg_cswamps", true) and core.settings:get_bool("reg_warms", true) and core.settings:get_bool("reg_trainforest", true) then + dofile(path .. "/trainforest.lua") +end + +if core.settings:get_bool("reg_cswamps", true) and core.settings:get_bool("reg_warms", true) and core.settings:get_bool("reg_steppes", true) and core.settings:get_bool("reg_extensions", true) then + dofile(path .. "/extensions.lua") +end diff --git a/mods/ebiomes/jprainforest.lua b/mods/ebiomes/jprainforest.lua new file mode 100644 index 0000000..b1b30f1 --- /dev/null +++ b/mods/ebiomes/jprainforest.lua @@ -0,0 +1,1062 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Aliases +core.register_alias("dirt_japanese_rainforest_litter", "ebiomes:dirt_with_japanese_rainforest_litter") +core.register_alias("dirt_japanese_rainforest_litter_footsteps", "ebiomes:dirt_with_japanese_rainforest_litter_footsteps") +core.register_alias("sugi_tree", "ebiomes:sugi_tree") +core.register_alias("sugi_wood", "ebiomes:sugi_wood") +core.register_alias("sugi_leaves", "ebiomes:sugi_leaves") +core.register_alias("sugi_sapling", "ebiomes:sugi_sapling") +core.register_alias("mizunara_tree", "ebiomes:mizunara_tree") +core.register_alias("mizunara_wood", "ebiomes:mizunara_wood") +core.register_alias("mizunara_leaves", "ebiomes:mizunara_leaves") +core.register_alias("mizunara_sapling", "ebiomes:mizunara_sapling") +core.register_alias("stoneoak_tree", "ebiomes:stoneoak_tree") +core.register_alias("stoneoak_wood", "ebiomes:stoneoak_wood") +core.register_alias("stoneoak_leaves", "ebiomes:stoneoak_leaves") +core.register_alias("stoneoak_sapling", "ebiomes:stoneoak_sapling") +core.register_alias("forestgrowth", "ebiomes:forestgrowth") + + + +-- Japanese rainforest + + core.register_node("ebiomes:dirt_with_japanese_rainforest_litter", { + description = S("Dirt with Japanese Rainforest Litter"), + tiles = {"ebiomes_japanese_rainforest_litter.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_japanese_rainforest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_japanese_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_japanese_rainforest_litter_footsteps", { + description = S("Dirt with Japanese Rainforest Litter and Footsteps"), + tiles = {"ebiomes_japanese_rainforest_litter.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_japanese_rainforest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_japanese_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_biome({ + name = "japanese_rainforest", + node_top = "ebiomes:dirt_with_japanese_rainforest_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 65, + humidity_point = 80, + }) + + core.register_biome({ + name = "japanese_rainforest_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 65, + humidity_point = 80, + }) + + core.register_biome({ + name = "japanese_rainforest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 65, + humidity_point = 80, + }) + + core.register_biome({ + name = "japanese_rainforest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 65, + humidity_point = 80, + }) + +--moss + + core.register_node("ebiomes:moss", { + description = S("Moss"), + tiles = {"ebiomes_moss.png"}, + inventory_image = "ebiomes_moss_clump.png", + wield_image = "ebiomes_moss_clump.png", + paramtype = "light", + buildable_to = true, + floodable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1}, + sounds = default.node_sound_leaves_defaults(), + }) + + core.register_decoration({ + name = "ebiomes:moss_l1", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.0001, + scale = 0.0001, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + height = 1, + y_min = 1, + y_max = 31000, +-- place_offset_y = -1, + decoration = "ebiomes:moss", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:moss_l2", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.9, + scale = 0.9, + spread = {x = 250, y = 250, z = 250}, + seed = 21, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + height = 1, + y_min = 1, + y_max = 31000, +-- place_offset_y = -1, + decoration = "ebiomes:moss", + flags = "place_center_x, place_center_z, force_placement", + rotation = "random", + spawn_by = "ebiomes:moss", + num_spawn_by = 1 + }) + + + core.register_craft({ + output = "default:mossycobble 8", + recipe = { + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "ebiomes:moss", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"} + } + }) + +--Decors + +--woods + +--Japanese rainforrest + +--Sugi + + core.register_node("ebiomes:sugi_tree", { + description = S("Sugi Tree"), + tiles = {"ebiomes_sugi_tree_top.png", "ebiomes_sugi_tree_top.png", + "ebiomes_sugi_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:sugi_wood", { + description = S("Sugi Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_sugi_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:sugi_wood 4", + recipe = { + {"ebiomes:sugi_tree"}, + } + }) + + core.register_node("ebiomes:sugi_leaves", { + description = S("Sugi Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_sugi_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:sugi_sapling"}, rarity = 20}, + {items = {"ebiomes:sugi_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:sugi_tree"}, + leaves = {"ebiomes:sugi_leaves"}, + radius = 3, + }) + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_sugi_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_sugi_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_sugi_tree.mts" + + core.register_node("ebiomes:sugi_sapling", { + description = S("Sugi Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_sugi_sapling.png"}, + inventory_image = "ebiomes_sugi_sapling.png", + wield_image = "ebiomes_sugi_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_sugi_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:sugi_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -2}, + {x = 3, y = 16, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("light_mapgen", true) then + + core.register_decoration({ + name = "ebiomes:sugi_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 201, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_sugi_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + + +else + + core.register_decoration({ + name = "ebiomes:sugi_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 201, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_sugi_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + +end + + core.register_decoration({ + name = "ebiomes:sugi_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_sugi_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:sugi_sapling", grow_new_sugi_tree, "soil"}, +}) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("sugi_wood", "ebiomes:sugi_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_sugi_wood.png"}, + S("Sugi Wood Stair"), + S("Sugi Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Sugi Wood Stair"), + S("Outer Sugi Wood Stair") + ) + + default.register_fence("ebiomes:fence_sugi_wood", { + description = S("Sugi Wood Fence"), + texture = "ebiomes_fence_sugi_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_sugi_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_sugi_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:sugi_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_sugi_wood", { + description = S("Sugi Wood Fence Rail"), + texture = "ebiomes_fence_rail_sugi_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_sugi_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_sugi_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:sugi_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_sugi_wood", { + description = S("Sugi Wood Mese Post Light"), + texture = "ebiomes_fence_sugi_wood.png", + material = "ebiomes:sugi_wood", + }) + + doors.register_fencegate("ebiomes:gate_sugi_wood", { + description = S("Sugi Wood Fence Gate"), + texture = "ebiomes_sugi_wood.png", + material = "ebiomes:sugi_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_sugi_wood_closed", + burntime = 9, + }) + + +--Mizunara + + core.register_node("ebiomes:mizunara_tree", { + description = S("Mizunara Tree"), + tiles = {"ebiomes_mizunara_tree_top.png", "ebiomes_mizunara_tree_top.png", + "ebiomes_mizunara_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:mizunara_wood", { + description = S("Mizunara Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_mizunara_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:mizunara_wood 4", + recipe = { + {"ebiomes:mizunara_tree"}, + } + }) + + core.register_node("ebiomes:mizunara_leaves", { + description = S("Mizunara Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_mizunara_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:mizunara_sapling"}, rarity = 20}, + {items = {"ebiomes:mizunara_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:mizunara_tree"}, + leaves = {"ebiomes:mizunara_leaves"}, + radius = 3, + }) + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_mizunara_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_mizunara_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_mizunara.mts" + + core.register_node("ebiomes:mizunara_sapling", { + description = S("Mizunara Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_mizunara_sapling.png"}, + inventory_image = "ebiomes_mizunara_sapling.png", + wield_image = "ebiomes_mizunara_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_mizunara_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:mizunara_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 4, y = 14, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("light_mapgen", true) then + + core.register_decoration({ + name = "ebiomes:mizunara_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 702, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_mizunara_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + +else + + core.register_decoration({ + name = "ebiomes:mizunara_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 702, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_mizunara_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + +end + + core.register_decoration({ + name = "ebiomes:mizunara_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_mizunara_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:mizunara_sapling", grow_new_mizunara_tree, "soil"}, +}) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("mizunara_wood", "ebiomes:mizunara_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_mizunara_wood.png"}, + S("Mizunara Wood Stair"), + S("Mizunara Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Mizunara Wood Stair"), + S("Outer Mizunara Wood Stair") + ) + + default.register_fence("ebiomes:fence_mizunara_wood", { + description = S("Mizunara Wood Fence"), + texture = "ebiomes_fence_mizunara_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_mizunara_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_mizunara_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:mizunara_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_mizunara_wood", { + description = S("Mizunara Wood Fence Rail"), + texture = "ebiomes_fence_rail_mizunara_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_mizunara_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_mizunara_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:mizunara_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_mizunara_wood", { + description = S("Mizunara Wood Mese Post Light"), + texture = "ebiomes_fence_mizunara_wood.png", + material = "ebiomes:mizunara_wood", + }) + + doors.register_fencegate("ebiomes:gate_mizunara_wood", { + description = S("Mizunara Wood Fence Gate"), + texture = "ebiomes_mizunara_wood.png", + material = "ebiomes:mizunara_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_mizunara_wood_closed", + burntime = 9, + }) + + + +--Stone Oak + + core.register_node("ebiomes:stoneoak_tree", { + description = S("Stone Oak Tree"), + tiles = {"ebiomes_stoneoak_tree_top.png", "ebiomes_stoneoak_tree_top.png", + "ebiomes_stoneoak_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:stoneoak_wood", { + description = S("Stone Oak Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_stoneoak_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:stoneoak_wood 4", + recipe = { + {"ebiomes:stoneoak_tree"}, + } + }) + + core.register_node("ebiomes:stoneoak_leaves", { + description = S("Stone Oak Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_stoneoak_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:stoneoak_sapling"}, rarity = 20}, + {items = {"ebiomes:stoneoak_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:stoneoak_tree"}, + leaves = {"ebiomes:stoneoak_leaves"}, + radius = 3, + }) + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_stoneoak_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_stoneoak_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_stoneoak.mts" + + core.register_node("ebiomes:stoneoak_sapling", { + description = S("Stone Oak Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_stoneoak_sapling.png"}, + inventory_image = "ebiomes_stoneoak_sapling.png", + wield_image = "ebiomes_stoneoak_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_stoneoak_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:stoneoak_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 11, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("light_mapgen", true) then + + core.register_decoration({ + name = "ebiomes:stoneoak_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 1203, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_stoneoak_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + + +else + + core.register_decoration({ + name = "ebiomes:stoneoak_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.012, + scale = 0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 1203, + octaves = 3, + persist = 0.66 + }, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_stoneoak_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random" + }) + +end + + core.register_decoration({ + name = "ebiomes:stoneoak_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_stoneoak_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:stoneoak_sapling", grow_new_stoneoak_tree, "soil"}, +}) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("stoneoak_wood", "ebiomes:stoneoak_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_stoneoak_wood.png"}, + S("Stone Oak Wood Stair"), + S("Stone Oak Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Stone Oak Wood Stair"), + S("Outer Stone Oak Wood Stair") + ) + + default.register_fence("ebiomes:fence_stoneoak_wood", { + description = S("Stone Oak Wood Fence"), + texture = "ebiomes_fence_stoneoak_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_stoneoak_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_stoneoak_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:stoneoak_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_stoneoak_wood", { + description = S("Stone Oak Wood Fence Rail"), + texture = "ebiomes_fence_rail_stoneoak_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_stoneoak_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_stoneoak_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:stoneoak_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_stoneoak_wood", { + description = S("Stone Oak Wood Mese Post Light"), + texture = "ebiomes_fence_stoneoak_wood.png", + material = "ebiomes:stoneoak_wood", + }) + + doors.register_fencegate("ebiomes:gate_stoneoak_wood", { + description = S("Stone Oak Wood Fence Gate"), + texture = "ebiomes_stoneoak_wood.png", + material = "ebiomes:stoneoak_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_stoneoak_wood_closed", + burntime = 9, + }) + +for length = 1, 3 do + core.register_decoration({ + name = "ebiomes:fernjp_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "default:fern_"..length, + }) +end + +--[[ + core.register_decoration({ + name = "ebiomes:junglegrass_jrf", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "default:junglegrass", + }) +--]] + + core.register_node("ebiomes:forestgrowth", { + description = S("Forest Growth"), + drawtype = "plantlike", + waving = 1, + visual_scale = 1.2, + tiles = {"ebiomes_forestgrowth.png"}, + inventory_image = "ebiomes_forestgrowth.png", + wield_image = "ebiomes_forestgrowth.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + }, + }) + + + core.register_decoration({ + name = "ebiomes:forestgrowth", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_japanese_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"japanese_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:forestgrowth", + }) + + core.register_craft({ + output = "default:stick", + recipe = { + {"ebiomes:forestgrowth", "ebiomes:forestgrowth"}, + {"ebiomes:forestgrowth", "ebiomes:forestgrowth"} + } + }) + +--Other mods + +--Misc + +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("sugi_tree", "wood", "ebiomes:sugi_wood", { + description = "Sugi Wood", + tiles = {"ebiomes_sugi_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("mizunara_tree", "wood", "ebiomes:mizunara_wood", { + description = "Mizunara Wood", + tiles = {"ebiomes_mizunara_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("stoneoak_tree", "wood", "ebiomes:stoneoak_wood", { + description = "Stone Oak Wood", + tiles = {"ebiomes_stoneoak_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:sugi_sapling") + flowerpot.register_node("ebiomes:mizunara_sapling") + flowerpot.register_node("ebiomes:stoneoak_sapling") + +end + +--Ground stuff +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_deco({ + {"ebiomes:dirt_with_japanese_rainforest_litter", {"default:fern_1", "default:fern_2", "default:fern_3"}, + {"ebiomes:forestgrowth", "ebiomes:moss"} } + }) + +end diff --git a/mods/ebiomes/jsavanna.lua b/mods/ebiomes/jsavanna.lua new file mode 100644 index 0000000..5f09f9a --- /dev/null +++ b/mods/ebiomes/jsavanna.lua @@ -0,0 +1,412 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +-- Jungle Savanna + +core.register_alias("dirt_jungle_savanna_grass", "ebiomes:dirt_with_jungle_savanna_grass") +core.register_alias("dirt_jungle_savanna_grass_footsteps", "ebiomes:dirt_with_jungle_savanna_grass_footsteps") + + core.register_node("ebiomes:dirt_with_jungle_savanna_grass", { + description = S("Dirt with Jungle Savanna Grass"), + tiles = {"ebiomes_jungle_savanna_grass.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_jungle_savanna_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_jungle_savanna_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_jungle_savanna_grass_footsteps", { + description = S("Dirt with Jungle Savanna Grass and Footsteps"), + tiles = {"ebiomes_jungle_savanna_grass.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_jungle_savanna_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_jungle_savanna_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + + + + + + + + + +if core.settings:get_bool("reg_hsavanna", true) then + + core.register_biome({ + name = "jungle_savanna", + node_top = "ebiomes:dirt_with_jungle_savanna_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 87, + humidity_point = 62, + }) + + core.register_biome({ + name = "jungle_savanna_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 87, + humidity_point = 62, + }) + + core.register_biome({ + name = "jungle_savanna_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 87, + humidity_point = 62, + }) + + core.register_biome({ + name = "jungle_savanna_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 87, + humidity_point = 62, + }) + +-- Coral + + core.register_decoration({ + name = "ebiomes:coral_jsv", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = {x = 50, y = 50, z = 50}, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { + "jungle_savanna_ocean", + }, + y_max = -2, + y_min = -8, + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton", + }, + }) + + +-- Grass + + core.register_node("ebiomes:jungle_savanna_grass_1", { + description = S("Jungle Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_jungle_savanna_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_jungle_savanna_grass_3.png", + wield_image = "ebiomes_jungle_savanna_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:jungle_savanna_grass_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:jungle_savanna_grass_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:jungle_savanna_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:jungle_savanna_grass_" .. i, { + description = S("Jungle Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_jungle_savanna_grass_" .. i .. ".png"}, + inventory_image = "ebiomes_jungle_savanna_grass_" .. i .. ".png", + wield_image = "ebiomes_jungle_savanna_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:jungle_savanna_grass_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:jungle_savanna_grass_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_decoration({ + name = "ebiomes:junglegrass_jsv", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 1, + decoration = "default:junglegrass", + }) + + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:jungle_savanna_grass_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:jungle_savanna_grass_"..length, + }) +end + + +--Trees + + core.register_decoration({ + name = "ebiomes:afzelia_tree_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 201, + octaves = 3, + persist = 0.66 + }, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_afzelia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:afzelia_log_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.001, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_afzelia_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:limba_tree_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 202, + octaves = 3, + persist = 0.66 + }, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_limba_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:limba_tree_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 202, + octaves = 3, + persist = 0.66 + }, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_limba_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:limba_log_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0025, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_limba_log.mts", + flags = "place_center_x", + rotation = "random" + }) + + core.register_decoration({ + name = "ebiomes:tamarind_tree_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 204, + octaves = 3, + persist = 0.66 + }, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_tamarind_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:tamarind_log_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_tamarind_log.mts", + flags = "place_center_x", + rotation = "random" + }) + + + + + core.register_decoration({ + name = "ebiomes:jungle_tree_jsv", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_jungle_savanna_grass"}, + sidelen = 80, + fill_ratio = 0.03, + biomes = {"jungle_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +end + +--Additionals + +--Ground stuff +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_deco({ + {"ebiomes:dirt_with_jungle_savanna_grass", {"ebiomes:jungle_savanna_grass_1", "ebiomes:jungle_savanna_grass_2", "ebiomes:jungle_savanna_grass_3", "ebiomes:jungle_savanna_grass_4", "ebiomes:jungle_savanna_grass_5"}, + {"default:junglegrass"} } + }) + +end diff --git a/mods/ebiomes/license.txt b/mods/ebiomes/license.txt new file mode 100644 index 0000000..bb5d5b3 --- /dev/null +++ b/mods/ebiomes/license.txt @@ -0,0 +1,160 @@ +########Code######## + +Copyright (C) 2021-2026: CowboyLv - GPLv3 (GNU GENERAL PUBLIC LICENSE) + +runs - cool_trees, swaz (code used as a template for sapling functions) +License: GPLv3 + +TenPlus1 - pigiron (code used for templating stairs) +The MIT License (MIT) +Copyright (c) 2018 TenPlus1 +TenPlus1 - ethereal +The MIT License (MIT) +Copyright (c) 2016 TenPlus1 + +Contributors + +Adikalon - https://github.com/adikalon + + +#######Assets######## +Minetest Game derrivatives(Non-derrivatives listed further) +License +-------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2021-2024: CowboyLv + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +---------------------------------------------------- + +##Original textures## + +List(without mod prefix) + +Altai tulip, blackcurrant_bush_sapling, black_iris, blue_allium, blue_allium_puple, buttercup_persian, chestnut_leaves, chestnuts, chestnut_sapling, +chestnuts_peeled, chestnuts_roasted, cypress_sapling, cladanthus, cowberry_bush_sapling, cowberry_overlay, cranberries, cranberry_patch, dried_quince_pieces, +gooseberry_bush_sapling, gooseberry_overlay, larkspur sundew, marsh_marigold, mountain_lily, olives, pear, peashrub_leaves, peashrub_overlay, quince, +redcurrant_bush_sapling, russian_iris, savory, siberian_lily, staehelina, sundew, thorn_bush_leaves, reeds, peat, peat_wet, peat_dry, marsh_grass_green, marsh_grass_yellow, swamp_moss_green, swamp_moss_yellow, willow_leaves, burning_peat, afzelia_sapling, bamboo, bamboo_leaves, bamboo_sprout, forestgrowth, jaragua_grass, limba_sapling, mizunara_sapling, siri_sapling, stoneoak_sapling, tamarind_pods_hanging, tamarind_pods, tamarind_pulp, tamarind_sapling, moss, moss_clump, maple_leaves, oak_leaves, acorns_hanging, acorns, acorns_cooked + +License +------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2021-2024: CowboyLv + +You are free to: +Share — copy and redistribute the material in any medium or format +Adapt — remix, transform, and build upon the material +for any purpose, even commercially. + +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. + +No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. + + + +########Credits######## + + +Asset developers for minetest game + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2018: + + celeron55, Perttu Ahola + Cisoun + G4JC + VanessaE + RealBadAngel + Calinou + MirceaKitsune + Jordach + PilzAdam + jojoa1997 + InfinityProject + Splizard + Zeg9 + paramat + BlockMen + sofar + Neuromancer + Gambit + asl97 + KevDoy + Mito551 + GreenXenith + kaeza + kilbith + tobyplowy + CloudyProton + TumeniNodes + Mossmanikin + random-geek + Extex101 + An0n3m0us + + +Attribution 3.0 Unported (CC BY 3.0) + +Copyright (C) 2009 cmusounddesign +Copyright (C) 2010 Tomlija +Copyright (C) 2010 lsprice +Copyright (C) 2014 sonictechtonic +Copyright (C) 2015 yadronoff +Copyright (C) 2007 HerbertBoland +Copyright (C) 2006 AGFX + + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + +Iwan Gabovitch +Ottomaani138 +Ogrebane +blukotek +Sevin7 +Yoyodaman234 +Ryding + +########Special thanks######## + +TenPlus1 - for the multitude of optional mods +LMD, rubenwardy and sfan5 - for being helpful, rubenwardy also for the modding handbook +runs - for simple and understandable code I could learn from +Nathan Salapat - for the tutorials +axcore - for notifying me to fix warning messages +Skivling - for notifying about the lack of dyes and for making a mod to adress the issue before the 1.5 release diff --git a/mods/ebiomes/locale/ebiomes.lv.tr b/mods/ebiomes/locale/ebiomes.lv.tr new file mode 100644 index 0000000..342b4f9 --- /dev/null +++ b/mods/ebiomes/locale/ebiomes.lv.tr @@ -0,0 +1,395 @@ +# textdomain: ebiomes + +Dry Dirt with Arid Grass=Sausa zeme ar sausu zāli +Dry Dirt with Arid Grass and Footsteps=Pēdaina sausa zeme ar sausu zāli +Arid Grass=Sausa zāle +Dry Dirt with Cool Arid Grass=Sausa zeme ar vēsu sausu zāli +Dry Dirt with Cool Arid Grass and Footsteps=Pēdaina sausa zeme ar vēsu sausu zāli +Cool Arid Grass=Vēsa sausa zāle +Hardy Bush Stem=Sīksta krūma stumbrājs +Hardy Bush Leaves=Sīksta krūma lapas +Hardy Bush Sapling=Sīksta krūma dzinums +Thorn Bush Leaves=Ērkšķu krūma lapas +Thorn Bush Sapling=Ērkšķu koka dzinums +Bamboo=Bambuss +Bamboo Leaves=Bambusa lapas +Bamboo Sprout=Bambusa dīgsts +Dirt with Cold Grass=Zeme ar aukstu zāli +Dirt with Cold Grass and Footsteps=Pēdaina zeme ar akstu zāli +Cold Grass=Auksta zāle +Dirt with Swamp Grass=Zeme ar purva zāli +Dirt with Swamp Grass and Footsteps=Pēdaina zeme ar purva zāli +Swamp Grass=Purva zāle +Swamp Water Source=Purva ūdens avots +Swamp Water=Purva ūdens +Peat=Kūdra +Peat with Yellow Swamp Moss=Kūdra ar dzeltenām sūnām +Peat with Yellow Swamp Moss and Footsteps=Pēdaina kūdra ar dzeltenām sūnām +Dry Peat=Sausa kūdra +Wet Peat=Slapja kūdra +Wet Peat with Green Swamp Moss=Slapja kūdra ar zaļām sūnām +Wet Peat with Green Swamp Moss and Footsteps=Pēdaina slapja kūdra ar zaļām sūnām +Dry Peat Stair=Sausas kūdras pakāpiens +Dry Peat Slab=Sausas kūdras šķēle +Burning Peat=Kurināmā kūdra +Reeds=Niedres +Green Marsh Grass=Zaļa mitrāja zāle +Yellow Marsh Grass=Dzeltena mitrāja zāle +Bog Grass=Muklāja zāle +Blackcurants=Upenes +Blackcurrant Bush Leaves with Berries=Upeņu krūms ar ogām +Blackcurrant Bush Leaves=Upeņu krūms +Blackcurrant Bush Sapling=Upenes dzinums +Redcurants=Jāņogas +Redcurrant Bush Leaves with Berries=Jāņogu krūms ar ogām +Redcurrant Bush Leaves=Jāņogu krūms +Redcurrant Bush Sapling=Jāņogas dzinums +Gooseberries=Ērkšķogas +Gooseberry Bush Leaves with Berries=Ērkšķogu krūms ar ogām +Gooseberry Bush Leaves=Ērkšķogu krūms +Gooseberry Bush Sapling=Ērkšķogu dzinums +Cranberry Patch=Dzērvene +Cranberries=Dzērveņogas +Sundew=Rasene +Marsh Marigold=Purene +Marsh Stitchwort=Purva virza +Willow Tree=Vītols +Willow Wood Planks=Vītolkoka dēļi +Willow Tree Leaves=Vītola lapas +Willow Tree Sapling=Vītola asns +Willow Wood Stair=Vītolkoka pakāpiens +Willow Wood Slab=Vītolkoka plātne +Willow Wood Fence=Vītolkoka žogs +Willow Wood Fence Rail=Vītolkoka žoga margas +Willow Wood Mese Post Light=Vītolkoka mēzes lampa +Willow Wood Fence Gate=Vītolkoka žoga vārti +Alder Tree=Alksnis +Alder Wood Planks=Alkšņa dēļi +Alder Tree Leaves=Alkšņa lapas +Alder Tree Sapling=Alkšņa dzinums +Alder Wood Stair=Alkšņa pakāpies +Alder Wood Slab=Alkšņa plātne +Alder Wood Fence=Alkšņa žogs +Alder Wood Fence Rail=Alkšņa žoga margas +Alder Wood Mese Post Light=Alkšņa mēzes lampa +Alder Wood Fence Gate=Alkšņa žoga vārti +Ash Tree=Osis +Ash Wood Planks=Oškoka dēļi +Ash Tree Leaves=Oša lapas +Ash Tree Sapling=Oša dzinums +Ash Wood Stair=Oškoka pakāpiens +Ash Wood Slab=Oškoka plātne +Ash Wood Fence=Oškoka žogs +Ash Wood Fence Rail=Oškoka žoga margas +Ash Wood Mese Post Light=Oškoka mēzes lampa +Ash Wood Fence Gate=Oškoka žoga vārti +Birch Tree=Bērzs +Birch Wood Planks=Bērzkoka dēļi +Birch Tree Leaves=Bērza lapas +Birch Tree Sapling=Bērza dzinums +Birch Wood Stair=Bērzkoka pakāpiens +Birch Wood Slab=Bērzkoka plātne +Birch Wood Fence=Bērzkoka žogs +Birch Wood Fence Rail=Bērzkoka žoga margas +Birch Wood Mese Post Light=Bērzkoka mēzes lampa +Birch Wood Fence Gate=Bērzkoka žoga vārti +Downy Birch Tree=Purva bērzs +Downy Birch Wood Planks=Purva bērza dēļi +Downy Birch Tree Leaves=Purva bērza lapas +Downy Birch Tree Sapling=Purva bērza dzinums +Downy Birch Wood Stair=Purva bērza pakāpiens +Downy Birch Wood Slab=Purva bērza plātne +Downy Birch Wood Fence=Purva bērza žogs +Downy Birch Wood Fence Rail=Purva bērza žoga lapas +Downy Birch Wood Mese Post Light=Purva bērza mēzes lampa +Downy Birch Wood Fence Gate=Purva bērza žoga vārti +Cowberries=Brūklenes +Cowberry Bush Leaves with Berries=Brūkleņu krūms ar ogām +Cowberry Bush Leaves=Brūkleņu krūms +Cowberry Bush Sapling=Brūkleņu krūma dzinums +Oak Tree=Ozols +Oak Wood Planks=Ozlokoka dēļi +Oak Tree Leaves=Ozola lapas +Oak Tree Sapling=Ozola dzinums +Oak Wood Stair=Ozolkoka pakāpiens +Oak Wood Slab=Ozolkoka plātne +Oak Wood Fence=Ozolkoka žogs +Oak Wood Fence Rail=Ozolkoka margas +Oak Wood Mese Post Light=Ozolkoka mēzes lampa +Oak Wood Fence Gate=Ozolkoka žoga vārti +Acorns=Ozolzīles +Acorns Marker=Ozolzīļu marķieris +Cooked Acorns=Vārītas ozolzīles +Bucket of Acorns=Spainis ar ozolzīlēm +Maple Tree=Kļava +Maple Wood Planks=Kļavaskoka dēli +Maple Tree Leaves=Kļavas lapas +Maple Tree Sapling=Kļavas dzinums +Maple Wood Stair=Kļavaskoka pakāpiens +Maple Wood Slab=Kļavaskoka plātne +Maple Wood Fence=Kļavaskoka žogs +Maple Wood Fence Rail=Kļavaskoka žoga margas +Maple Wood Mese Post Light=Kļavaskoka mēzes lampa +Maple Wood Fence Gate=Kļavaskoka žoga vārti +Desert Sand with Debris=Tuksneša smiltis ar sanešiem +Sand with Debris=Smiltis ar sanešiem +Silver Sand with Debris=Baltās smiltis ar sanešiem +Dirt with Japanese Rainforest Litter=Zeme ar Japānas lietusmeža zemsegu +Dirt with Japanese Rainforest Litter and Footsteps=Pēdaina zeme ar Japānas lietusmeža zemsegu +Moss=Sūnas +Sugi Tree=Japānas kriptomērija +Sugi Wood Planks=Kriptomērijas koka dēļi +Sugi Tree Leaves=Japānas kriptomriējas lapas +Sugi Tree Sapling=Japānas kriptomērijas dzinums +Sugi Wood Stair=Kriptomērijas koka pakapiens +Sugi Wood Slab=Kriptomērijas koka plātne +Sugi Wood Fence=Kriptomērijas koka žogs +Sugi Wood Fence Rail=Kriptomērijas koka žoga margas +Sugi Wood Mese Post Light=Kriptomērijas koka mēzes lampa +Sugi Wood Fence Gate=Kriptomērijas koka žoga vārti +Mizunara Tree=Mizunara +Mizunara Wood Planks=Mizunaras koka dēļi +Mizunara Tree Leaves=Mizunaras lapas +Mizunara Tree Sapling=Mizunaras dzinums +Mizunara Wood Stair=Mizunaras koka pakāpiens +Mizunara Wood Slab=Mizunaras koka plātne +Mizunara Wood Fence=Mizunaras koka žogs +Mizunara Wood Fence Rail=Mizunaras koka žoga margas +Mizunara Wood Mese Post Light=Mizunaras koka mēzes lampa +Mizunara Wood Fence Gate=Mizunaras koka žoga vārti +Stone Oak Tree=Akmeņozols +Stone Oak Wood Planks=Akmeņozola dēļi +Stone Oak Tree Leaves=Akmeņozola lapas +Stone Oak Tree Sapling=Akmeņozola dzinums +Stone Oak Wood Stair=Akmeņozola pakāpiens +Stone Oak Wood Slab=Akmeņozola plātne +Stone Oak Wood Fence=Akmeņozola žogs +Stone Oak Wood Fence Rail=Akmeņozola margas +Stone Oak Wood Mese Post Light=Akmeņozola mēzes lampa +Stone Oak Wood Fence Gate=Akmeņozola žoga vārti +Forest Growth=Meža augājs +Dirt with Jungle Savanna Grass=Zeme ar džungļu savannas zāli +Dirt with Jungle Savanna Grass and Footsteps=Pēdaina zeme ar džungļu savannas zāli +Jungle Savanna Grass=Džungļu savannas zāle +Dirt with Mediterranean Grass=Zeme ar Vidusjūras zāli +Dirt with Mediterranean Grass and Footsteps=Pēdaina zeme ar Vidusjūras zāli +Mediterranean Grass=Vidusjūras zāle +Black Iris=Melnais īriss +Cladanthus=Marokas kumele +Savory=Kalnumētra +Staehelina=Kņada +Persian Buttercup=Persijas purene +Yellow Chrysanthemum=Dzeltena krizantēma +Warm Biome Bush Stem=Silto zemju krūma stumbrājs +Warm Biome Bush Leaves=Silto zemju krūma lapas +Warm Biome Bush Sapling=Silto zemju krūma dzinums +Cypress Tree=Ciprese +Cypress Wood Planks=Cipreses koka dēļi +Cypress Tree Leaves=Cipreses koka lapas +Cypress Tree Sapling=Cipreses dzinums +Cypress Wood Stair=Cipreses koka pakāpiens +Cypress Wood Slab=Cipreses koka plātne +Cypress Wood Fence=Cipreses koka žogs +Cypress Wood Fence Rail=Cipreses koka žoga margas +Cypress Wood Mese Post Light=Cipreses mēzes lampa +Cypress Wood Fence Gate=Cipreses žoga vārti +Olive Tree=Olīvkoks +Olive Wood Planks=Olīvkoka dēļi +Olive Tree Leaves=Olīvas lapas +Olives=Olīvas +Olive Marker=Olīvu marķieris +Olive Tree Sapling=Olīvas dzinums +Olive Wood Stair=Olīvkoka pakāpiens +Olive Wood Slab=Olīvkoka plātne +Olive Wood Fence=Olīvkoka žogs +Olive Wood Fence Rail=Olīvkoka margas +Olive Wood Mese Post Light=Olīvkoka mēzes lampa +Olive Wood Fence Gate=Olīvkoka žoga vārti +Dry Dirt with Humid Savanna Grass=Sausa zeme ar mitras savannas zāli +Dry Dirt with Humid Savanna Grass and Footsteps=Pēdaina sausa zeme ar mitras savannas zāli +Humid Savanna Grass=Mitras savannas zāle +Jaragua Grass=Milzu salmu zāle +Afzelia Tree=Afcēlija +Afzelia Wood Planks=Afcēlijas koka dēļi +Afzelia Tree Leaves=Afcēlijas lapas +Afzelia Tree Sapling=Afcēlijas dzinums +Afzelia Wood Stair=Afcēlijas koka pakāpiens +Afzelia Wood Slab=Afcēlijas koka plātne +Afzelia Wood Fence=Afcēlijas koka žogs +Afzelia Wood Fence Rail=Afcēlijas koka žoga margas +Afzelia Wood Mese Post Light=Afcēlijas koka mēzes lampa +Afzelia Wood Fence Gate=Afcēlijas koka žoga vārti +Limba Tree=Limba +Limba Wood Planks=Limbas koka dēļi +Limba Tree Leaves=Limbas lapas +Limba Tree Sapling=Limbas dzinums +Limba Wood Stair=Limbas koka pakāpiens +Limba Wood Slab=Limbas koka plātne +Limba Wood Fence=Limbas koka žogs +Limba Wood Fence Rail=Limbas koka žoga margas +Limba Wood Mese Post Light=Limbas koka mēzes lampa +Limba Wood Fence Gate=Limbas koks žoga vārti +Black Limba Wood Planks=Melnā limbas koka dēļi +Black Limba Wood Stair=Melnā limbas koka pakāpiens +Black Limba Wood Slab=Melnā limbas koka plātne +Black Limba Wood Fence=Melnā limbas koka žogs +Black Limba Wood Fence Rail=Melnā limbas koka žoga margas +Black Limba Wood Mese Post Light=Melnā limbas koka mēzes lampa +Black Limba Wood Fence Gate=Melnā limbas koka žoga vārti +Siri Tree=Siri koks +Siri Wood Planks=Siri koka dēļi +Siri Tree Leaves=Siri koka lapas +Siri Tree Sapling=Siri koka dzinums +Siri Wood Stair=Siri koka pakāpiens +Siri Wood Slab=Siri koka plātne +Siri Wood Fence=Siri koka žogs +Siri Wood Fence Rail=Siri koka žoga margas +Siri Wood Mese Post Light=Siri koka mēzes lampa +Siri Wood Fence Gate=Siri koka žoga vārti +Tamarind Tree=Tamarinda koks +Tamarind Wood Planks=Tamarinda koka dēļi +Tamarind Tree Leaves=Tamarinda koka lapas +Hanging Tamarind Pods=Karājošas tamarinda pākstis +Hanging Tamarind Pod Marker=Kārājošu tamarinda pākstu marķieris +Tamarind Pods=Tamarinda pākstis +Tamarind Pulp=Tamarinda mīkstuma masa +Tamarind Tree Sapling=Tamarinda dzinums +Tamarind Wood Stair=Tamarinda koka pakāpiens +Tamarind Wood Slab=Tamarinda koka plātne +Tamarind Wood Fence=Tamarinda koka žogs +Tamarind Wood Fence Rail=Tamarinda koka žoga margas +Tamarind Wood Mese Post Light=Tamarinda mēzes lampa +Tamarind Wood Fence Gate=Tamarinda koka žoga vārti +Dirt with Steppe Grass=Zeme ar stepes zāli +Dirt with Steppe Grass and Footsteps=Pēdaina zeme ar stepes zāli +Steppe Grass=Stepes zāle +Dirt with Warm Steppe Grass=Zeme ar siltas stepes zāli +Dirt with Warm Steppe Grass and Footsteps=Pēdaina zeme ar siltas stepes zāli +Warm Steppe Grass=Siltas stepes zāle +Dirt with Cold Steppe Grass=Zeme ar aukstas stepes zāli +Dirt with Cold Steppe Grass and Footsteps=Pēdaina zeme ar aukstas stepes zāli +Cold Steppe Grass=Aukstas stepes zāle +Blue Allium=Zilais sīpols +Purple Blue Allium=Violets zilais sīpols +Altai Tulip=Altaju tulpe +Russian Iris=Krievu īriss +Siberian Lily=Sibīrijas lilija +Mountain Lily=Kalnu lilija +Peashrub Peas=Karagānas zirņi +Cooked Peas=Vārīti zirņi +Bucket of Peas=Spainis ar zirņiem +Peashrub Bush Leaves with Peas=Karagānas lapotne ar zirņiem +Peashrub Leaves=Karagānas lapas +Peashrub Sapling=Karagānas dzinums +Dirt with Forest Litter=Zeme ar meža zemsedzi +Dirt with Forest Litter and Footsteps=Pēdaina zeme ar meža zemsedzi +Beech Tree=Dižskābardis +Beech Wood Planks=Dižskābarža dēļi +Beech Tree Leaves=Dižskābarža lapas +Beech Tree Sapling=Dižskābarža dzinums +Beech Wood Stair=Dižskābarža pakāpiens +Beech Wood Slab=Dižskābarža plātne +Beech Wood Fence=Dižskābarža žogs +Beech Wood Fence Rail=Dižskābarža žoga margas +Beech Wood Mese Post Light=Dižskābarža mēzes lampa +Beech Wood Fence Gate=Dižskābarža žoga vārti +Dirt with Warm Grass=Zeme ar siltu zāli +Dirt with Warm Grass and Footsteps=Pēdaina zeme ar siltu zāli +Warm Grass=Silta zāle +Larkspur=Gaiļpiesis +Pear Tree=Bumbiere +Pear Wood Planks=Bumbierkoka dēļi +Pear Tree Leaves=Bumbieres lapas +Pear Tree Sapling=Bumbieres dzinums +Pear Wood Stair=Bumbierkoka pakāpiens +Pear Wood Slab=Bumbierkoka plātne +Pear Wood Fence=Bumbierkoka žogs +Pear Wood Fence Rail=Bumbierkoka žoga margas +Pear Wood Mese Post Light=Bumbierkoka mēzes lampa +Pear Wood Fence Gate=Bumbierkoka žoga vārti +Pear=Bumbieris +Pear Marker=Bumbiera marķieris +Quince Tree=Cidonija +Quince Wood Planks=Cidonijas koka dēļi +Quince Tree Leaves=Cidonijas lapas +Quince Tree Sapling=Cidonijas dzinums +Quince Wood Stair=Cidonijas koka pakāpiens +Quince Wood Slab=Cidonijas koka plātne +Quince Wood Fence=Cidonijas koka žogs +Quince Wood Fence Rail=Cidonijas koka žoga margas +Quince Wood Mese Post Light=Cidonijas koka mēzes lampa +Quince Wood Fence Gate=Cidonijas koka žoga vārti +Quince=Cidonija +Quince Marker=Cidonijas marķieris +Dried Quince Pieces=Žāvētas cidonijas +Chestnut Tree=Kastanis +Chestnut Wood Planks=Kastaņkoka dēļi +Chestnut Tree Leaves=Kastaņa lapas +Chestnut Tree Sapling=Kastaņa dzinums +Chestnut Wood Stair=Kastaņkoka pakāpiens +Chestnut Wood Slab=Kastaņkoka plātne +Chestnut Wood Fence=Kastaņkoka žogs +Chestnut Wood Fence Rail=Kastaņkoka žoga margas +Chestnut Wood Mese Post Light=Kastaņkoka mēzes lampa +Chestnut Wood Fence Gate=Kastaņkoka žoga vārti +Chestnuts=Kastaņi +Chestnut Marker=Kastaņu marķieris +Peeled Chestnuts=Nomizoti kastaņi +Roasted Chestnuts=Apcepti kastaņi +Hornbeam Tree=Skābardis +Hornbeam Wood Planks=Skābarža dēļi +Hornbeam Tree Leaves=Skābarža lapas +Hornbeam Tree Sapling=Skābarža dzinums +Hornbeam Wood Stair=Skābarža pakāpiens +Hornbeam Wood Slab=Skābarža plātne +Hornbeam Wood Fence=Sābarža žogs +Hornbeam Wood Fence Rail=Skābarža žoga margas +Hornbeam Wood Mese Post Light=Skābarža mēzes lampa +Hornbeam Wood Fence Gate=Skābarža žoga vārti +Swamp Water Bucket=Spainis ar purva ūdeni +Inner Dry Peat Stair=Iekšējs sausas kūdras pakāpiens +Outer Dry Peat Stair=Ārējs sausas kūdras pakāpiens +Inner Willow Wood Stair=Iekšējs vītolkoka pakāpiens +Outer Willow Wood Stair=Ārējs vītolkoka pakāpiens +Inner Alder Wood Stair=Iekšējs alkšņa pakāpiens +Outer Alder Wood Stair=Ārējs alkšņa pakāpiens +Inner Ash Wood Stair=Iekšējs oškoka pakāpiens +Outer Ash Wood Stair=Ārējs oškoka pakāpiens +Inner Birch Wood Stair=Iekšējs bērzkoka pakāpiens +Outer Birch Wood Stair=Ārējs bērzkoka pakāpiens +Inner Downy Birch Wood Stair=Iekšējs purva bērza pakāpiens +Outer Downy Birch Wood Stair=Ārējs purva bērza pakāpiens +Inner Oak Wood Stair=Iekšējs ozolkoka pakāpiens +Outer Oak Wood Stair=Ārējs ozolkoka pakāpiens +Inner Maple Wood Stair=Iekšējs kļavaskoka pakāpiens +Outer Maple Wood Stair=Ārējs kļavaskoka pakāpiens +Inner Sugi Wood Stair=Iekšējs kriptomērijas pakāpiens +Outer Sugi Wood Stair=Ārējs kriptomērijas pakāpiens +Inner Mizunara Wood Stair=Iekšējs mizunaras pakāpiens +Outer Mizunara Wood Stair=Ārējs mizunaras pakāpiens +Inner Stone Oak Wood Stair=Iekšējs akmeņozola pakāpiens +Outer Stone Oak Wood Stair=Ārējs akmeņozola pakāpiens +Inner Cypress Wood Stair=Iekšējs cipreses koka pakāpiens +Outer Cypress Wood Stair=Ārējs cipreses koka pakāpiens +Inner Olive Wood Stair=Iekšējs olīvas koka pakāpiens +Outer Olive Wood Stair=Ārējs olīvas koka pakāpiens +Inner Afzelia Wood Stair=Iekšējs afcēlijas koka pakāpiens +Outer Afzelia Wood Stair=Ārējs afcēlijas koka pakāpiens +Inner Limba Wood Stair=Iekšējs limbas koka pakāpiens +Outer Limba Wood Stair=Ārējs limbas koka pakāpiens +Inner Black Limba Wood Stair=Iekšējs melnā limbas koka pakāpiens +Outer Black Limba Wood Stair=Ārējs melnā limbas koka pakāpiens +Inner Siri Wood Stair=Iekšējs siri koka pakāpiens +Outer Siri Wood Stair=Ārējs siri koka pakāpiens +Inner Tamarind Wood Stair=Iekšējs tamarinda koka pakāpiens +Outer Tamarind Wood Stair=Ārējs tamarinda koka pakāpiens +Inner Beech Wood Stair=Iekšējs dižskābarža pakāpiens +Outer Beech Wood Stair=Ārējas dižkābarža pakāpiens +Inner Pear Wood Stair=Iekšējs bumbierkoka pakāpiens +Outer Pear Wood Stair=Ārējs bumbierkoka pakāpiens +Inner Quince Wood Stair=Iekšējs cidonijas koka pakāpiens +Outer Quince Wood Stair=Ārējs cidonijas koka pakāpiens +Inner Chestnut Wood Stair=Iekšējs kastaņkoka pakāpiens +Outer Chestnut Wood Stair=Ārējs kastaņkoka pakāpiens +Inner Hornbeam Wood Stair=Iekšējs kastaņkoka pakāpiens +Outer Hornbeam Wood Stair=Ārējs kastaņkoka pakāpiens diff --git a/mods/ebiomes/locale/ebiomes.ru.tr b/mods/ebiomes/locale/ebiomes.ru.tr new file mode 100644 index 0000000..e0fe3e8 --- /dev/null +++ b/mods/ebiomes/locale/ebiomes.ru.tr @@ -0,0 +1,395 @@ +# textdomain: ebiomes + +Dry Dirt with Arid Grass=Сухая земля с засушливой травой +Dry Dirt with Arid Grass and Footsteps=Сухая земля с засушливой травой и следами ног +Arid Grass=Сухая трава +Dry Dirt with Cool Arid Grass=Сухая земля с прохладной засушливой травой +Dry Dirt with Cool Arid Grass and Footsteps=Сухая земля с прохладной засушливой травой и следами ног +Cool Arid Grass=Холодная засушливая трава +Hardy Bush Stem=Стебель выносливого кустарника +Hardy Bush Leaves=Листья выносливого кустарника +Hardy Bush Sapling=Саженец выносливого кустарника +Thorn Bush Leaves=Листья тернового куста +Thorn Bush Sapling=Саженец тернового куста +Bamboo=Бамбук +Bamboo Leaves=Листья бамбука +Bamboo Sprout=Росток бамбука +Dirt with Cold Grass=Земля с холодной травой +Dirt with Cold Grass and Footsteps=Земля с холодной травой и следами ног +Cold Grass=Холодная трава +Dirt with Swamp Grass=Земля с болотной травой +Dirt with Swamp Grass and Footsteps=Земля с болотной травой и следами ног +Swamp Grass=Болотная трава +Swamp Water Source=Источник болотной воды +Swamp Water=Болотная вода +Peat=Торф +Peat with Yellow Swamp Moss=Торф с желтым болотным мхом +Peat with Yellow Swamp Moss and Footsteps=Торф с желтым болотным мхом и следами ног +Dry Peat=Сухой торф +Wet Peat=Влажный торф +Wet Peat with Green Swamp Moss=Влажный торф с зеленым болотным мхом +Wet Peat with Green Swamp Moss and Footsteps=Влажный торф с зеленым болотным мхом и следами ног +Dry Peat Stair=Лестница из сухого торфа +Dry Peat Slab=Плита из сухого торфа +Burning Peat=Горящий торф +Reeds=Камыш +Green Marsh Grass=Зеленая болотная трава +Yellow Marsh Grass=Желтая болотная трава +Bog Grass=Болотная трава на болотах +Blackcurants=Черная смородина +Blackcurrant Bush Leaves with Berries=Листья куста черной смородины с ягодами +Blackcurrant Bush Leaves=Листья куста черной смородины +Blackcurrant Bush Sapling=Саженец куста черной смородины +Redcurants=Красная смородина +Redcurrant Bush Leaves with Berries=Листья куста красной смородины с ягодами +Redcurrant Bush Leaves=Листья куста красной смородины +Redcurrant Bush Sapling=Саженец куста красной смородины +Gooseberries=Крыжовник +Gooseberry Bush Leaves with Berries=Листья куста крыжовника с ягодами +Gooseberry Bush Leaves=Листья куста крыжовника +Gooseberry Bush Sapling=Саженец куста крыжовника +Cranberry Patch=Брусничная грядка +Cranberries=Клюква +Sundew=Росянка +Marsh Marigold=Ноготки болотные +Marsh Stitchwort=Лапчатка болотная +Willow Tree=Ива +Willow Wood Planks=Доски из ивы +Willow Tree Leaves=Листья ивы +Willow Tree Sapling=Саженец ивы +Willow Wood Stair=Лестница из ивы +Willow Wood Slab=Плита из ивы +Willow Wood Fence=Забор из ивы +Willow Wood Fence Rail=Перила из ивы +Willow Wood Mese Post Light=Фонарь из ивы +Willow Wood Fence Gate=Ворота из ивы +Alder Tree=Ольха +Alder Wood Planks=Доски из ольхи +Alder Tree Leaves=Листья ольхи +Alder Tree Sapling=Саженец ольхи +Alder Wood Stair=Лестница из ольхи +Alder Wood Slab=Плита из ольхи +Alder Wood Fence=Забор из ольхи +Alder Wood Fence Rail=Перила из ольхи +Alder Wood Mese Post Light=Фонарь из ольхи +Alder Wood Fence Gate=Ворота из ольхи +Ash Tree=Ясень +Ash Wood Planks=Доски из ясеня +Ash Tree Leaves=Листья ясеня +Ash Tree Sapling=Саженец ясеня +Ash Wood Stair=Лестница из ясеня +Ash Wood Slab=Плита из ясеня +Ash Wood Fence=Забор из ясеня +Ash Wood Fence Rail=Перила из ясеня +Ash Wood Mese Post Light=Фонарь из ясеня +Ash Wood Fence Gate=Ворота из ясеня +Birch Tree=Берёза +Birch Wood Planks=Доски из берёзы +Birch Tree Leaves=Листья берёзы +Birch Tree Sapling=Саженец берёзы +Birch Wood Stair=Лестница из берёзы +Birch Wood Slab=Плита из берёзы +Birch Wood Fence=Забор из берёзы +Birch Wood Fence Rail=Перила из берёзы +Birch Wood Mese Post Light=Фонарь из берёзы +Birch Wood Fence Gate=Ворота из берёзы +Downy Birch Tree=Пушистая берёза +Downy Birch Wood Planks=Доски из пушистой берёзы +Downy Birch Tree Leaves=Листья пушистой берёзы +Downy Birch Tree Sapling=Саженец пушистой берёзы +Downy Birch Wood Stair=Лестница из пушистой берёзы +Downy Birch Wood Slab=Плита из пушистой берёзы +Downy Birch Wood Fence=Забор из пушистой берёзы +Downy Birch Wood Fence Rail=Перила из пушистой берёзы +Downy Birch Wood Mese Post Light=Фонарь из пушистой берёзы +Downy Birch Wood Fence Gate=Ворота из пушистой берёзы +Cowberries=Брусника +Cowberry Bush Leaves with Berries=Листья брусничного куста с ягодами +Cowberry Bush Leaves=Листья брусничного куста +Cowberry Bush Sapling=Саженец брусники +Oak Tree=Дуб +Oak Wood Planks=Доски из дуба +Oak Tree Leaves=Листья дуба +Oak Tree Sapling=Саженец дуба +Oak Wood Stair=Лестница из дуба +Oak Wood Slab=Плита из дуба +Oak Wood Fence=Забор из дуба +Oak Wood Fence Rail=Перила из дуба +Oak Wood Mese Post Light=Фонарь из дуба +Oak Wood Fence Gate=Ворота из дуба +Acorns=Желуди +Acorns Marker=Указатель желудей +Cooked Acorns=Приготовленные желуди +Bucket of Acorns=Ведро с желудями +Maple Tree=Клён +Maple Wood Planks=Доски из клёна +Maple Tree Leaves=Листья клёна +Maple Tree Sapling=Саженец клёна +Maple Wood Stair=Лестница из клёна +Maple Wood Slab=Плита из клёна +Maple Wood Fence=Забор из клёна +Maple Wood Fence Rail=Перила из клёна +Maple Wood Mese Post Light=Фонарь из клёна +Maple Wood Fence Gate=Ворота из клёна +Desert Sand with Debris=Песок пустыни с мусором +Sand with Debris=Песок с мусором +Silver Sand with Debris=Серебристый песок с мусором +Dirt with Japanese Rainforest Litter=Земля с мусором из японских тропических лесов +Dirt with Japanese Rainforest Litter and Footsteps=Земля с мусором из японских тропических лесов и следами ног +Moss=Мох +Sugi Tree=Суга +Sugi Wood Planks=Доски из суги +Sugi Tree Leaves=Листья суги +Sugi Tree Sapling=Саженец Суги +Sugi Wood Stair=Лестница из суги +Sugi Wood Slab=Плита из суги +Sugi Wood Fence=Забор из суги +Sugi Wood Fence Rail=Перила из суги +Sugi Wood Mese Post Light=Фонарь из суги +Sugi Wood Fence Gate=Ворота из суги +Mizunara Tree=Мизунара +Mizunara Wood Planks=Доски из мизунары +Mizunara Tree Leaves=Листья мизунары +Mizunara Tree Sapling=Саженец мизунара +Mizunara Wood Stair=Лестница из мизунары +Mizunara Wood Slab=Плита из мизунары +Mizunara Wood Fence=Забор из мизунары +Mizunara Wood Fence Rail=Перила из мизунары +Mizunara Wood Mese Post Light=Фонарь из мизунары +Mizunara Wood Fence Gate=Ворота из мизунары +Stone Oak Tree=Каменный дуб +Stone Oak Wood Planks=Доски из каменного дуба +Stone Oak Tree Leaves=Листья каменного дуба +Stone Oak Tree Sapling=Саженец каменного дуба +Stone Oak Wood Stair=Лестница из каменного дуба +Stone Oak Wood Slab=Плита из каменного дуба +Stone Oak Wood Fence=Забор из каменного дуба +Stone Oak Wood Fence Rail=Перила из каменного дуба +Stone Oak Wood Mese Post Light=Фонарь из каменного дуба +Stone Oak Wood Fence Gate=Ворота из каменного дуба +Forest Growth=Лесная поросль +Dirt with Jungle Savanna Grass=Земля с травой джунглей саванны +Dirt with Jungle Savanna Grass and Footsteps=Земля с травой джунглей саванны и следами ног +Jungle Savanna Grass=Трава джунглей со следами ног +Dirt with Mediterranean Grass=Земля со средиземноморской травой +Dirt with Mediterranean Grass and Footsteps=Земля со средиземноморской травой и следами ног +Mediterranean Grass=Средиземноморская трава +Black Iris=Ирис черный +Cladanthus=Кладантус +Savory=Чабер +Staehelina=Стелина +Persian Buttercup=Лютик персидский +Yellow Chrysanthemum=Желтая хризантема +Warm Biome Bush Stem=Ствол куста тёплого биома +Warm Biome Bush Leaves=Листья куста тёплого биома +Warm Biome Bush Sapling=Саженец куста тёплого биома +Cypress Tree=Кипарис +Cypress Wood Planks=Доски из кипариса +Cypress Tree Leaves=Листья кипариса +Cypress Tree Sapling=Саженец кипариса +Cypress Wood Stair=Лестница из кипариса +Cypress Wood Slab=Плита из кипариса +Cypress Wood Fence=Забор из кипариса +Cypress Wood Fence Rail=Перила из кипариса +Cypress Wood Mese Post Light=Фонарь из кипариса +Cypress Wood Fence Gate=Ворота из кипариса +Olive Tree=Олива +Olive Wood Planks=Доски из оливы +Olive Tree Leaves=Листья оливы +Olives=Оливки +Olive Marker=Указатель оливок +Olive Tree Sapling=Саженец оливы +Olive Wood Stair=Лестница из оливы +Olive Wood Slab=Плита из оливы +Olive Wood Fence=Забор из оливы +Olive Wood Fence Rail=Перила из оливы +Olive Wood Mese Post Light=Фонарь из оливы +Olive Wood Fence Gate=Ворота из оливы +Dry Dirt with Humid Savanna Grass=Сухая земля с влажной травой саванны +Dry Dirt with Humid Savanna Grass and Footsteps=Сухая земля с влажной травой саванны и следами ног +Humid Savanna Grass=Влажная трава саванны +Jaragua Grass=Трава джарагуа +Afzelia Tree=Афзелия +Afzelia Wood Planks=Доски из афцелии +Afzelia Tree Leaves=Листья афцелии +Afzelia Tree Sapling=Саженец афцелии +Afzelia Wood Stair=Лестница из афцелии +Afzelia Wood Slab=Плита из афцелии +Afzelia Wood Fence=Забор из афцелии +Afzelia Wood Fence Rail=Перила из афцелии +Afzelia Wood Mese Post Light=Фонарь из афцелии +Afzelia Wood Fence Gate=Ворота из афцелии +Limba Tree=Лимба +Limba Wood Planks=Доски из лимбы +Limba Tree Leaves=Листья лимбы +Limba Tree Sapling=Саженец лимбы +Limba Wood Stair=Лестница из лимбы +Limba Wood Slab=Плита из лимбы +Limba Wood Fence=Забор из лимбы +Limba Wood Fence Rail=Перила из лимбы +Limba Wood Mese Post Light=Фонарь из лимбы +Limba Wood Fence Gate=Ворота из лимбы +Black Limba Wood Planks=Доски из чёрной лимбы +Black Limba Wood Stair=Лестница из чёрной лимбы +Black Limba Wood Slab=Плита из чёрной лимбы +Black Limba Wood Fence=Забор из чёрной лимбы +Black Limba Wood Fence Rail=Перила из чёрной лимбы +Black Limba Wood Mese Post Light=Фонарь из чёрной лимбы +Black Limba Wood Fence Gate=Ворота из чёрной лимбы +Siri Tree=Сири +Siri Wood Planks=Доски из сири +Siri Tree Leaves=Листья сири +Siri Tree Sapling=Саженец сири +Siri Wood Stair=Лестница из сири +Siri Wood Slab=Плита из сири +Siri Wood Fence=Забор из сири +Siri Wood Fence Rail=Перила из сири +Siri Wood Mese Post Light=Фонарь из сири +Siri Wood Fence Gate=Ворота из сири +Tamarind Tree=Тамаринд +Tamarind Wood Planks=Доски из тамаринда +Tamarind Tree Leaves=Листья тамаринда +Hanging Tamarind Pods=Висячие стручки тамаринда +Hanging Tamarind Pod Marker=Указатель висячих стручков тамаринда +Tamarind Pods=Стручки тамаринда +Tamarind Pulp=Мякоть тамаринда +Tamarind Tree Sapling=Саженец тамаринда +Tamarind Wood Stair=Лестница из тамаринда +Tamarind Wood Slab=Плита из тамаринда +Tamarind Wood Fence=Забор из тамаринда +Tamarind Wood Fence Rail=Перила из тамаринда +Tamarind Wood Mese Post Light=Фонарь из тамаринда +Tamarind Wood Fence Gate=Ворота из тамаринда +Dirt with Steppe Grass=Земля со степной травой +Dirt with Steppe Grass and Footsteps=Земля со степной травой и следами ног +Steppe Grass=Степная трава +Dirt with Warm Steppe Grass=Земля с травой тёплых степей +Dirt with Warm Steppe Grass and Footsteps=Земля с травой тёплых степей и следами ног +Warm Steppe Grass=Трава тёплых степей +Dirt with Cold Steppe Grass=Земля с травой холодных степей +Dirt with Cold Steppe Grass and Footsteps=Земля с травой холодных степей и следами ног +Cold Steppe Grass=Трава холодных степей +Blue Allium=Голубой лук +Purple Blue Allium=Фиолетовый лук +Altai Tulip=Алтайский тюльпан +Russian Iris=Русский ирис +Siberian Lily=Сибирская лилия +Mountain Lily=Горная лилия +Peashrub Peas=Стручковый горох +Cooked Peas=Вареный горох +Bucket of Peas=Ведро стручкового гороха +Peashrub Bush Leaves with Peas=Листья куста стручкового гороха с горошком +Peashrub Leaves=Листья стручкового гороха +Peashrub Sapling=Саженец стручкового гороха +Dirt with Forest Litter=Земля с лесным мусором +Dirt with Forest Litter and Footsteps=Земля с лесным мусором и следами ног +Beech Tree=Бук +Beech Wood Planks=Доски из бука +Beech Tree Leaves=Листья бука +Beech Tree Sapling=Саженец бука +Beech Wood Stair=Лестница из бука +Beech Wood Slab=Плита из бука +Beech Wood Fence=Забор из бука +Beech Wood Fence Rail=Перила из бука +Beech Wood Mese Post Light=Фонарь из бука +Beech Wood Fence Gate=Ворота из бука +Dirt with Warm Grass=Земля с тёплой травой +Dirt with Warm Grass and Footsteps=Земля с тёплой травой и следами ног +Warm Grass=Теплая трава +Larkspur=Живокость +Pear Tree=Груша +Pear Wood Planks=Доски из груши +Pear Tree Leaves=Листья груши +Pear Tree Sapling=Саженец груши +Pear Wood Stair=Лестница из груши +Pear Wood Slab=Плита из груши +Pear Wood Fence=Забор из груши +Pear Wood Fence Rail=Перила из груши +Pear Wood Mese Post Light=Фонарь из груши +Pear Wood Fence Gate=Ворота из груши +Pear=Груша +Pear Marker=Указатель груши +Quince Tree=Айва +Quince Wood Planks=Доски из айвы +Quince Tree Leaves=Листья айвы +Quince Tree Sapling=Саженец айвы +Quince Wood Stair=Лестница из айвы +Quince Wood Slab=Плита из айвы +Quince Wood Fence=Забор из айвы +Quince Wood Fence Rail=Перила из айвы +Quince Wood Mese Post Light=Фонарь из айвы +Quince Wood Fence Gate=Ворота из айвы +Quince=Айва +Quince Marker=Указатель айвы +Dried Quince Pieces=Кусочки сушеной айвы +Chestnut Tree=Каштан +Chestnut Wood Planks=Доски из каштана +Chestnut Tree Leaves=Листья каштана +Chestnut Tree Sapling=Саженец каштана +Chestnut Wood Stair=Лестница из каштана +Chestnut Wood Slab=Плита из каштана +Chestnut Wood Fence=Забор из каштана +Chestnut Wood Fence Rail=Перила из каштана +Chestnut Wood Mese Post Light=Фонарь из каштана +Chestnut Wood Fence Gate=Ворота из каштана +Chestnuts=Каштаны +Chestnut Marker=Каштановый маркер +Peeled Chestnuts=Очищенные каштаны +Roasted Chestnuts=Жареные каштаны +Hornbeam Tree=Граб +Hornbeam Wood Planks=Доски из граба +Hornbeam Tree Leaves=Листья из граба +Hornbeam Tree Sapling=Саженец граба +Hornbeam Wood Stair=Лестница из граба +Hornbeam Wood Slab=Плита из граба +Hornbeam Wood Fence=Забор из граба +Hornbeam Wood Fence Rail=Перила из граба +Hornbeam Wood Mese Post Light=Фонарь из граба +Hornbeam Wood Fence Gate=Ворота из граба +Swamp Water Bucket=Ведро с болотной водой +Inner Dry Peat Stair=Внутренняя лестница из сухого торфа +Outer Dry Peat Stair=Внешняя лестница из сухого торфа +Inner Willow Wood Stair=Внутренняя лестница из ивы +Outer Willow Wood Stair=Внешняя лестница из ивы +Inner Alder Wood Stair=Внутренняя лестница из ольхи +Outer Alder Wood Stair=Внешняя лестница из ольхи +Inner Ash Wood Stair=Внутренняя лестница из ясеня +Outer Ash Wood Stair=Внешняя лестница из ясеня +Inner Birch Wood Stair=Внутренняя лестница из берёзы +Outer Birch Wood Stair=Внешняя лестница из берёзы +Inner Downy Birch Wood Stair=Внутренняя лестница из пушистой берёзы +Outer Downy Birch Wood Stair=Внешняя лестница из пушистой берёзы +Inner Oak Wood Stair=Внутренняя лестница из дуба +Outer Oak Wood Stair=Внешняя лестница из дуба +Inner Maple Wood Stair=Внутренняя лестница из клёна +Outer Maple Wood Stair=Внешняя лестница из клёна +Inner Sugi Wood Stair=Внутренняя лестница из суги +Outer Sugi Wood Stair=Внешняя лестница из суги +Inner Mizunara Wood Stair=Внутренняя лестница из мизунары +Outer Mizunara Wood Stair=Внешняя лестница из мизунары +Inner Stone Oak Wood Stair=Внутренняя лестница из каменного дуба +Outer Stone Oak Wood Stair=Внешняя лестница из каменного дуба +Inner Cypress Wood Stair=Внутренняя лестница из кипариса +Outer Cypress Wood Stair=Внешняя лестница из кипариса +Inner Olive Wood Stair=Внутренняя лестница из оливы +Outer Olive Wood Stair=Внешняя лестница из оливы +Inner Afzelia Wood Stair=Внутренняя лестница из афзелии +Outer Afzelia Wood Stair=Внешняя лестница из афзелии +Inner Limba Wood Stair=Внутренняя лестница из лимбы +Outer Limba Wood Stair=Внешняя лестница из лимбы +Inner Black Limba Wood Stair=Внутренняя лестница из чёрной лимбы +Outer Black Limba Wood Stair=Внешняя лестница из чёрной лимбы +Inner Siri Wood Stair=Внутренняя лестница из сири +Outer Siri Wood Stair=Внешняя лестница из сири +Inner Tamarind Wood Stair=Внутренняя лестница из тамаринда +Outer Tamarind Wood Stair=Внешняя лестница из тамаринда +Inner Beech Wood Stair=Внутренняя лестница из бука +Outer Beech Wood Stair=Внешняя лестница из бука +Inner Pear Wood Stair=Внутренняя лестница из груши +Outer Pear Wood Stair=Внешняя лестница из груши +Inner Quince Wood Stair=Внутренняя лестница из айвы +Outer Quince Wood Stair=Внешняя лестница из айвы +Inner Chestnut Wood Stair=Внутренняя лестница из каштана +Outer Chestnut Wood Stair=Внешняя лестница из каштана +Inner Hornbeam Wood Stair=Внутренняя лестница из граба +Outer Hornbeam Wood Stair=Внешняя лестница из граба diff --git a/mods/ebiomes/locale/template.txt b/mods/ebiomes/locale/template.txt new file mode 100644 index 0000000..08cb1c0 --- /dev/null +++ b/mods/ebiomes/locale/template.txt @@ -0,0 +1,395 @@ +# textdomain: ebiomes + +Dry Dirt with Arid Grass= +Dry Dirt with Arid Grass and Footsteps= +Arid Grass= +Dry Dirt with Cool Arid Grass= +Dry Dirt with Cool Arid Grass and Footsteps= +Cool Arid Grass= +Hardy Bush Stem= +Hardy Bush Leaves= +Hardy Bush Sapling= +Thorn Bush Leaves= +Thorn Bush Sapling= +Bamboo= +Bamboo Leaves= +Bamboo Sprout= +Dirt with Cold Grass= +Dirt with Cold Grass and Footsteps= +Cold Grass= +Dirt with Swamp Grass= +Dirt with Swamp Grass and Footsteps= +Swamp Grass= +Swamp Water Source= +Swamp Water= +Peat= +Peat with Yellow Swamp Moss= +Peat with Yellow Swamp Moss and Footsteps= +Dry Peat= +Wet Peat= +Wet Peat with Green Swamp Moss= +Wet Peat with Green Swamp Moss and Footsteps= +Dry Peat Stair= +Dry Peat Slab= +Burning Peat= +Reeds= +Green Marsh Grass= +Yellow Marsh Grass= +Bog Grass= +Blackcurants= +Blackcurrant Bush Leaves with Berries= +Blackcurrant Bush Leaves= +Blackcurrant Bush Sapling= +Redcurants= +Redcurrant Bush Leaves with Berries= +Redcurrant Bush Leaves= +Redcurrant Bush Sapling= +Gooseberries= +Gooseberry Bush Leaves with Berries= +Gooseberry Bush Leaves= +Gooseberry Bush Sapling= +Cranberry Patch= +Cranberries= +Sundew= +Marsh Marigold= +Marsh Stitchwort= +Willow Tree= +Willow Wood Planks= +Willow Tree Leaves= +Willow Tree Sapling= +Willow Wood Stair= +Willow Wood Slab= +Willow Wood Fence= +Willow Wood Fence Rail= +Willow Wood Mese Post Light= +Willow Wood Fence Gate= +Alder Tree= +Alder Wood Planks= +Alder Tree Leaves= +Alder Tree Sapling= +Alder Wood Stair= +Alder Wood Slab= +Alder Wood Fence= +Alder Wood Fence Rail= +Alder Wood Mese Post Light= +Alder Wood Fence Gate= +Ash Tree= +Ash Wood Planks= +Ash Tree Leaves= +Ash Tree Sapling= +Ash Wood Stair= +Ash Wood Slab= +Ash Wood Fence= +Ash Wood Fence Rail= +Ash Wood Mese Post Light= +Ash Wood Fence Gate= +Birch Tree= +Birch Wood Planks= +Birch Tree Leaves= +Birch Tree Sapling= +Birch Wood Stair= +Birch Wood Slab= +Birch Wood Fence= +Birch Wood Fence Rail= +Birch Wood Mese Post Light= +Birch Wood Fence Gate= +Downy Birch Tree= +Downy Birch Wood Planks= +Downy Birch Tree Leaves= +Downy Birch Tree Sapling= +Downy Birch Wood Stair= +Downy Birch Wood Slab= +Downy Birch Wood Fence= +Downy Birch Wood Fence Rail= +Downy Birch Wood Mese Post Light= +Downy Birch Wood Fence Gate= +Cowberries= +Cowberry Bush Leaves with Berries= +Cowberry Bush Leaves= +Cowberry Bush Sapling= +Oak Tree= +Oak Wood Planks= +Oak Tree Leaves= +Oak Tree Sapling= +Oak Wood Stair= +Oak Wood Slab= +Oak Wood Fence= +Oak Wood Fence Rail= +Oak Wood Mese Post Light= +Oak Wood Fence Gate= +Acorns= +Acorns Marker= +Cooked Acorns= +Bucket of Acorns= +Maple Tree= +Maple Wood Planks= +Maple Tree Leaves= +Maple Tree Sapling= +Maple Wood Stair= +Maple Wood Slab= +Maple Wood Fence= +Maple Wood Fence Rail= +Maple Wood Mese Post Light= +Maple Wood Fence Gate= +Desert Sand with Debris= +Sand with Debris= +Silver Sand with Debris= +Dirt with Japanese Rainforest Litter= +Dirt with Japanese Rainforest Litter and Footsteps= +Moss= +Sugi Tree= +Sugi Wood Planks= +Sugi Tree Leaves= +Sugi Tree Sapling= +Sugi Wood Stair= +Sugi Wood Slab= +Sugi Wood Fence= +Sugi Wood Fence Rail= +Sugi Wood Mese Post Light= +Sugi Wood Fence Gate= +Mizunara Tree= +Mizunara Wood Planks= +Mizunara Tree Leaves= +Mizunara Tree Sapling= +Mizunara Wood Stair= +Mizunara Wood Slab= +Mizunara Wood Fence= +Mizunara Wood Fence Rail= +Mizunara Wood Mese Post Light= +Mizunara Wood Fence Gate= +Stone Oak Tree= +Stone Oak Wood Planks= +Stone Oak Tree Leaves= +Stone Oak Tree Sapling= +Stone Oak Wood Stair= +Stone Oak Wood Slab= +Stone Oak Wood Fence= +Stone Oak Wood Fence Rail= +Stone Oak Wood Mese Post Light= +Stone Oak Wood Fence Gate= +Forest Growth= +Dirt with Jungle Savanna Grass= +Dirt with Jungle Savanna Grass and Footsteps= +Jungle Savanna Grass= +Dirt with Mediterranean Grass= +Dirt with Mediterranean Grass and Footsteps= +Mediterranean Grass= +Black Iris= +Cladanthus= +Savory= +Staehelina= +Persian Buttercup= +Yellow Chrysanthemum= +Warm Biome Bush Stem= +Warm Biome Bush Leaves= +Warm Biome Bush Sapling= +Cypress Tree= +Cypress Wood Planks= +Cypress Tree Leaves= +Cypress Tree Sapling= +Cypress Wood Stair= +Cypress Wood Slab= +Cypress Wood Fence= +Cypress Wood Fence Rail= +Cypress Wood Mese Post Light= +Cypress Wood Fence Gate= +Olive Tree= +Olive Wood Planks= +Olive Tree Leaves= +Olives= +Olive Marker= +Olive Tree Sapling= +Olive Wood Stair= +Olive Wood Slab= +Olive Wood Fence= +Olive Wood Fence Rail= +Olive Wood Mese Post Light= +Olive Wood Fence Gate= +Dry Dirt with Humid Savanna Grass= +Dry Dirt with Humid Savanna Grass and Footsteps= +Humid Savanna Grass= +Jaragua Grass= +Afzelia Tree= +Afzelia Wood Planks= +Afzelia Tree Leaves= +Afzelia Tree Sapling= +Afzelia Wood Stair= +Afzelia Wood Slab= +Afzelia Wood Fence= +Afzelia Wood Fence Rail= +Afzelia Wood Mese Post Light= +Afzelia Wood Fence Gate= +Limba Tree= +Limba Wood Planks= +Limba Tree Leaves= +Limba Tree Sapling= +Limba Wood Stair= +Limba Wood Slab= +Limba Wood Fence= +Limba Wood Fence Rail= +Limba Wood Mese Post Light= +Limba Wood Fence Gate= +Black Limba Wood Planks= +Black Limba Wood Stair= +Black Limba Wood Slab= +Black Limba Wood Fence= +Black Limba Wood Fence Rail= +Black Limba Wood Mese Post Light= +Black Limba Wood Fence Gate= +Siri Tree= +Siri Wood Planks= +Siri Tree Leaves= +Siri Tree Sapling= +Siri Wood Stair= +Siri Wood Slab= +Siri Wood Fence= +Siri Wood Fence Rail= +Siri Wood Mese Post Light= +Siri Wood Fence Gate= +Tamarind Tree= +Tamarind Wood Planks= +Tamarind Tree Leaves= +Hanging Tamarind Pods= +Hanging Tamarind Pod Marker= +Tamarind Pods= +Tamarind Pulp= +Tamarind Tree Sapling= +Tamarind Wood Stair= +Tamarind Wood Slab= +Tamarind Wood Fence= +Tamarind Wood Fence Rail= +Tamarind Wood Mese Post Light= +Tamarind Wood Fence Gate= +Dirt with Steppe Grass= +Dirt with Steppe Grass and Footsteps= +Steppe Grass= +Dirt with Warm Steppe Grass= +Dirt with Warm Steppe Grass and Footsteps= +Warm Steppe Grass= +Dirt with Cold Steppe Grass= +Dirt with Cold Steppe Grass and Footsteps= +Cold Steppe Grass= +Blue Allium= +Purple Blue Allium= +Altai Tulip= +Russian Iris= +Siberian Lily= +Mountain Lily= +Peashrub Peas= +Cooked Peas= +Bucket of Peas= +Peashrub Bush Leaves with Peas= +Peashrub Leaves= +Peashrub Sapling= +Dirt with Forest Litter= +Dirt with Forest Litter and Footsteps= +Beech Tree= +Beech Wood Planks= +Beech Tree Leaves= +Beech Tree Sapling= +Beech Wood Stair= +Beech Wood Slab= +Beech Wood Fence= +Beech Wood Fence Rail= +Beech Wood Mese Post Light= +Beech Wood Fence Gate= +Dirt with Warm Grass= +Dirt with Warm Grass and Footsteps= +Warm Grass= +Larkspur= +Pear Tree= +Pear Wood Planks= +Pear Tree Leaves= +Pear Tree Sapling= +Pear Wood Stair= +Pear Wood Slab= +Pear Wood Fence= +Pear Wood Fence Rail= +Pear Wood Mese Post Light= +Pear Wood Fence Gate= +Pear= +Pear Marker= +Quince Tree= +Quince Wood Planks= +Quince Tree Leaves= +Quince Tree Sapling= +Quince Wood Stair= +Quince Wood Slab= +Quince Wood Fence= +Quince Wood Fence Rail= +Quince Wood Mese Post Light= +Quince Wood Fence Gate= +Quince= +Quince Marker= +Dried Quince Pieces= +Chestnut Tree= +Chestnut Wood Planks= +Chestnut Tree Leaves= +Chestnut Tree Sapling= +Chestnut Wood Stair= +Chestnut Wood Slab= +Chestnut Wood Fence= +Chestnut Wood Fence Rail= +Chestnut Wood Mese Post Light= +Chestnut Wood Fence Gate= +Chestnuts= +Chestnut Marker= +Peeled Chestnuts= +Roasted Chestnuts= +Hornbeam Tree= +Hornbeam Wood Planks= +Hornbeam Tree Leaves= +Hornbeam Tree Sapling= +Hornbeam Wood Stair= +Hornbeam Wood Slab= +Hornbeam Wood Fence= +Hornbeam Wood Fence Rail= +Hornbeam Wood Mese Post Light= +Hornbeam Wood Fence Gate= +Swamp Water Bucket= +Inner Dry Peat Stair= +Outer Dry Peat Stair= +Inner Willow Wood Stair= +Outer Willow Wood Stair= +Inner Alder Wood Stair= +Outer Alder Wood Stair= +Inner Ash Wood Stair= +Outer Ash Wood Stair= +Inner Birch Wood Stair= +Outer Birch Wood Stair= +Inner Downy Birch Wood Stair= +Outer Downy Birch Wood Stair= +Inner Oak Wood Stair= +Outer Oak Wood Stair= +Inner Maple Wood Stair= +Outer Maple Wood Stair= +Inner Sugi Wood Stair= +Outer Sugi Wood Stair= +Inner Mizunara Wood Stair= +Outer Mizunara Wood Stair= +Inner Stone Oak Wood Stair= +Outer Stone Oak Wood Stair= +Inner Cypress Wood Stair= +Outer Cypress Wood Stair= +Inner Olive Wood Stair= +Outer Olive Wood Stair= +Inner Afzelia Wood Stair= +Outer Afzelia Wood Stair= +Inner Limba Wood Stair= +Outer Limba Wood Stair= +Inner Black Limba Wood Stair= +Outer Black Limba Wood Stair= +Inner Siri Wood Stair= +Outer Siri Wood Stair= +Inner Tamarind Wood Stair= +Outer Tamarind Wood Stair= +Inner Beech Wood Stair= +Outer Beech Wood Stair= +Inner Pear Wood Stair= +Outer Pear Wood Stair= +Inner Quince Wood Stair= +Outer Quince Wood Stair= +Inner Chestnut Wood Stair= +Outer Chestnut Wood Stair= +Inner Hornbeam Wood Stair= +Outer Hornbeam Wood Stair= diff --git a/mods/ebiomes/mediterranean.lua b/mods/ebiomes/mediterranean.lua new file mode 100644 index 0000000..ca790af --- /dev/null +++ b/mods/ebiomes/mediterranean.lua @@ -0,0 +1,1159 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Mediterranean + +--Aliases + +core.register_alias("dirt_with_med_grass", "ebiomes:dirt_with_grass_med") +core.register_alias("dirt_with_med_grass_footsteps", "ebiomes:dirt_with_grass_med_footsteps") + +core.register_alias("warm_bush_stem", "ebiomes:bush_stem_warm") +core.register_alias("warm_bush_leaves", "ebiomes:bush_leaves_warm") +core.register_alias("warm_bush_sapling", "ebiomes:bush_sapling_warm") + +core.register_alias("black_iris", "ebiomes:black_iris") +core.register_alias("cladanthus", "ebiomes:cladanthus") +core.register_alias("savory", "ebiomes:savory") +core.register_alias("staehelina", "ebiomes:staehelina") +core.register_alias("persian_buttercup", "ebiomes:buttercup_persian") +core.register_alias("yellow_chrysanthemum", "ebiomes:chrysanthemum_yellow") + +core.register_alias("cypress_tree", "ebiomes:cypress_tree") +core.register_alias("cypress_wood", "ebiomes:cypress_wood") +core.register_alias("cypress_leaves", "ebiomes:cypress_leaves") +core.register_alias("cypress_sapling", "ebiomes:cypress_sapling") +core.register_alias("olive_tree", "ebiomes:olive_tree") +core.register_alias("olive_wood", "ebiomes:olive_wood") +core.register_alias("olive_leaves", "ebiomes:olive_leaves") +core.register_alias("olive_sapling", "ebiomes:olive_sapling") +core.register_alias("olives", "ebiomes:olives") + +--Biome base + + core.register_node("ebiomes:dirt_with_grass_med", { + description = S("Dirt with Mediterranean Grass"), + tiles = {"ebiomes_grass_med.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_med_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_grass_med", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_grass_med_footsteps", { + description = S("Dirt with Mediterranean Grass and Footsteps"), + tiles = {"ebiomes_grass_med.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_med_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_med_1", { + description = S("Mediterranean Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_med_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_med_3.png", + wield_image = "ebiomes_grass_med_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_med_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_med_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_med_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_med_" .. i, { + description = S("Mediterranean Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_med_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_med_" .. i .. ".png", + wield_image = "ebiomes_grass_med_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_med_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_med_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "mediterranean", + node_top = "ebiomes:dirt_with_grass_med", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 70, + humidity_point = 50, + }) + + core.register_biome({ + name = "mediterranean_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 70, + humidity_point = 50, + }) + + core.register_biome({ + name = "mediterranean_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 70, + humidity_point = 50, + }) + + core.register_biome({ + name = "mediterranean_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 70, + humidity_point = 50, + }) + + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_med_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.032, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_med_"..length, + }) +end + + --ebiomes folliage + + --Mediterranean + + core.register_node("ebiomes:black_iris", { + description = S("Black Iris"), + tiles = {"ebiomes_black_iris.png"}, + inventory_image = "ebiomes_black_iris.png", + wield_image = "ebiomes_black_iris.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } + }) + + core.register_craft({ + output = "dye:black 4", + recipe = { + {"ebiomes:black_iris"} + }, + }) + + core.register_decoration({ + name = "ebiomes:black_iris", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 380, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:black_iris", + }) + + + + + core.register_node("ebiomes:cladanthus", { + description = S("Cladanthus"), + tiles = {"ebiomes_cladanthus.png"}, + inventory_image = "ebiomes_cladanthus.png", + wield_image = "ebiomes_cladanthus.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } + }) + + core.register_craft({ + output = "dye:white 4", + recipe = { + {"ebiomes:cladanthus"} + }, + }) + + core.register_decoration({ + name = "ebiomes:cladanthus", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 381, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:cladanthus", + }) + + + core.register_node("ebiomes:savory", { + description = S("Savory"), + tiles = {"ebiomes_savory.png"}, + inventory_image = "ebiomes_savory.png", + wield_image = "ebiomes_savory.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } + }) + + core.register_craft({ + output = "dye:white 4", + recipe = { + {"ebiomes:savory"} + }, + }) + + core.register_decoration({ + name = "ebiomes:savory", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 382, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:savory", + }) + + + core.register_node("ebiomes:staehelina", { + description = S("Staehelina"), + tiles = {"ebiomes_staehelina.png"}, + inventory_image = "ebiomes_staehelina.png", + wield_image = "ebiomes_staehelina.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -4 / 16, 3 / 16}, + } + }) + + core.register_craft({ + output = "dye:magenta 4", + recipe = { + {"ebiomes:staehelina"} + }, + }) + + core.register_decoration({ + name = "ebiomes:staehelina", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 383, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:staehelina", + }) + + core.register_node("ebiomes:buttercup_persian", { + description = S("Persian Buttercup"), + tiles = {"ebiomes_buttercup_persian.png"}, + inventory_image = "ebiomes_buttercup_persian.png", + wield_image = "ebiomes_buttercup_persian.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:orange 4", + recipe = { + {"ebiomes:buttercup_persian"} + }, + }) + + core.register_decoration({ + name = "ebiomes:buttercup_persian", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 385, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:buttercup_persian", + }) + + + + + core.register_node("ebiomes:chrysanthemum_yellow", { + description = S("Yellow Chrysanthemum"), + tiles = {"ebiomes_chrysanthemum_yellow.png"}, + inventory_image = "ebiomes_chrysanthemum_yellow.png", + wield_image = "ebiomes_chrysanthemum_yellow.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1, color_yellow = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:yellow 4", + recipe = { + {"ebiomes:chrysanthemum_yellow"} + }, + }) + + core.register_decoration({ + name = "ebiomes:chrysanthemum_yellow", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 386, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:chrysanthemum_yellow", + }) + +local function grow_new_bush_warm(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y-1, z = pos.z-1}, modpath.."/schematics/ebiomes_bush_warm.mts", "0", nil, false) +end + + core.register_node("ebiomes:bush_stem_warm", { + description = S("Warm Biome Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"ebiomes_bush_stem_warm.png"}, + inventory_image = "ebiomes_bush_stem_warm.png", + wield_image = "ebiomes_bush_stem_warm.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, + }) + + core.register_node("ebiomes:bush_leaves_warm", { + description = S("Warm Biome Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_bush_leaves_warm.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:bush_sapling_warm"}, rarity = 5}, + {items = {"ebiomes:bush_leaves_warm"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:bush_sapling_warm", { + description = S("Warm Biome Bush Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_bush_sapling_warm.png"}, + inventory_image = "ebiomes_bush_sapling_warm.png", + wield_image = "ebiomes_bush_sapling_warm.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = default.grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:bush_sapling_warm", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + + default.register_leafdecay({ + trunks = {"ebiomes:bush_stem_warm"}, + leaves = {"ebiomes:bush_leaves_warm"}, + radius = 1, + }) + + core.register_decoration({ + name = "ebiomes:bush_warm", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_bush_warm.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {"ebiomes:bush_sapling_warm", grow_new_bush_warm, "soil"}, + }) +end + + core.register_craft({ + output = "default:wood", + recipe = { + {"ebiomes:bush_stem_warm"}, + } + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:bush_stem_warm", + burntime = 8, + }) + + --Trees + + --Cypress + + core.register_node("ebiomes:cypress_tree", { + description = S("Cypress Tree"), + tiles = {"ebiomes_cypress_tree_top.png", "ebiomes_cypress_tree_top.png", + "ebiomes_cypress_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:cypress_wood", { + description = S("Cypress Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_cypress_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:cypress_wood 4", + recipe = { + {"ebiomes:cypress_tree"}, + } + }) + + core.register_node("ebiomes:cypress_leaves", { + description = S("Cypress Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_cypress_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:cypress_sapling"}, rarity = 20}, + {items = {"ebiomes:cypress_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:cypress_tree"}, + leaves = {"ebiomes:cypress_leaves"}, + radius = 3, + }) + +local function grow_new_cypress(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_cypress_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:cypress_sapling", { + description = S("Cypress Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_cypress_sapling.png"}, + inventory_image = "ebiomes_cypress_sapling.png", + wield_image = "ebiomes_cypress_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_cypress, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 7 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:cypress_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 10, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:cypress_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 4, + octaves = 3, + persist = 0.01 + }, + biomes = {"mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_cypress_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + core.register_decoration({ + name = "ebiomes:cypress_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_med"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"mediterranean"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_cypress_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_med"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:cypress_sapling", grow_new_cypress, "soil"}, +}) +end + + + stairs.register_stair_and_slab("cypress_wood", "ebiomes:cypress_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_cypress_wood.png"}, + S("Cypress Wood Stair"), + S("Cypress Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Cypress Wood Stair"), + S("Outer Cypress Wood Stair") + ) + + default.register_fence("ebiomes:fence_cypress_wood", { + description = S("Cypress Wood Fence"), + texture = "ebiomes_fence_cypress_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_cypress_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_cypress_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:cypress_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_cypress_wood", { + description = S("Cypress Wood Fence Rail"), + texture = "ebiomes_fence_rail_cypress_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_cypress_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_cypress_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:cypress_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_cypress_wood", { + description = S("Cypress Wood Mese Post Light"), + texture = "ebiomes_fence_cypress_wood.png", + material = "ebiomes:cypress_wood", + }) + + doors.register_fencegate("ebiomes:gate_cypress_wood", { + description = S("Cypress Wood Fence Gate"), + texture = "ebiomes_cypress_wood.png", + material = "ebiomes:cypress_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_cypress_wood_closed", + burntime = 7, + }) + + + + +--Olive + + core.register_node("ebiomes:olive_tree", { + description = S("Olive Tree"), + tiles = {"ebiomes_olive_tree_top.png", "ebiomes_olive_tree_top.png", + "ebiomes_olive_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:olive_wood", { + description = S("Olive Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_olive_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:olive_wood 4", + recipe = { + {"ebiomes:olive_tree"}, + } + }) + + core.register_node("ebiomes:olive_leaves", { + description = S("Olive Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_olive_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:olive_sapling"}, rarity = 20}, + {items = {"ebiomes:olive_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + core.register_node("ebiomes:olives", { + description = S("Olives"), + drawtype = "plantlike", + tiles = {"ebiomes_olives.png"}, + inventory_image = "ebiomes_olives.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -4 / 16, -4 / 16, 4 / 16, 6 / 16, 4 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1, eatable = 2}, + on_use = core.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:olives", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, {name = "ebiomes:olives_mark"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, + }) + + core.register_node("ebiomes:olives_mark", { + description = S("Olive Marker"), + inventory_image = "ebiomes_olives.png^default_invisible_node_overlay.png", + wield_image = "ebiomes_olives.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, "ebiomes:olive_leaves") then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:olives"}) + end + end + }) + + default.register_leafdecay({ + trunks = {"ebiomes:olive_tree"}, + leaves = {"ebiomes:olive_leaves", "ebiomes:olives"}, + radius = 3, + }) + +local function grow_new_olive(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_olive_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:olive_sapling", { + description = S("Olive Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_olive_sapling.png"}, + inventory_image = "ebiomes_olive_sapling.png", + wield_image = "ebiomes_olive_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_olive, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 6 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:olive_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 8, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:olive_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 3, + octaves = 3, + persist = 0.05 + }, + biomes = {"mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_olive_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:olive_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_med"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"mediterranean"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_olive_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_med"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:olive_sapling", grow_new_olive, "soil"}, +}) +end + + stairs.register_stair_and_slab("olive_wood", "ebiomes:olive_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_olive_wood.png"}, + S("Olive Wood Stair"), + S("Olive Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Olive Wood Stair"), + S("Outer Olive Wood Stair") + ) + + default.register_fence("ebiomes:fence_olive_wood", { + description = S("Olive Wood Fence"), + texture = "ebiomes_fence_olive_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_olive_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_olive_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:olive_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_olive_wood", { + description = S("Olive Wood Fence Rail"), + texture = "ebiomes_fence_rail_olive_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_olive_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_olive_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:olive_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_olive_wood", { + description = S("Olive Wood Mese Post Light"), + texture = "ebiomes_fence_olive_wood.png", + material = "ebiomes:olive_wood", + }) + + doors.register_fencegate("ebiomes:gate_olive_wood", { + description = S("Olive Wood Fence Gate"), + texture = "ebiomes_olive_wood.png", + material = "ebiomes:olive_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_olive_wood_closed", + burntime = 9, + }) + +--Other file related objects +if core.settings:get_bool("reg_warms", true) then + core.register_decoration({ + name = "ebiomes:larkspurmd", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_med"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 384, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:larkspur", + }) +end + +--Loot + +if core.global_exists("dungeon_loot") then + dungeon_loot.register ({ + {name = "ebiomes:olives", chance = 0.5, count = {3, 8}}, + }) +end + +--Bonemeal +if core.get_modpath("bonemeal") then + if core.settings:get_bool("reg_warms", true) then + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_med", {"ebiomes:grass_med_1", "ebiomes:grass_med_2", "ebiomes:grass_med_3", "ebiomes:grass_med_4", "ebiomes:grass_med_5"}, + {"ebiomes:black_iris", "ebiomes:cladanthus", "ebiomes:savory", "ebiomes:staehelina", "ebiomes:larkspur", "ebiomes:buttercup_persian", "ebiomes:chrysanthemum_yellow"} } + }) + else + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_med", {"ebiomes:grass_med_1", "ebiomes:grass_med_2", "ebiomes:grass_med_3", "ebiomes:grass_med_4", "ebiomes:grass_med_5"}, + {"ebiomes:black_iris", "ebiomes:cladanthus", "ebiomes:savory", "ebiomes:staehelina", "ebiomes:buttercup_persian", "ebiomes:chrysanthemum_yellow"} } + }) + end +end + + + + + +--Peripheral mod support + +--Moreblocks + +if core.get_modpath("moreblocks") then + + stairsplus:register_all("cypress_tree", "wood", "ebiomes:cypress_wood", { + description = "Cypress Wood", + tiles = {"ebiomes_cypress_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("olive_tree", "wood", "ebiomes:olive_wood", { + description = "Olive Wood", + tiles = {"ebiomes_olive_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:cypress_sapling") + flowerpot.register_node("ebiomes:olive_sapling") + + flowerpot.register_node("ebiomes:bush_sapling_warm") + + flowerpot.register_node("ebiomes:black_iris") + flowerpot.register_node("ebiomes:savory") + flowerpot.register_node("ebiomes:chrysanthemum_yellow") + flowerpot.register_node("ebiomes:cladanthus") + flowerpot.register_node("ebiomes:buttercup_persian") + flowerpot.register_node("ebiomes:staehelina") + +end diff --git a/mods/ebiomes/mobs.lua b/mods/ebiomes/mobs.lua new file mode 100644 index 0000000..f09ec78 --- /dev/null +++ b/mods/ebiomes/mobs.lua @@ -0,0 +1,131 @@ +--monsters +if core.get_modpath("mobs_monster") then + mobs:spawn({ + name = "mobs_monster:dirt_monster", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool", "ebiomes:peat_with_swamp_moss_yellow", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + min_light = 0, + max_light = 7, + chance = 6000, + active_object_count = 2, + min_height = 0, + day_toggle = false, + }) + + mobs:spawn({ + name = "mobs_monster:sand_monster", + nodes = {"ebiomes:dry_dirt_with_grass_arid"}, + min_light = 0, + max_light = 7, + chance = 7000, + active_object_count = 2, + min_height = 0, + day_toggle = false, + }) + + + mobs:spawn({ + name = "mobs_monster:spider", + nodes = { + "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:peat_with_swamp_moss_yellow", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass" + }, + min_light = 0, + max_light = 8, + chance = 7000, + active_object_count = 1, + min_height = 25, + max_height = 31000, + }) + + + mobs:spawn({ + name = "mobs_monster:tree_monster", + nodes = {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_swamp", "ebiomes:peat_with_swamp_moss_yellow", "ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, + max_light = 7, + chance = 7000, + min_height = 0, + day_toggle = false, + }) + + + mobs:spawn({ + name = "mobs_monster:land_guard", + nodes = { + "ebiomes:dry_dirt_with_grass_arid", "ebiomes:dry_dirt_with_grass_arid_cool", "ebiomes:dry_dirt_with_humid_savanna_grass" + }, + max_light = 7, + chance = 25000, + min_height = 0, + active_object_count = 1, + }) + +end + + +--animals +if core.get_modpath("mobs_animal") then + + mobs:spawn({ + name = "mobs_animal:cow", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 8000, + min_height = 5, + max_height = 200, + day_toggle = true, + }) + + mobs:spawn({ + name = "mobs_animal:sheep_white", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_warm"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 8000, + min_height = 0, + max_height = 200, + day_toggle = true, + }) + + mobs:spawn({ + name = "mobs_animal:bunny", + nodes = {"ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_grass_med", "ebiomes:dry_dirt_with_humid_savanna_grass", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_jungle_savanna_grass"}, +-- neighbors = {"group:grass"}, + min_light = 12, + interval = 60, + chance = 1600, + min_height = 5, + max_height = 200, + day_toggle = true, + }) + +end + +--npcs +if core.get_modpath("mobs_npc") then + mobs:spawn({ + name = "mobs_npc:npc", + nodes = {"default:brick"}, + neighbors = {"ebiomes:grass_med_3", "ebiomes:grass_steppe_warm_3", "ebiomes:grass_steppe_3", "ebiomes:grass_steppe_cold_3", "ebiomes:grass_cold_3", "ebiomes:grass_warm_3", "ebiomes:grass_arid_3", "ebiomes:grass_arid_cool_3"}, + min_light = 10, + chance = 10000, + active_object_count = 1, + min_height = 0, + day_toggle = true, + }) +end + +--horse +if core.get_modpath("mob_horse") then + mobs:spawn({ + name = "mob_horse:horse", + nodes = {"ebiomes:dirt_with_grass_med", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold"}, + min_light = 14, + interval = 60, + chance = 16000, + min_height = 10, + max_height = 31000, + day_toggle = true + }) +end diff --git a/mods/ebiomes/mod.conf b/mods/ebiomes/mod.conf new file mode 100644 index 0000000..92d8e9b --- /dev/null +++ b/mods/ebiomes/mod.conf @@ -0,0 +1,6 @@ +name = ebiomes +depends = default, stairs, dye +optional_depends = doors, butterflies, fireflies, bucket, dungeon_loot, farming, bonemeal, mobs_animal, mobs_monster, mobs_npc, mob_horse, moreblocks, flowerpot, forgotten_monsters, animalworld +description = Adds extra biomes, while keeping it's looks close to the vanilla minetest game. +author = CowboyLv +title = Extra Biomes diff --git a/mods/ebiomes/nssm.lua b/mods/ebiomes/nssm.lua new file mode 100644 index 0000000..9c8e51a --- /dev/null +++ b/mods/ebiomes/nssm.lua @@ -0,0 +1,133 @@ +local mm = nssm.multimobs + +--[[ +nssm = { + mymapgenis = tonumber(core.settings:get("mymapgenis")) or 7, + multimobs = tonumber(core.settings:get("multimobs")) or 1000, + spiders_litter_web = core.settings:get_bool("spiders_litter_web", true) +} +--]] + + +-- SPIDERS +--[[ + mobs:spawn_specific("nssm:black_widow", + {"default:dirt_with_rainforest_litter", "default:jungletree", "nssm:web" }, + {"air"}, 0, 20, 30, 4400000/mm, 2, -400, 31000) + + mobs:spawn_specific("nssm:daddy_long_legs", + {"default:dirt_with_rainforest_litter", "default:jungletree", "nssm:web" }, + {"air"}, 0, 30, 10, 4400000/mm, 2, -400, 31000) + + mobs:spawn_specific("nssm:tarantula", + {"default:dirt_with_rainforest_litter", "default:jungletree", "nssm:web" }, + {"air"}, 0, 14, 120, 50000000/mm, 1, -400, 31000) + + mobs:spawn_specific("nssm:uloboros", + {"default:dirt_with_rainforest_litter", "default:jungletree", "nssm:web" }, + {"air"}, 0, 20, 30, 4400000/mm, 1, -400, 31000) +--]] + -- DUCKS + + mobs:spawn_specific("nssm:duck", {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_japanese_rainforest_litter"}, + {"group:flora"}, 10, 20, 50, 1500000/mm, 1, -400, 40) + + mobs:spawn_specific("nssm:duckking", {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_japanese_rainforest_litter"}, + {"group:flora"}, 10, 20, 400, 120000000/mm, 1, -400, 40) + + mobs:spawn_specific("nssm:enderduck", {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_japanese_rainforest_litter"}, + {"group:flora"}, 0, 10, 120, 5000000/mm, 1, -400, 40) + + mobs:spawn_specific("nssm:flying_duck", {"air"}, + {"group:leaves"}, 10, 20, 120, 8000000/mm, 1, 1, 40) + + mobs:spawn_specific("nssm:flying_duck", {"air"}, + {"group:flora"}, 10, 20, 120, 25000000/mm, 1, 1, 40) + + mobs:spawn_specific("nssm:spiderduck", {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_forest_litter", "ebiomes:dirt_with_japanese_rainforest_litter"}, + {"group:flora"}, 0, 10, 120, 5000000/mm, 1, -400, 45) + + mobs:spawn_specific("nssm:swimming_duck", {"default:water_source"}, + {"default:water_source"}, 0, 20, 60, 45000000/mm, 1, -400, 40) + + mobs:spawn_specific("nssm:swimming_duck", {"default:river_water_source"}, + {"default:sand","default:river_water_source"}, + 0, 20, 60, 3000000/mm, 1, -400, 300) + + -- MOUNTAINS + + mobs:spawn_specific("nssm:echidna", {"ebiomes:dry_dirt_with_grass_arid"}, + {"default:dry_shrub", "ebiomes:hardy_bush_leaves", "ebiomes:thorn_bush_leaves"}, 0, 20, 200, 100000000/mm, 1, 50, 31000) + + mobs:spawn_specific("nssm:manticore", {"ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_med"}, + {"ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe_cold"}, 10, 20, 60, 13000000/mm, 1, 40, 31000) + + mobs:spawn_specific("nssm:werewolf", {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_japanese_rainforest_litter", "default:dirt_with_coniferous_litter"}, + {"ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold", "ebiomes:dirt_with_japanese_rainforest_litter", "default:dirt_with_coniferous_litter"}, 0, 10, 60, 13000000/mm, 1, 40, 31000) +--[[ + -- ICE + + mobs:spawn_specific("nssm:icelamander", + {"default:snowblock", "default:ice"}, {"default:snowblock", "default:ice"}, + 0, 20, 180, 120000000/mm, 1, -400, 31000) + + mobs:spawn_specific("nssm:icesnake", + {"default:snowblock", "default:ice", "default:dirt_with_snow"}, + {"default:snowblock", "default:ice", "default:dirt_with_snow"}, + 0, 20, 40, 20000000/mm, 1, -400, 31000) + + mobs:spawn_specific("nssm:white_werewolf", + {"default:dirt_with_snow","default:snowblock"}, + {"air"}, 0, 20, 35, 22000000/mm, 1, 50, 31000) + + mobs:spawn_specific("nssm:snow_biter", + {"default:snowblock", "default:ice", "default:dirt_with_snow"}, + {"default:snowblock", "default:ice", "default:dirt_with_snow"}, + 0, 20, 40, 20000000/mm, 1, -400, 31000) +--]] + -- FOREST + + mobs:spawn_specific("nssm:larva", {"ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_forest_litter"}, + {"ebiomes:mizunara_tree", "ebiomes:alder_tree", "ebiomes:pear_tree"}, 0, 20, 40, 800000/mm, 1, -400, 140) + + mobs:spawn_specific("nssm:masticone", {"ebiomes:dirt_with_japanese_rainforest_litter", "ebiomes:dirt_with_grass_cold", "ebiomes:dirt_with_grass_swamp", "ebiomes:dirt_with_grass_warm", "ebiomes:dirt_with_grass_steppe_warm", "ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_forest_litter"}, + {"ebiomes:mizunara_tree", "ebiomes:alder_tree", "ebiomes:pear_tree", "ebiomes:downy_birch_tree"}, 0, 20, 180, 6000000/mm, 2, -400, 140) +--[[ + -- PINE FOREST + + mobs:spawn_specific("nssm:pumpboom_small", + {"default:dirt_with_coniferous_litter", "default:dirt_with_snow", + "default:snowblock"}, {"default:pine_tree"}, + 0, 20, 80, 1400000/mm, 1, -400, 31000) + + mobs:spawn_specific("nssm:pumpboom_medium", + {"default:dirt_with_coniferous_litter", "default:dirt_with_snow", + "default:snowblock"}, {"default:pine_tree"}, + 0, 20, 80, 1600000/mm, 1, -400, 31000) + + mobs:spawn_specific("nssm:pumpboom_large", + {"default:dirt_with_coniferous_litter", "default:dirt_with_snow", + "default:snowblock"}, {"default:pine_tree"}, + 0, 20, 80, 1800000/mm, 1, -400, 31000) + + mobs:spawn_specific("nssm:pumpking", + {"default:dirt_with_coniferous_litter", "default:dirt_with_snow", + "default:snowblock"}, {"default:pine_needles", "default:pine_tree"}, + 0, 12, 120, 8000000/mm, 1, -400, 31000) +--]] + -- SAVANNA + + mobs:spawn_specific("nssm:felucco", {"ebiomes:dry_dirt_with_grass_arid", + "ebiomes:dry_dirt_with_grass_arid"}, {"ebiomes:dry_dirt_with_grass_arid"}, + 0, 20, 80, 20000000/mm, 1, -200, 31000) + +--[[ +if core.get_modpath("nssb") then + + + + + + +end +--]] diff --git a/mods/ebiomes/rereg.lua b/mods/ebiomes/rereg.lua new file mode 100644 index 0000000..54109d8 --- /dev/null +++ b/mods/ebiomes/rereg.lua @@ -0,0 +1,179 @@ +-- Code borrowed from Ethereal by TenPlus1 + +local old_biomes = {} +local old_decor = {} + + +-- backup registered biome data +for key, def in pairs(core.registered_biomes) do + old_biomes[key] = def +end + +for key, def in pairs(core.registered_decorations) do + old_decor[key] = def +end + + +-- clear current biome data +core.clear_registered_biomes() +core.clear_registered_decorations() +-- core.clear_registered_ores() + + +-- create list of default biomes to remove +local def_biomes = { + ["snowy_grassland"] = 1, +} + + +-- only re-register biomes that aren't on the list +for key, def in pairs(old_biomes) do + + if not def_biomes[key] then + core.register_biome(def) + end +end + + +-- loop through decorations +for key, def in pairs(old_decor) do + + local can_add = true + local new_biomes = {} + + if type(def.biomes) == "table" then + + -- loop through decoration biomes, only re-add one's not on above list + for num, bio in pairs(def.biomes) do + + if not def_biomes[bio] then + table.insert(new_biomes, bio) + end + end + + -- if no biomes are left on new list, do not re-add decoration + if #new_biomes == 0 then + can_add = false + end + + elseif type(def.biomes) == "string" then + + if def_biomes[def.biomes] then + can_add = false + else + new_biomes = {def.biomes} -- convert to table + end + + elseif not def.biomes then + new_biomes = nil -- keep it nil for re-adding + end + + if can_add == true then + + def.biomes = new_biomes + + core.register_decoration(def) + end +end + + +--Snowy grassland new + + -- Pine bush + + -- Snowy grassland + + core.register_biome({ + name = "snowy_grassland", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 20, + humidity_point = 35, + }) + + core.register_biome({ + name = "snowy_grassland_ocean", + node_dust = "default:snow", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 20, + humidity_point = 35, + }) + + core.register_biome({ + name = "snowy_grassland_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 20, + humidity_point = 35, + }) + + -- Dirt + + core.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + -- Only where default:dirt is present as surface material + biomes = {"snowy_grassland"} + }) + + -- Pine bush + + core.register_decoration({ + name = "ebiomes:pine_bush_sg", + deco_type = "schematic", + place_on = {"default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"snowy_grassland"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) diff --git a/mods/ebiomes/savanna.lua b/mods/ebiomes/savanna.lua new file mode 100644 index 0000000..aa464bc --- /dev/null +++ b/mods/ebiomes/savanna.lua @@ -0,0 +1,1406 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +-- Aliases + +core.register_alias("dry_dirt_humid_savanna_grass", "ebiomes:dry_dirt_with_humid_savanna_grass") +core.register_alias("dry_dirt_humid_savanna_grass_footsteps", "ebiomes:dry_dirt_with_humid_savanna_grass_footsteps") +core.register_alias("afzelia_tree", "ebiomes:afzelia_tree") +core.register_alias("afzelia_wood", "ebiomes:afzelia_wood") +core.register_alias("afzelia_leaves", "ebiomes:afzelia_leaves") +core.register_alias("afzelia_sapling", "ebiomes:afzelia_sapling") +core.register_alias("limba_tree", "ebiomes:limba_tree") +core.register_alias("limba_wood", "ebiomes:limba_wood") +core.register_alias("limba_leaves", "ebiomes:limba_leaves") +core.register_alias("limba_sapling", "ebiomes:limba_sapling") +core.register_alias("siri_tree", "ebiomes:siri_tree") +core.register_alias("siri_wood", "ebiomes:siri_wood") +core.register_alias("siri_leaves", "ebiomes:siri_leaves") +core.register_alias("siri_sapling", "ebiomes:siri_sapling") +core.register_alias("tamarind_tree", "ebiomes:tamarind_tree") +core.register_alias("tamarind_wood", "ebiomes:tamarind_wood") +core.register_alias("tamarind_leaves", "ebiomes:tamarind_leaves") +core.register_alias("tamarind_sapling", "ebiomes:tamarind_sapling") +core.register_alias("tamarind_pods", "ebiomes:tamarind_pods") +core.register_alias("tamarind_pulp", "ebiomes:tamarind_pulp") + + +-- Humid Savanna + + core.register_node("ebiomes:dry_dirt_with_humid_savanna_grass", { + description = S("Dry Dirt with Humid Savanna Grass"), + tiles = {"ebiomes_humid_savanna_grass.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^ebiomes_humid_savanna_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dry_dirt_with_humid_savanna_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dry_dirt_with_humid_savanna_grass_footsteps", { + description = S("Dry Dirt with Humid Savanna Grass and Footsteps"), + tiles = {"ebiomes_humid_savanna_grass.png^default_footprint.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^ebiomes_humid_savanna_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dry_dirt_with_humid_savanna_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:humid_savanna_grass_1", { + description = S("Humid Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_humid_savanna_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_humid_savanna_grass_3.png", + wield_image = "ebiomes_humid_savanna_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:humid_savanna_grass_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:humid_savanna_grass_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:humid_savanna_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:humid_savanna_grass_" .. i, { + description = S("Humid Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_humid_savanna_grass_" .. i .. ".png"}, + inventory_image = "ebiomes_humid_savanna_grass_" .. i .. ".png", + wield_image = "ebiomes_humid_savanna_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:humid_savanna_grass_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:humid_savanna_grass_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "humid_savanna", + node_top = "ebiomes:dry_dirt_with_humid_savanna_grass", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 89, + humidity_point = 54, + }) + + core.register_biome({ + name = "humid_savanna_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 89, + humidity_point = 54, + }) + + core.register_biome({ + name = "humid_savanna_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 89, + humidity_point = 54, + }) + + core.register_biome({ + name = "humid_savanna_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 89, + humidity_point = 54, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:humid_savanna_grass_"..length, + deco_type = "simple", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.08, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:humid_savanna_grass_"..length, + }) +end + + +--Grasses + + + core.register_node("ebiomes:jaragua_grass", { + description = S("Jaragua Grass"), + drawtype = "plantlike", +-- drawtype = "firelike", + waving = 1, + visual_scale = 1.4, + tiles = {"ebiomes_jaragua_grass.png"}, + inventory_image = "ebiomes_jaragua_grass.png", + wield_image = "ebiomes_jaragua_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16}, + }, + groups = {snappy = 3, flammable = 2, grass = 1}, + sounds = default.node_sound_leaves_defaults(), + }) + + core.register_decoration({ + name = "ebiomes:jaragua_grass", + deco_type = "simple", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.1, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 357, + octaves = 3, + persist = 0.7 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:jaragua_grass", + }) + +--Decors + +--Trees + +--New trees + + +--Afzelia + + core.register_node("ebiomes:afzelia_tree", { + description = S("Afzelia Tree"), + tiles = {"ebiomes_afzelia_tree_top.png", "ebiomes_afzelia_tree_top.png", + "ebiomes_afzelia_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:afzelia_wood", { + description = S("Afzelia Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_afzelia_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:afzelia_wood 4", + recipe = { + {"ebiomes:afzelia_tree"}, + } + }) + + core.register_node("ebiomes:afzelia_leaves", { + description = S("Afzelia Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_afzelia_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:afzelia_sapling"}, rarity = 20}, + {items = {"ebiomes:afzelia_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:afzelia_tree"}, + leaves = {"ebiomes:afzelia_leaves"}, + radius = 3, + }) + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_afzelia_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-6, y = pos.y, z = pos.z-6}, modpath.."/schematics/ebiomes_afzelia_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_afzelia_tree.mts" + + core.register_node("ebiomes:afzelia_sapling", { + description = S("Afzelia Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_afzelia_sapling.png"}, + inventory_image = "ebiomes_afzelia_sapling.png", + wield_image = "ebiomes_afzelia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_afzelia_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:afzelia_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -6, y = 1, z = -6}, + {x = 6, y = 14, z = 6}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:afzelia_tree", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 201, + octaves = 3, + persist = 0.66 + }, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_afzelia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:afzelia_log", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0001, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_afzelia_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:afzelia_sapling", grow_new_afzelia_tree, "soil"}, +}) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("afzelia_wood", "ebiomes:afzelia_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_afzelia_wood.png"}, + S("Afzelia Wood Stair"), + S("Afzelia Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Afzelia Wood Stair"), + S("Outer Afzelia Wood Stair") + ) + + default.register_fence("ebiomes:fence_afzelia_wood", { + description = S("Afzelia Wood Fence"), + texture = "ebiomes_fence_afzelia_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_afzelia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_afzelia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:afzelia_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_afzelia_wood", { + description = S("Afzelia Wood Fence Rail"), + texture = "ebiomes_fence_rail_afzelia_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_afzelia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_afzelia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:afzelia_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_afzelia_wood", { + description = S("Afzelia Wood Mese Post Light"), + texture = "ebiomes_fence_afzelia_wood.png", + material = "ebiomes:afzelia_wood", + }) + + doors.register_fencegate("ebiomes:gate_afzelia_wood", { + description = S("Afzelia Wood Fence Gate"), + texture = "ebiomes_afzelia_wood.png", + material = "ebiomes:afzelia_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_afzelia_wood_closed", + burntime = 9, + }) + +--Extras + +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("afzelia_tree", "wood", "ebiomes:afzelia_wood", { + description = "Afzelia Wood", + tiles = {"ebiomes_afzelia_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:afzelia_sapling") + +end + + +--Limba + + core.register_node("ebiomes:limba_tree", { + description = S("Limba Tree"), + tiles = {"ebiomes_limba_tree_top.png", "ebiomes_limba_tree_top.png", + "ebiomes_limba_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:limba_wood", { + description = S("Limba Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_limba_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:limba_wood 4", + recipe = { + {"ebiomes:limba_tree"}, + } + }) + + core.register_node("ebiomes:limba_leaves", { + description = S("Limba Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_limba_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:limba_sapling"}, rarity = 20}, + {items = {"ebiomes:limba_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:limba_tree"}, + leaves = {"ebiomes:limba_leaves"}, + radius = 3, + }) + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_limba_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/ebiomes_limba_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_limba_tree.mts" + + core.register_node("ebiomes:limba_sapling", { + description = S("Limba Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_limba_sapling.png"}, + inventory_image = "ebiomes_limba_sapling.png", + wield_image = "ebiomes_limba_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_limba_tree, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 3 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:limba_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -4, y = 1, z = -4}, + {x = 4, y = 15, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:limba_tree", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.002, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 202, + octaves = 3, + persist = 0.66 + }, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_limba_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:limba_log", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0005, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_limba_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:limba_sapling", grow_new_limba_tree, "soil"}, +}) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("limba_wood", "ebiomes:limba_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_limba_wood.png"}, + S("Limba Wood Stair"), + S("Limba Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Limba Wood Stair"), + S("Outer Limba Wood Stair") + ) + + default.register_fence("ebiomes:fence_limba_wood", { + description = S("Limba Wood Fence"), + texture = "ebiomes_fence_limba_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_limba_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_limba_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:limba_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_limba_wood", { + description = S("Limba Wood Fence Rail"), + texture = "ebiomes_fence_rail_limba_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_limba_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_limba_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:limba_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_limba_wood", { + description = S("Limba Wood Mese Post Light"), + texture = "ebiomes_fence_limba_wood.png", + material = "ebiomes:limba_wood", + }) + + doors.register_fencegate("ebiomes:gate_limba_wood", { + description = S("Limba Wood Fence Gate"), + texture = "ebiomes_limba_wood.png", + material = "ebiomes:limba_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_limba_wood_closed", + burntime = 9, + }) + +--Extras + +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("limba_tree", "wood", "ebiomes:limba_wood", { + description = "Limba Wood", + tiles = {"ebiomes_limba_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:limba_sapling") + +end + +--Black Limba wood + + core.register_node("ebiomes:limba_black_wood", { + description = S("Black Limba Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_limba_black_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) +--have to do this because a singular item craft is supposed to craft sticks + core.register_craft({ + output = "ebiomes:limba_black_wood 5", + recipe = { + {"ebiomes:limba_wood", "", "ebiomes:limba_wood"}, + {"", "ebiomes:limba_wood", ""}, + {"ebiomes:limba_wood", "", "ebiomes:limba_wood"}, + } + }) + + core.register_craft({ + output = "ebiomes:limba_wood 5", + recipe = { + {"ebiomes:limba_black_wood", "", "ebiomes:limba_black_wood"}, + {"", "ebiomes:limba_black_wood", ""}, + {"ebiomes:limba_black_wood", "", "ebiomes:limba_black_wood"}, + } + }) + +--forms sampled from pigiron mod + stairs.register_stair_and_slab("limba_black_wood", "ebiomes:limba_black_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_limba_black_wood.png"}, + S("Black Limba Wood Stair"), + S("Black Limba Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Black Limba Wood Stair"), + S("Outer Black Limba Wood Stair") + ) + + default.register_fence("ebiomes:fence_limba_black_wood", { + description = S("Black Limba Wood Fence"), + texture = "ebiomes_fence_limba_black_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_limba_black_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_limba_black_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:limba_black_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_limba_black_wood", { + description = S("Black Limba Wood Fence Rail"), + texture = "ebiomes_fence_rail_limba_black_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_limba_black_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_limba_black_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:limba_black_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_limba_black_wood", { + description = S("Black Limba Wood Mese Post Light"), + texture = "ebiomes_fence_limba_black_wood.png", + material = "ebiomes:limba_black_wood", + }) + + doors.register_fencegate("ebiomes:gate_limba_black_wood", { + description = S("Black Limba Wood Fence Gate"), + texture = "ebiomes_limba_black_wood.png", + material = "ebiomes:limba_black_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_limba_black_wood_closed", + burntime = 9, + }) + +--Extras + +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("" , "wood", "ebiomes:limba_black_wood", { + description = "Black Limba Wood", + tiles = {"ebiomes_limba_black_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +end + +--Siri + + core.register_node("ebiomes:siri_tree", { + description = S("Siri Tree"), + tiles = {"ebiomes_siri_tree_top.png", "ebiomes_siri_tree_top.png", + "ebiomes_siri_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:siri_wood", { + description = S("Siri Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_siri_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:siri_wood 4", + recipe = { + {"ebiomes:siri_tree"}, + } + }) + + core.register_node("ebiomes:siri_leaves", { + description = S("Siri Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_siri_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:siri_sapling"}, rarity = 20}, + {items = {"ebiomes:siri_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:siri_tree"}, + leaves = {"ebiomes:siri_leaves"}, + radius = 3, + }) + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_siri_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_siri_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_siri_tree.mts" + + core.register_node("ebiomes:siri_sapling", { + description = S("Siri Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_siri_sapling.png"}, + inventory_image = "ebiomes_siri_sapling.png", + wield_image = "ebiomes_siri_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_siri_tree, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, -3 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:siri_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -2}, + {x = 4, y = 9, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:siri_tree", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 203, + octaves = 3, + persist = 0.66 + }, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_siri_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:siri_log", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0005, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_siri_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:siri_sapling", grow_new_siri_tree, "soil"}, +}) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("siri_wood", "ebiomes:siri_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_siri_wood.png"}, + S("Siri Wood Stair"), + S("Siri Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Siri Wood Stair"), + S("Outer Siri Wood Stair") + ) + + default.register_fence("ebiomes:fence_siri_wood", { + description = S("Siri Wood Fence"), + texture = "ebiomes_fence_siri_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_siri_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_siri_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:siri_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_siri_wood", { + description = S("Siri Wood Fence Rail"), + texture = "ebiomes_fence_rail_siri_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_siri_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_siri_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:siri_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_siri_wood", { + description = S("Siri Wood Mese Post Light"), + texture = "ebiomes_fence_siri_wood.png", + material = "ebiomes:siri_wood", + }) + + doors.register_fencegate("ebiomes:gate_siri_wood", { + description = S("Siri Wood Fence Gate"), + texture = "ebiomes_siri_wood.png", + material = "ebiomes:siri_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_siri_wood_closed", + burntime = 9, + }) + +--Extras + +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("siri_tree", "wood", "ebiomes:siri_wood", { + description = "Siri Wood", + tiles = {"ebiomes_siri_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:siri_sapling") + +end + + + + +--Tamarind + + core.register_node("ebiomes:tamarind_tree", { + description = S("Tamarind Tree"), + tiles = {"ebiomes_tamarind_tree_top.png", "ebiomes_tamarind_tree_top.png", + "ebiomes_tamarind_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:tamarind_wood", { + description = S("Tamarind Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_tamarind_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:tamarind_wood 4", + recipe = { + {"ebiomes:tamarind_tree"}, + } + }) + + core.register_node("ebiomes:tamarind_leaves", { + description = S("Tamarind Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_tamarind_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:tamarind_sapling"}, rarity = 20}, + {items = {"ebiomes:tamarind_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:tamarind_tree"}, + leaves = {"ebiomes:tamarind_leaves"}, + radius = 3, + }) + + core.register_node("ebiomes:tamarind_pods_hanging", { + description = S("Hanging Tamarind Pods"), + drawtype = "plantlike", + tiles = {"ebiomes_tamarind_pods_hanging.png"}, + inventory_image = "ebiomes_tamarind_pods_hanging.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, 3 / 16, -6 / 16, 6 / 16, 0.5, 6 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:tamarind_pods"}}, + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:tamarind_pods_hanging", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, {name = "ebiomes:tamarind_pods_mark"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, + }) + + core.register_node("ebiomes:tamarind_pods_hanging_mark", { + description = S("Hanging Tamarind Pod Marker"), + inventory_image = "ebiomes_tamarind_pods.png^default_invisible_node_overlay.png", + wield_image = "ebiomes_tamarind_pods.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, "ebiomes:olive_leaves") then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:tamarind_pods"}) + end + end + }) + + core.register_craftitem("ebiomes:tamarind_pods", { + description = S("Tamarind Pods"), + inventory_image = "ebiomes_tamarind_pods.png", + groups = {legumes = 1}, + }) + + core.register_craft({ + output = "ebiomes:tamarind_pulp 2", + recipe = { + {"ebiomes:tamarind_pods"}, + } + }) + + core.register_craftitem("ebiomes:tamarind_pulp", { + description = S("Tamarind Pulp"), + inventory_image = "ebiomes_tamarind_pulp.png", + groups = {food_pulps = 1, eatable = 3}, + on_use = core.item_eat(3), + }) + + +--borrowed from runs cooltrees modpack (baldcypress) +--[[ +local function grow_new_baldcypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(240, 600)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/baldcypress.mts", "0", nil, false) +end +--]] + +local function grow_new_tamarind_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_tamarind_tree.mts", "0", nil, false) +end + +--schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_tamarind_tree.mts" + + core.register_node("ebiomes:tamarind_sapling", { + description = S("Tamarind Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_tamarind_sapling.png"}, + inventory_image = "ebiomes_tamarind_sapling.png", + wield_image = "ebiomes_tamarind_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_tamarind_tree, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, -2 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:tamarind_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 8, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:tamarind_tree", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + sidelen = 16, + noise_params = { + offset = 0.002, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 204, + octaves = 3, + persist = 0.66 + }, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_tamarind_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:tamarind_log", + deco_type = "schematic", + place_on = {"ebiomes:dry_dirt_with_humid_savanna_grass"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0005, + biomes = {"humid_savanna"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_tamarind_log.mts", + flags = "place_center_x", + rotation = "random" + }) + +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {"ebiomes:tamarind_sapling", grow_new_tamarind_tree, "soil"}, + }) +end +--forms sampled from pigiron mod + stairs.register_stair_and_slab("tamarind_wood", "ebiomes:tamarind_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_tamarind_wood.png"}, + S("Tamarind Wood Stair"), + S("Tamarind Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Tamarind Wood Stair"), + S("Outer Tamarind Wood Stair") + ) + + default.register_fence("ebiomes:fence_tamarind_wood", { + description = S("Tamarind Wood Fence"), + texture = "ebiomes_fence_tamarind_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_tamarind_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_tamarind_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:tamarind_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_tamarind_wood", { + description = S("Tamarind Wood Fence Rail"), + texture = "ebiomes_fence_rail_tamarind_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_tamarind_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_tamarind_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:tamarind_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_tamarind_wood", { + description = S("Tamarind Wood Mese Post Light"), + texture = "ebiomes_fence_tamarind_wood.png", + material = "ebiomes:tamarind_wood", + }) + + doors.register_fencegate("ebiomes:gate_tamarind_wood", { + description = S("Tamarind Wood Fence Gate"), + texture = "ebiomes_tamarind_wood.png", + material = "ebiomes:tamarind_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_tamarind_wood_closed", + burntime = 9, + }) + +--Extras + +if core.global_exists("dungeon_loot") then + dungeon_loot.register ({ + {name = "ebiomes:tamarind_pulp", chance = 0.3, count = {4, 12}}, + }) +end + +if core.get_modpath("moreblocks") then + + + stairsplus:register_all("tamarind_tree", "wood", "ebiomes:tamarind_wood", { + description = "Tamarind Wood", + tiles = {"ebiomes_tamarind_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:tamarind_sapling") + +end + +--Additionals + +--Ground stuff +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_deco({ + {"ebiomes:dry_dirt_with_humid_savanna_grass", {"ebiomes:humid_savanna_grass_1", "ebiomes:humid_savanna_grass_2", "ebiomes:humid_savanna_grass_3", "ebiomes:humid_savanna_grass_4", "ebiomes:humid_savanna_grass_5"}, + {"ebiomes:jaragua_grass"} } + }) + +end diff --git a/mods/ebiomes/schematics/ebiomes_afzelia_log.mts b/mods/ebiomes/schematics/ebiomes_afzelia_log.mts new file mode 100644 index 0000000..47f4177 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_afzelia_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_afzelia_tree.mts b/mods/ebiomes/schematics/ebiomes_afzelia_tree.mts new file mode 100644 index 0000000..32a583b Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_afzelia_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_alder_log.mts b/mods/ebiomes/schematics/ebiomes_alder_log.mts new file mode 100644 index 0000000..3eb3ab7 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_alder_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_alder_tree.mts b/mods/ebiomes/schematics/ebiomes_alder_tree.mts new file mode 100644 index 0000000..889de9d Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_alder_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_ash_log.mts b/mods/ebiomes/schematics/ebiomes_ash_log.mts new file mode 100644 index 0000000..4f13725 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_ash_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_ash_tree.mts b/mods/ebiomes/schematics/ebiomes_ash_tree.mts new file mode 100644 index 0000000..e79f7af Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_ash_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_aspen_log.mts b/mods/ebiomes/schematics/ebiomes_aspen_log.mts new file mode 100644 index 0000000..6b3b125 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_aspen_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_bamboo.mts b/mods/ebiomes/schematics/ebiomes_bamboo.mts new file mode 100644 index 0000000..2adaa1f Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_bamboo.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_beech_log.mts b/mods/ebiomes/schematics/ebiomes_beech_log.mts new file mode 100644 index 0000000..7640da0 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_beech_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_beech_tree.mts b/mods/ebiomes/schematics/ebiomes_beech_tree.mts new file mode 100644 index 0000000..92b48c4 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_beech_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_birch_log.mts b/mods/ebiomes/schematics/ebiomes_birch_log.mts new file mode 100644 index 0000000..c996914 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_birch_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_birch_tree.mts b/mods/ebiomes/schematics/ebiomes_birch_tree.mts new file mode 100644 index 0000000..b2bee1c Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_birch_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_blackcurrant_bush.mts b/mods/ebiomes/schematics/ebiomes_blackcurrant_bush.mts new file mode 100644 index 0000000..c0016bd Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_blackcurrant_bush.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_bush_warm.mts b/mods/ebiomes/schematics/ebiomes_bush_warm.mts new file mode 100644 index 0000000..259d0f8 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_bush_warm.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_chestnut_log.mts b/mods/ebiomes/schematics/ebiomes_chestnut_log.mts new file mode 100644 index 0000000..3fd4746 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_chestnut_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_chestnut_tree.mts b/mods/ebiomes/schematics/ebiomes_chestnut_tree.mts new file mode 100644 index 0000000..3968f90 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_chestnut_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_cowberry_bush.mts b/mods/ebiomes/schematics/ebiomes_cowberry_bush.mts new file mode 100644 index 0000000..c80633a Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_cowberry_bush.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_cypress_log.mts b/mods/ebiomes/schematics/ebiomes_cypress_log.mts new file mode 100644 index 0000000..c884260 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_cypress_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_cypress_tree.mts b/mods/ebiomes/schematics/ebiomes_cypress_tree.mts new file mode 100644 index 0000000..fa60ed7 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_cypress_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_downy_birch_log.mts b/mods/ebiomes/schematics/ebiomes_downy_birch_log.mts new file mode 100644 index 0000000..4d6ca94 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_downy_birch_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_downy_birch_tree.mts b/mods/ebiomes/schematics/ebiomes_downy_birch_tree.mts new file mode 100644 index 0000000..7242024 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_downy_birch_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_gooseberry_bush.mts b/mods/ebiomes/schematics/ebiomes_gooseberry_bush.mts new file mode 100644 index 0000000..7a1fe4d Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_gooseberry_bush.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_hardy_bush.mts b/mods/ebiomes/schematics/ebiomes_hardy_bush.mts new file mode 100644 index 0000000..ba773f7 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_hardy_bush.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_hornbeam_log.mts b/mods/ebiomes/schematics/ebiomes_hornbeam_log.mts new file mode 100644 index 0000000..17dff9a Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_hornbeam_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_hornbeam_tree.mts b/mods/ebiomes/schematics/ebiomes_hornbeam_tree.mts new file mode 100644 index 0000000..a396159 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_hornbeam_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_limba_log.mts b/mods/ebiomes/schematics/ebiomes_limba_log.mts new file mode 100644 index 0000000..6e69924 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_limba_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_limba_tree.mts b/mods/ebiomes/schematics/ebiomes_limba_tree.mts new file mode 100644 index 0000000..c1d7e7b Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_limba_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_maple_log.mts b/mods/ebiomes/schematics/ebiomes_maple_log.mts new file mode 100644 index 0000000..0cc0146 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_maple_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_maple_tree.mts b/mods/ebiomes/schematics/ebiomes_maple_tree.mts new file mode 100644 index 0000000..8345bb7 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_maple_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_mizunara_log.mts b/mods/ebiomes/schematics/ebiomes_mizunara_log.mts new file mode 100644 index 0000000..3fd1d12 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_mizunara_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_mizunara_tree.mts b/mods/ebiomes/schematics/ebiomes_mizunara_tree.mts new file mode 100644 index 0000000..372dfe4 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_mizunara_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_oak_log.mts b/mods/ebiomes/schematics/ebiomes_oak_log.mts new file mode 100644 index 0000000..15462ce Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_oak_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_oak_tree.mts b/mods/ebiomes/schematics/ebiomes_oak_tree.mts new file mode 100644 index 0000000..d27106e Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_oak_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_olive_log.mts b/mods/ebiomes/schematics/ebiomes_olive_log.mts new file mode 100644 index 0000000..d4a3b63 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_olive_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_olive_tree.mts b/mods/ebiomes/schematics/ebiomes_olive_tree.mts new file mode 100644 index 0000000..8a77f92 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_olive_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_pear_log.mts b/mods/ebiomes/schematics/ebiomes_pear_log.mts new file mode 100644 index 0000000..8505a65 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_pear_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_pear_tree.mts b/mods/ebiomes/schematics/ebiomes_pear_tree.mts new file mode 100644 index 0000000..bdb5640 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_pear_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_peashrub.mts b/mods/ebiomes/schematics/ebiomes_peashrub.mts new file mode 100644 index 0000000..c90660e Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_peashrub.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_pine_log.mts b/mods/ebiomes/schematics/ebiomes_pine_log.mts new file mode 100644 index 0000000..891a2d5 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_pine_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_quagmire_small.mts b/mods/ebiomes/schematics/ebiomes_quagmire_small.mts new file mode 100644 index 0000000..88f8dc9 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_quagmire_small.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_quagmire_small_np.mts b/mods/ebiomes/schematics/ebiomes_quagmire_small_np.mts new file mode 100644 index 0000000..93feb2c Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_quagmire_small_np.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_quagmire_vsmall.mts b/mods/ebiomes/schematics/ebiomes_quagmire_vsmall.mts new file mode 100644 index 0000000..68e671f Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_quagmire_vsmall.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_quagmire_vsmall_np.mts b/mods/ebiomes/schematics/ebiomes_quagmire_vsmall_np.mts new file mode 100644 index 0000000..b9bf2c5 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_quagmire_vsmall_np.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_quince_log.mts b/mods/ebiomes/schematics/ebiomes_quince_log.mts new file mode 100644 index 0000000..286b53c Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_quince_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_quince_tree.mts b/mods/ebiomes/schematics/ebiomes_quince_tree.mts new file mode 100644 index 0000000..ed60086 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_quince_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_redcurrant_bush.mts b/mods/ebiomes/schematics/ebiomes_redcurrant_bush.mts new file mode 100644 index 0000000..544bca2 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_redcurrant_bush.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_siri_log.mts b/mods/ebiomes/schematics/ebiomes_siri_log.mts new file mode 100644 index 0000000..8e3f999 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_siri_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_siri_tree.mts b/mods/ebiomes/schematics/ebiomes_siri_tree.mts new file mode 100644 index 0000000..b6d1ff3 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_siri_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_stoneoak_log.mts b/mods/ebiomes/schematics/ebiomes_stoneoak_log.mts new file mode 100644 index 0000000..d4bad88 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_stoneoak_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_stoneoak_tree.mts b/mods/ebiomes/schematics/ebiomes_stoneoak_tree.mts new file mode 100644 index 0000000..b92619d Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_stoneoak_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_sugi_log.mts b/mods/ebiomes/schematics/ebiomes_sugi_log.mts new file mode 100644 index 0000000..e670db4 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_sugi_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_sugi_tree.mts b/mods/ebiomes/schematics/ebiomes_sugi_tree.mts new file mode 100644 index 0000000..5557263 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_sugi_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_swamp_hole.mts b/mods/ebiomes/schematics/ebiomes_swamp_hole.mts new file mode 100644 index 0000000..2b95e2b Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_swamp_hole.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_tamarind_log.mts b/mods/ebiomes/schematics/ebiomes_tamarind_log.mts new file mode 100644 index 0000000..39f9890 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_tamarind_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_tamarind_tree.mts b/mods/ebiomes/schematics/ebiomes_tamarind_tree.mts new file mode 100644 index 0000000..46b75e0 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_tamarind_tree.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_thorn_bush.mts b/mods/ebiomes/schematics/ebiomes_thorn_bush.mts new file mode 100644 index 0000000..7eb0029 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_thorn_bush.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_willow_log.mts b/mods/ebiomes/schematics/ebiomes_willow_log.mts new file mode 100644 index 0000000..1f87608 Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_willow_log.mts differ diff --git a/mods/ebiomes/schematics/ebiomes_willow_tree.mts b/mods/ebiomes/schematics/ebiomes_willow_tree.mts new file mode 100644 index 0000000..990b35a Binary files /dev/null and b/mods/ebiomes/schematics/ebiomes_willow_tree.mts differ diff --git a/mods/ebiomes/screenshot.png b/mods/ebiomes/screenshot.png new file mode 100644 index 0000000..0883361 Binary files /dev/null and b/mods/ebiomes/screenshot.png differ diff --git a/mods/ebiomes/settingtypes.txt b/mods/ebiomes/settingtypes.txt new file mode 100644 index 0000000..c0ceaa1 --- /dev/null +++ b/mods/ebiomes/settingtypes.txt @@ -0,0 +1,42 @@ +# Whether the mod registers Bamboo, disable it if using another mod for bamboo +reg_bamboo (Register Bamboo) bool true + +# Registers Arid Grasslands bordering deserts +reg_arids (Register Arid Grasslands) bool true + +# Registers Biome Buffers, to increase their surface area +reg_buffers (Register Biome Buffers) bool true + +reg_cswamps (Cold Deciduous Forest, Swamp, Bog) bool true + +reg_mediterranean (Register Mediterranean) bool true + +reg_steppes (Register Steppes) bool true + +reg_warms (Warm Deciduous Forest and Grassland) bool true + +reg_hsavanna (Register Humid Savanna) bool true + +# Depends on humid savanna +reg_jsavanna (Register Jungle Savanna) bool true + +reg_jprainforest (Register Japanese Rainforest) bool true + +reg_trainforest (Register Temperate Rainforest) bool true + +# Improves Some of the Default Biomes, making them more coherent with the additions (Curently grassland and deciduous forest, maple and oak also reside here for the time being). Depends on Cold deciduous and Warm biome branches. +reg_extensions (Register Default Biome Extensions) bool true + +# Toggle lighter mapgen, makes decorations more sparse in the denser biomes for increased performance +light_mapgen (Light Mapgen) bool false + +supp_mobs (Support Mobs Monster, Mobs Animal, Mobs NPC, Mob Horse) bool true + +supp_forgotten_monsters (Support Forgotten Monsters) bool true + +supp_animalworld (Support Wilhelmines Animal World) bool true + +supp_nssm (Support Not So Simple Mobs) bool true + +# Enable this to make quagmires generate without cranberries. There will be some plants(including small ammount of cranberries) on the quagmire due to plants generating later +pl_quagmires (Plantless Quagmires) bool false diff --git a/mods/ebiomes/steppes.lua b/mods/ebiomes/steppes.lua new file mode 100644 index 0000000..3354d0e --- /dev/null +++ b/mods/ebiomes/steppes.lua @@ -0,0 +1,1026 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Aliases + +core.register_alias("dirt_with_steppe_grass", "ebiomes:dirt_with_grass_steppe") +core.register_alias("dirt_with_steppe_grass_footsteps", "ebiomes:dirt_with_grass_steppe_footsteps") +core.register_alias("dirt_with_warm_steppe_grass", "ebiomes:dirt_with_grass_steppe_warm") +core.register_alias("dirt_with_warm_steppe_grass_footsteps", "ebiomes:dirt_with_grass_steppe_warm_footsteps") +core.register_alias("dirt_with_cold_steppe_grass", "ebiomes:dirt_with_grass_steppe_cold") +core.register_alias("dirt_with_cold_steppe_grass_footsteps", "ebiomes:dirt_with_grass_steppe_cold_footsteps") + +core.register_alias("peashrub_peas", "ebiomes:peashrub_peas") +core.register_alias("cooked_peas", "ebiomes:peas_cooked") +core.register_alias("bucket_with_peas", "ebiomes:bucket_peas") +core.register_alias("cooked_peas", "ebiomes:peas_cooked") +core.register_alias("peashrub_leaves_with_peas", "ebiomes:peashrub_leaves_with_peas") +core.register_alias("peashrub_stem", "ebiomes:peashrub_stem") +core.register_alias("peashrub_leaves", "ebiomes:peashrub_leaves") +core.register_alias("peashrub_sapling", "ebiomes:peashrub_sapling") + +core.register_alias("blue_allium", "ebiomes:blue_allium") +core.register_alias("purple_blue_allium", "ebiomes:blue_allium_purple") +core.register_alias("altai_tulip", "ebiomes:altai_tulip") +core.register_alias("russian_iris", "ebiomes:russian_iris") +core.register_alias("siberian_lily", "ebiomes:siberian_lily") +core.register_alias("mountain_lily", "ebiomes:mountain_lily") + +--Steppe + + core.register_node("ebiomes:dirt_with_grass_steppe", { + description = S("Dirt with Steppe Grass"), + tiles = {"ebiomes_grass_steppe.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_steppe_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_grass_steppe", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_grass_steppe_footsteps", { + description = S("Dirt with Steppe Grass and Footsteps"), + tiles = {"ebiomes_grass_steppe.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_steppe_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_steppe_1", { + description = S("Steppe Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_steppe_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_steppe_3.png", + wield_image = "ebiomes_grass_steppe_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_steppe_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_steppe_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_steppe_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_steppe_" .. i, { + description = S("Steppe Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_steppe_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_steppe_" .. i .. ".png", + wield_image = "ebiomes_grass_steppe_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_steppe_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_steppe_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "steppe", + node_top = "ebiomes:dirt_with_grass_steppe", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 35, + humidity_point = 35, + }) + + core.register_biome({ + name = "steppe_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 35, + humidity_point = 35, + }) + + core.register_biome({ + name = "steppe_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 35, + humidity_point = 35, + }) + + core.register_biome({ + name = "steppe_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 35, + humidity_point = 35, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_steppe_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_steppe_"..length, + }) +end + +--Warm Steppe + + core.register_node("ebiomes:dirt_with_grass_steppe_warm", { + description = S("Dirt with Warm Steppe Grass"), + tiles = {"ebiomes_grass_steppe_warm.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_steppe_warm_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_grass_steppe_warm", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_grass_steppe_warm_footsteps", { + description = S("Dirt with steppeiterranean Grass and Footsteps"), + tiles = {"ebiomes_grass_steppe_warm.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_steppe_warm_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_steppe_warm_1", { + description = S("Warm Steppe Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_steppe_warm_1.png"}, + -- Use texture of a taller grass_warm stage in inventory + inventory_image = "ebiomes_grass_steppe_warm_3.png", + wield_image = "ebiomes_grass_steppe_warm_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_steppe_warm_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass_warm node + local stack = ItemStack("ebiomes:grass_steppe_warm_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_steppe_warm_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_steppe_warm_" .. i, { + description = S("Warm Steppe Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_steppe_warm_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_steppe_warm_" .. i .. ".png", + wield_image = "ebiomes_grass_steppe_warm_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_steppe_warm_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_steppe_warm_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "warm_steppe", + node_top = "ebiomes:dirt_with_grass_steppe_warm", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 40, + humidity_point = 35, + }) + + core.register_biome({ + name = "warm_steppe_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 40, + humidity_point = 35, + }) + + core.register_biome({ + name = "warm_steppe_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 40, + humidity_point = 35, + }) + + core.register_biome({ + name = "warm_steppe_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 40, + humidity_point = 35, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_steppe_warm_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_warm"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_steppe_warm_"..length, + }) +end + +--Cold Steppe + + core.register_node("ebiomes:dirt_with_grass_steppe_cold", { + description = S("Dirt with Cold Steppe Grass"), + tiles = {"ebiomes_grass_steppe_cold.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_steppe_cold_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:dirt_with_grass_steppe_cold_footsteps", { + description = S("Dirt with steppeiterranean Grass and Footsteps"), + tiles = {"ebiomes_grass_steppe_cold.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_steppe_cold_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_steppe_cold_1", { + description = S("Cold Steppe Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_steppe_cold_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_steppe_cold_3.png", + wield_image = "ebiomes_grass_steppe_cold_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_steppe_cold_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_steppe_cold_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_steppe_cold_" .. i, { + description = S("Cold Steppe Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_steppe_cold_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_steppe_cold_" .. i .. ".png", + wield_image = "ebiomes_grass_steppe_cold_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_steppe_cold_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "cold_steppe", + node_top = "ebiomes:dirt_with_grass_steppe_cold", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 25, + humidity_point = 35, + }) + + core.register_biome({ + name = "cold_steppe_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 25, + humidity_point = 35, + }) + + core.register_biome({ + name = "cold_steppe_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 25, + humidity_point = 35, + }) + + core.register_biome({ + name = "cold_steppe_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 25, + humidity_point = 35, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_steppe_cold_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_cold"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_steppe_cold_"..length, + }) +end + +--Folliage + +--Biome specific + + core.register_node("ebiomes:blue_allium", { + description = S("Blue Allium"), + tiles = {"ebiomes_blue_allium.png"}, + inventory_image = "ebiomes_blue_allium.png", + wield_image = "ebiomes_blue_allium.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:blue 4", + recipe = { + {"ebiomes:blue_allium"} + }, + }) + + core.register_decoration({ + name = "ebiomes:blue_allium", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 333, + octaves = 3, + persist = 0.004 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:blue_allium", + }) + + core.register_node("ebiomes:blue_allium_purple", { + description = S("Purple Blue Allium"), + tiles = {"ebiomes_blue_allium_purple.png"}, + inventory_image = "ebiomes_blue_allium_purple.png", + wield_image = "ebiomes_blue_allium_purple.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:violet 4", + recipe = { + {"ebiomes:blue_allium_purple"} + }, + }) + + core.register_decoration({ + name = "ebiomes:blue_allium_purple", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 335, + octaves = 3, + persist = 0.03 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:blue_allium_purple", + }) + + core.register_node("ebiomes:altai_tulip", { + description = S("Altai Tulip"), + tiles = {"ebiomes_altai_tulip.png"}, + inventory_image = "ebiomes_altai_tulip.png", + wield_image = "ebiomes_altai_tulip.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:yellow 4", + recipe = { + {"ebiomes:altai_tulip"} + }, + }) + + core.register_decoration({ + name = "ebiomes:altai_tulip", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 350, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:altai_tulip", + }) + + --warm + + core.register_node("ebiomes:russian_iris", { + description = S("Russian Iris"), + tiles = {"ebiomes_russian_iris.png"}, + inventory_image = "ebiomes_russian_iris.png", + wield_image = "ebiomes_russian_iris.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:blue 4", + recipe = { + {"ebiomes:russian_iris"} + }, + }) + + core.register_decoration({ + name = "ebiomes:russian_iris", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_warm"}, + sidelen = 16, + noise_params = { + offset = 0.008, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 350, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:russian_iris", + }) + + --cold + + core.register_node("ebiomes:siberian_lily", { + description = S("Siberian Lily"), + tiles = {"ebiomes_siberian_lily.png"}, + inventory_image = "ebiomes_siberian_lily.png", + wield_image = "ebiomes_siberian_lily.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -1 / 16, 3 / 16}, + } + }) + + core.register_craft({ + output = "dye:orange 4", + recipe = { + {"ebiomes:siberian_lily"} + }, + }) + + core.register_decoration({ + name = "ebiomes:siberian_lily", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_cold"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 350, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:siberian_lily", + }) + + + core.register_node("ebiomes:mountain_lily", { + description = S("Mountain Lily"), + tiles = {"ebiomes_mountain_lily.png"}, + inventory_image = "ebiomes_mountain_lily.png", + wield_image = "ebiomes_mountain_lily.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } + }) + + core.register_craft({ + output = "dye:blue 4", + recipe = { + {"ebiomes:mountain_lily"} + }, + }) + + core.register_decoration({ + name = "ebiomes:mountain_lily", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_steppe_cold"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 351, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:mountain_lily", + }) + + + +local function grow_new_peashrub(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_peashrub.mts", "0", nil, false) +end + + + core.register_craftitem("ebiomes:peashrub_peas", { + description = S("Peashrub Peas"), + inventory_image = "ebiomes_peashrub_peas.png", + groups = {cooking_peas = 1}, + }) + + core.register_craftitem("ebiomes:peas_cooked", { + description = S("Cooked Peas"), + inventory_image = "ebiomes_peas_cooked.png", + groups = {food_peas = 1, eatable = 5}, + on_use = core.item_eat(5), + }) + + core.register_craftitem("ebiomes:bucket_peas", { + description = S("Bucket of Peas"), + inventory_image = "ebiomes_bucket_peas.png", + groups = {cookables_peas = 1}, + }) + + core.register_craft({ + output = "ebiomes:bucket_peas", + recipe = { + {"group:cooking_peas"}, + {"bucket:bucket_water"}, + } + }) + + core.register_craft({ + output = "ebiomes:bucket_peas", + recipe = { + {"group:cooking_peas"}, + {"bucket:bucket_river_water"}, + } + }) + + core.register_craft({ + type = "cooking", + output = "ebiomes:peas_cooked", + recipe = "ebiomes:bucket_peas", + replacements = {{"ebiomes:bucket_peas", "bucket:bucket_empty"}}, + cooktime = 5, + }) + + core.register_node("ebiomes:peashrub_leaves_with_peas", { + description = S("Peashrub Bush Leaves with Peas"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_peashrub_leaves.png^ebiomes_peashrub_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + drop = "ebiomes:peashrub_peas", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "ebiomes:peashrub_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, {name = "ebiomes:peashrub_leaves"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + }) + + + core.register_node("ebiomes:peashrub_leaves", { + description = S("Peashrub Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_peashrub_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:peashrub_sapling"}, rarity = 5}, + {items = {"ebiomes:peashrub_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:peashrub_leaves_with_peas"}) + end + end, + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"default:pine_bush_stem"}, + leaves = {"ebiomes:peashrub_leaves", "ebiomes:peashrub_leaves_with_peas"}, + radius = 3, + }) + + core.register_node("ebiomes:peashrub_sapling", { + description = S("Peashrub Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_peashrub_sapling.png"}, + inventory_image = "ebiomes_peashrub_sapling.png", + wield_image = "ebiomes_peashrub_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_peashrub, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:peashrub_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 3, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:peashrub", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_steppe", "ebiomes:dirt_with_grass_steppe_cold"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 969, + octaves = 3, + persist = 0.7, + }, + biomes = {"steppe", "cold_steppe"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_peashrub.mts", + flags = "place_center_x, place_center_z", + }) + +if core.get_modpath("bonemeal") ~= nil then + bonemeal:add_sapling({ + {"ebiomes:peashrub_sapling", grow_new_peashrub, "soil"}, + }) +end + +--Dungeon loot + +if core.global_exists("dungeon_loot") then + dungeon_loot.register ({ + {name = "ebiomes:peashrub_peas", chance = 0.3, count = {2, 4}}, + }) +end + +--Bonemeal +if core.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_steppe", {"ebiomes:grass_steppe_1", "ebiomes:grass_steppe_2", "ebiomes:grass_steppe_3", "ebiomes:grass_steppe_4", "ebiomes:grass_steppe_5"}, + {"ebiomes:altai_tulip", "ebiomes:blue_allium", "ebiomes:blue_allium_purple"} } + }) + + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_steppe_warm", {"ebiomes:grass_steppe_warm_1", "ebiomes:grass_steppe_warm_2", "ebiomes:grass_steppe_warm_3", "ebiomes:grass_steppe_warm_4", "ebiomes:grass_steppe_warm_5"}, + {"ebiomes:russian_iris", "flowers:dandelion_yellow", "flowers:dandelion_white"} } + }) + + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_steppe_cold", {"ebiomes:grass_steppe_cold_1", "ebiomes:grass_steppe_cold_2", "ebiomes:grass_steppe_cold_3", "ebiomes:grass_steppe_cold_4", "ebiomes:grass_steppe_cold_5"}, + {"ebiomes:mountain_lily", "ebiomes:siberian_lily"} } + }) +end + +--Peripheral mod support + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:peashrub_sapling") + + flowerpot.register_node("ebiomes:blue_allium") + flowerpot.register_node("ebiomes:blue_allium_purple") + flowerpot.register_node("ebiomes:russian_iris") + flowerpot.register_node("ebiomes:mountain_lily") + flowerpot.register_node("ebiomes:siberian_lily") + flowerpot.register_node("ebiomes:altai_tulip") + +end diff --git a/mods/ebiomes/textures/ebiomes_acorns.png b/mods/ebiomes/textures/ebiomes_acorns.png new file mode 100644 index 0000000..e6517cb Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_acorns.png differ diff --git a/mods/ebiomes/textures/ebiomes_acorns_cooked.png b/mods/ebiomes/textures/ebiomes_acorns_cooked.png new file mode 100644 index 0000000..0ec8e80 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_acorns_cooked.png differ diff --git a/mods/ebiomes/textures/ebiomes_acorns_hanging.png b/mods/ebiomes/textures/ebiomes_acorns_hanging.png new file mode 100644 index 0000000..947378c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_acorns_hanging.png differ diff --git a/mods/ebiomes/textures/ebiomes_afzelia_leaves.png b/mods/ebiomes/textures/ebiomes_afzelia_leaves.png new file mode 100644 index 0000000..aa8530d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_afzelia_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_afzelia_sapling.png b/mods/ebiomes/textures/ebiomes_afzelia_sapling.png new file mode 100644 index 0000000..6931dc6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_afzelia_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_afzelia_tree.png b/mods/ebiomes/textures/ebiomes_afzelia_tree.png new file mode 100644 index 0000000..d0309a4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_afzelia_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_afzelia_tree_top.png b/mods/ebiomes/textures/ebiomes_afzelia_tree_top.png new file mode 100644 index 0000000..c8d7e1c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_afzelia_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_afzelia_wood.png b/mods/ebiomes/textures/ebiomes_afzelia_wood.png new file mode 100644 index 0000000..2168714 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_afzelia_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_alder_leaves.png b/mods/ebiomes/textures/ebiomes_alder_leaves.png new file mode 100644 index 0000000..821778b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_alder_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_alder_leaves_simple.png b/mods/ebiomes/textures/ebiomes_alder_leaves_simple.png new file mode 100644 index 0000000..ff8a148 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_alder_leaves_simple.png differ diff --git a/mods/ebiomes/textures/ebiomes_alder_sapling.png b/mods/ebiomes/textures/ebiomes_alder_sapling.png new file mode 100644 index 0000000..a2b81b0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_alder_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_alder_tree.png b/mods/ebiomes/textures/ebiomes_alder_tree.png new file mode 100644 index 0000000..5d07775 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_alder_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_alder_tree_top.png b/mods/ebiomes/textures/ebiomes_alder_tree_top.png new file mode 100644 index 0000000..d93dd4c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_alder_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_alder_wood.png b/mods/ebiomes/textures/ebiomes_alder_wood.png new file mode 100644 index 0000000..a2292b6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_alder_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_altai_tulip.png b/mods/ebiomes/textures/ebiomes_altai_tulip.png new file mode 100644 index 0000000..fe3fb0a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_altai_tulip.png differ diff --git a/mods/ebiomes/textures/ebiomes_ash_leaves.png b/mods/ebiomes/textures/ebiomes_ash_leaves.png new file mode 100644 index 0000000..dff9a2b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_ash_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_ash_leaves_simple.png b/mods/ebiomes/textures/ebiomes_ash_leaves_simple.png new file mode 100644 index 0000000..446bd02 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_ash_leaves_simple.png differ diff --git a/mods/ebiomes/textures/ebiomes_ash_sapling.png b/mods/ebiomes/textures/ebiomes_ash_sapling.png new file mode 100644 index 0000000..e65ef7e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_ash_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_ash_tree.png b/mods/ebiomes/textures/ebiomes_ash_tree.png new file mode 100644 index 0000000..3486cbe Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_ash_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_ash_tree_top.png b/mods/ebiomes/textures/ebiomes_ash_tree_top.png new file mode 100644 index 0000000..ca6456a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_ash_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_ash_wood.png b/mods/ebiomes/textures/ebiomes_ash_wood.png new file mode 100644 index 0000000..96b70eb Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_ash_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_bamboo.png b/mods/ebiomes/textures/ebiomes_bamboo.png new file mode 100644 index 0000000..af0ceca Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bamboo.png differ diff --git a/mods/ebiomes/textures/ebiomes_bamboo_leaves.png b/mods/ebiomes/textures/ebiomes_bamboo_leaves.png new file mode 100644 index 0000000..55187e4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bamboo_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_bamboo_sprout.png b/mods/ebiomes/textures/ebiomes_bamboo_sprout.png new file mode 100644 index 0000000..8e2709b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bamboo_sprout.png differ diff --git a/mods/ebiomes/textures/ebiomes_beech_leaves.png b/mods/ebiomes/textures/ebiomes_beech_leaves.png new file mode 100644 index 0000000..8ede38c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_beech_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_beech_sapling.png b/mods/ebiomes/textures/ebiomes_beech_sapling.png new file mode 100644 index 0000000..795a9f3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_beech_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_beech_tree.png b/mods/ebiomes/textures/ebiomes_beech_tree.png new file mode 100644 index 0000000..391b967 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_beech_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_beech_tree_top.png b/mods/ebiomes/textures/ebiomes_beech_tree_top.png new file mode 100644 index 0000000..2db355c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_beech_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_beech_wood.png b/mods/ebiomes/textures/ebiomes_beech_wood.png new file mode 100644 index 0000000..8beb3d7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_beech_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_birch_leaves.png b/mods/ebiomes/textures/ebiomes_birch_leaves.png new file mode 100644 index 0000000..717def8 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_birch_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_birch_leaves_simple.png b/mods/ebiomes/textures/ebiomes_birch_leaves_simple.png new file mode 100644 index 0000000..494b930 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_birch_leaves_simple.png differ diff --git a/mods/ebiomes/textures/ebiomes_birch_sapling.png b/mods/ebiomes/textures/ebiomes_birch_sapling.png new file mode 100644 index 0000000..474aebd Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_birch_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_birch_tree.png b/mods/ebiomes/textures/ebiomes_birch_tree.png new file mode 100644 index 0000000..d31dee0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_birch_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_birch_tree_top.png b/mods/ebiomes/textures/ebiomes_birch_tree_top.png new file mode 100644 index 0000000..0cc90ee Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_birch_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_birch_wood.png b/mods/ebiomes/textures/ebiomes_birch_wood.png new file mode 100644 index 0000000..0d52de0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_birch_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_black_iris.png b/mods/ebiomes/textures/ebiomes_black_iris.png new file mode 100644 index 0000000..1b3c2ee Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_black_iris.png differ diff --git a/mods/ebiomes/textures/ebiomes_blackcurrant_bush_leaves.png b/mods/ebiomes/textures/ebiomes_blackcurrant_bush_leaves.png new file mode 100644 index 0000000..3ffa4ae Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_blackcurrant_bush_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_blackcurrant_bush_sapling.png b/mods/ebiomes/textures/ebiomes_blackcurrant_bush_sapling.png new file mode 100644 index 0000000..32143ab Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_blackcurrant_bush_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_blackcurrant_overlay.png b/mods/ebiomes/textures/ebiomes_blackcurrant_overlay.png new file mode 100644 index 0000000..06f842c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_blackcurrant_overlay.png differ diff --git a/mods/ebiomes/textures/ebiomes_blackcurrants.png b/mods/ebiomes/textures/ebiomes_blackcurrants.png new file mode 100644 index 0000000..5ae7542 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_blackcurrants.png differ diff --git a/mods/ebiomes/textures/ebiomes_blue_allium.png b/mods/ebiomes/textures/ebiomes_blue_allium.png new file mode 100644 index 0000000..c5fa758 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_blue_allium.png differ diff --git a/mods/ebiomes/textures/ebiomes_blue_allium_purple.png b/mods/ebiomes/textures/ebiomes_blue_allium_purple.png new file mode 100644 index 0000000..cd9198f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_blue_allium_purple.png differ diff --git a/mods/ebiomes/textures/ebiomes_bucket_acorns.png b/mods/ebiomes/textures/ebiomes_bucket_acorns.png new file mode 100644 index 0000000..2559ea6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bucket_acorns.png differ diff --git a/mods/ebiomes/textures/ebiomes_bucket_peas.png b/mods/ebiomes/textures/ebiomes_bucket_peas.png new file mode 100644 index 0000000..9cff414 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bucket_peas.png differ diff --git a/mods/ebiomes/textures/ebiomes_bucket_swamp_water.png b/mods/ebiomes/textures/ebiomes_bucket_swamp_water.png new file mode 100644 index 0000000..981301c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bucket_swamp_water.png differ diff --git a/mods/ebiomes/textures/ebiomes_burning_peat.png b/mods/ebiomes/textures/ebiomes_burning_peat.png new file mode 100644 index 0000000..e69578b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_burning_peat.png differ diff --git a/mods/ebiomes/textures/ebiomes_bush_leaves_warm.png b/mods/ebiomes/textures/ebiomes_bush_leaves_warm.png new file mode 100644 index 0000000..02d450b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bush_leaves_warm.png differ diff --git a/mods/ebiomes/textures/ebiomes_bush_sapling_warm.png b/mods/ebiomes/textures/ebiomes_bush_sapling_warm.png new file mode 100644 index 0000000..0a0446a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bush_sapling_warm.png differ diff --git a/mods/ebiomes/textures/ebiomes_bush_stem_warm.png b/mods/ebiomes/textures/ebiomes_bush_stem_warm.png new file mode 100644 index 0000000..5f6062f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_bush_stem_warm.png differ diff --git a/mods/ebiomes/textures/ebiomes_buttercup_persian.png b/mods/ebiomes/textures/ebiomes_buttercup_persian.png new file mode 100644 index 0000000..428035c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_buttercup_persian.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnut_leaves.png b/mods/ebiomes/textures/ebiomes_chestnut_leaves.png new file mode 100644 index 0000000..bbfcb30 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnut_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnut_sapling.png b/mods/ebiomes/textures/ebiomes_chestnut_sapling.png new file mode 100644 index 0000000..8c6287f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnut_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnut_tree.png b/mods/ebiomes/textures/ebiomes_chestnut_tree.png new file mode 100644 index 0000000..2eb4d70 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnut_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnut_tree_top.png b/mods/ebiomes/textures/ebiomes_chestnut_tree_top.png new file mode 100644 index 0000000..6b9ce66 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnut_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnut_wood.png b/mods/ebiomes/textures/ebiomes_chestnut_wood.png new file mode 100644 index 0000000..89b4a4e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnut_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnuts.png b/mods/ebiomes/textures/ebiomes_chestnuts.png new file mode 100644 index 0000000..d204388 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnuts.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnuts_peeled.png b/mods/ebiomes/textures/ebiomes_chestnuts_peeled.png new file mode 100644 index 0000000..f9a0435 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnuts_peeled.png differ diff --git a/mods/ebiomes/textures/ebiomes_chestnuts_roasted.png b/mods/ebiomes/textures/ebiomes_chestnuts_roasted.png new file mode 100644 index 0000000..a775eee Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chestnuts_roasted.png differ diff --git a/mods/ebiomes/textures/ebiomes_chrysanthemum_yellow.png b/mods/ebiomes/textures/ebiomes_chrysanthemum_yellow.png new file mode 100644 index 0000000..4f69849 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_chrysanthemum_yellow.png differ diff --git a/mods/ebiomes/textures/ebiomes_cladanthus.png b/mods/ebiomes/textures/ebiomes_cladanthus.png new file mode 100644 index 0000000..800410d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cladanthus.png differ diff --git a/mods/ebiomes/textures/ebiomes_cowberries.png b/mods/ebiomes/textures/ebiomes_cowberries.png new file mode 100644 index 0000000..70f052e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cowberries.png differ diff --git a/mods/ebiomes/textures/ebiomes_cowberry_bush_leaves.png b/mods/ebiomes/textures/ebiomes_cowberry_bush_leaves.png new file mode 100644 index 0000000..2203134 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cowberry_bush_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_cowberry_bush_sapling.png b/mods/ebiomes/textures/ebiomes_cowberry_bush_sapling.png new file mode 100644 index 0000000..d3ae704 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cowberry_bush_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_cowberry_overlay.png b/mods/ebiomes/textures/ebiomes_cowberry_overlay.png new file mode 100644 index 0000000..cfba5ce Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cowberry_overlay.png differ diff --git a/mods/ebiomes/textures/ebiomes_cranberries.png b/mods/ebiomes/textures/ebiomes_cranberries.png new file mode 100644 index 0000000..8cb54b3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cranberries.png differ diff --git a/mods/ebiomes/textures/ebiomes_cranberry_patch.png b/mods/ebiomes/textures/ebiomes_cranberry_patch.png new file mode 100644 index 0000000..66fdb2f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cranberry_patch.png differ diff --git a/mods/ebiomes/textures/ebiomes_cypress_leaves.png b/mods/ebiomes/textures/ebiomes_cypress_leaves.png new file mode 100644 index 0000000..565be2a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cypress_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_cypress_sapling.png b/mods/ebiomes/textures/ebiomes_cypress_sapling.png new file mode 100644 index 0000000..1fabc6f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cypress_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_cypress_tree.png b/mods/ebiomes/textures/ebiomes_cypress_tree.png new file mode 100644 index 0000000..24a482e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cypress_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_cypress_tree_top.png b/mods/ebiomes/textures/ebiomes_cypress_tree_top.png new file mode 100644 index 0000000..60d89cb Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cypress_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_cypress_wood.png b/mods/ebiomes/textures/ebiomes_cypress_wood.png new file mode 100644 index 0000000..f76890a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_cypress_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_desert_sand_with_debris.png b/mods/ebiomes/textures/ebiomes_desert_sand_with_debris.png new file mode 100644 index 0000000..268d927 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_desert_sand_with_debris.png differ diff --git a/mods/ebiomes/textures/ebiomes_downy_birch_leaves.png b/mods/ebiomes/textures/ebiomes_downy_birch_leaves.png new file mode 100644 index 0000000..ceefc01 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_downy_birch_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_downy_birch_leaves_simple.png b/mods/ebiomes/textures/ebiomes_downy_birch_leaves_simple.png new file mode 100644 index 0000000..81c854d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_downy_birch_leaves_simple.png differ diff --git a/mods/ebiomes/textures/ebiomes_downy_birch_sapling.png b/mods/ebiomes/textures/ebiomes_downy_birch_sapling.png new file mode 100644 index 0000000..c03ecd9 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_downy_birch_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_downy_birch_tree.png b/mods/ebiomes/textures/ebiomes_downy_birch_tree.png new file mode 100644 index 0000000..6186f69 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_downy_birch_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_downy_birch_tree_top.png b/mods/ebiomes/textures/ebiomes_downy_birch_tree_top.png new file mode 100644 index 0000000..8b1239a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_downy_birch_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_downy_birch_wood.png b/mods/ebiomes/textures/ebiomes_downy_birch_wood.png new file mode 100644 index 0000000..c1bb0e4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_downy_birch_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_dried_quince_pieces.png b/mods/ebiomes/textures/ebiomes_dried_quince_pieces.png new file mode 100644 index 0000000..9c42751 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_dried_quince_pieces.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_afzelia_wood.png b/mods/ebiomes/textures/ebiomes_fence_afzelia_wood.png new file mode 100644 index 0000000..c69f656 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_afzelia_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_alder_wood.png b/mods/ebiomes/textures/ebiomes_fence_alder_wood.png new file mode 100644 index 0000000..4a69a08 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_alder_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_ash_wood.png b/mods/ebiomes/textures/ebiomes_fence_ash_wood.png new file mode 100644 index 0000000..126d8ac Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_ash_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_beech_wood.png b/mods/ebiomes/textures/ebiomes_fence_beech_wood.png new file mode 100644 index 0000000..902f307 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_beech_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_birch_wood.png b/mods/ebiomes/textures/ebiomes_fence_birch_wood.png new file mode 100644 index 0000000..213053b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_birch_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_chestnut_wood.png b/mods/ebiomes/textures/ebiomes_fence_chestnut_wood.png new file mode 100644 index 0000000..4926d68 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_chestnut_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_cypress_wood.png b/mods/ebiomes/textures/ebiomes_fence_cypress_wood.png new file mode 100644 index 0000000..6fc1ea9 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_cypress_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_downy_birch_wood.png b/mods/ebiomes/textures/ebiomes_fence_downy_birch_wood.png new file mode 100644 index 0000000..9dc19d3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_downy_birch_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_hornbeam_wood.png b/mods/ebiomes/textures/ebiomes_fence_hornbeam_wood.png new file mode 100644 index 0000000..225ca31 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_hornbeam_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_limba_black_wood.png b/mods/ebiomes/textures/ebiomes_fence_limba_black_wood.png new file mode 100644 index 0000000..e96422b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_limba_black_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_limba_wood.png b/mods/ebiomes/textures/ebiomes_fence_limba_wood.png new file mode 100644 index 0000000..e39de79 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_limba_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_maple_wood.png b/mods/ebiomes/textures/ebiomes_fence_maple_wood.png new file mode 100644 index 0000000..21c4a9e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_maple_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_mizunara_wood.png b/mods/ebiomes/textures/ebiomes_fence_mizunara_wood.png new file mode 100644 index 0000000..0794afc Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_mizunara_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_oak_wood.png b/mods/ebiomes/textures/ebiomes_fence_oak_wood.png new file mode 100644 index 0000000..9bc8018 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_oak_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_olive_wood.png b/mods/ebiomes/textures/ebiomes_fence_olive_wood.png new file mode 100644 index 0000000..a722cc8 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_olive_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_pear_wood.png b/mods/ebiomes/textures/ebiomes_fence_pear_wood.png new file mode 100644 index 0000000..1a805b3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_pear_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_quince_wood.png b/mods/ebiomes/textures/ebiomes_fence_quince_wood.png new file mode 100644 index 0000000..b00d8d5 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_quince_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_afzelia_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_afzelia_wood.png new file mode 100644 index 0000000..1b880c4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_afzelia_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_alder_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_alder_wood.png new file mode 100644 index 0000000..086d431 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_alder_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_ash_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_ash_wood.png new file mode 100644 index 0000000..79680f1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_ash_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_beech_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_beech_wood.png new file mode 100644 index 0000000..35cea8e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_beech_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_birch_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_birch_wood.png new file mode 100644 index 0000000..a25ffa6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_birch_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_chestnut_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_chestnut_wood.png new file mode 100644 index 0000000..43a76b1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_chestnut_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_cypress_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_cypress_wood.png new file mode 100644 index 0000000..3880c2f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_cypress_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_downy_birch_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_downy_birch_wood.png new file mode 100644 index 0000000..6dc0655 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_downy_birch_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_hornbeam_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_hornbeam_wood.png new file mode 100644 index 0000000..a624ab0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_hornbeam_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_limba_black_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_limba_black_wood.png new file mode 100644 index 0000000..21b67c0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_limba_black_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_limba_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_limba_wood.png new file mode 100644 index 0000000..cfbffb7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_limba_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_maple_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_maple_wood.png new file mode 100644 index 0000000..70b0812 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_maple_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_mizunara_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_mizunara_wood.png new file mode 100644 index 0000000..00f1a16 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_mizunara_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_oak_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_oak_wood.png new file mode 100644 index 0000000..ffed0e5 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_oak_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_olive_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_olive_wood.png new file mode 100644 index 0000000..abaed23 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_olive_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_pear_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_pear_wood.png new file mode 100644 index 0000000..7e4927d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_pear_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_quince_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_quince_wood.png new file mode 100644 index 0000000..d0c9b71 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_quince_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_siri_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_siri_wood.png new file mode 100644 index 0000000..a6e63bb Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_siri_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_stoneoak_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_stoneoak_wood.png new file mode 100644 index 0000000..6199311 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_stoneoak_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_sugi_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_sugi_wood.png new file mode 100644 index 0000000..847d33f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_sugi_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_tamarind_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_tamarind_wood.png new file mode 100644 index 0000000..4f6c817 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_tamarind_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_rail_willow_wood.png b/mods/ebiomes/textures/ebiomes_fence_rail_willow_wood.png new file mode 100644 index 0000000..09f0269 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_rail_willow_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_siri_wood.png b/mods/ebiomes/textures/ebiomes_fence_siri_wood.png new file mode 100644 index 0000000..d61bde8 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_siri_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_stoneoak_wood.png b/mods/ebiomes/textures/ebiomes_fence_stoneoak_wood.png new file mode 100644 index 0000000..f35dbe6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_stoneoak_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_sugi_wood.png b/mods/ebiomes/textures/ebiomes_fence_sugi_wood.png new file mode 100644 index 0000000..3dfe95c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_sugi_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_tamarind_wood.png b/mods/ebiomes/textures/ebiomes_fence_tamarind_wood.png new file mode 100644 index 0000000..98b59f2 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_tamarind_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_fence_willow_wood.png b/mods/ebiomes/textures/ebiomes_fence_willow_wood.png new file mode 100644 index 0000000..1b41050 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_fence_willow_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_forest_litter.png b/mods/ebiomes/textures/ebiomes_forest_litter.png new file mode 100644 index 0000000..5213db2 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_forest_litter.png differ diff --git a/mods/ebiomes/textures/ebiomes_forest_litter_side.png b/mods/ebiomes/textures/ebiomes_forest_litter_side.png new file mode 100644 index 0000000..58f93a0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_forest_litter_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_forestgrowth.png b/mods/ebiomes/textures/ebiomes_forestgrowth.png new file mode 100644 index 0000000..c6791ac Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_forestgrowth.png differ diff --git a/mods/ebiomes/textures/ebiomes_gooseberries.png b/mods/ebiomes/textures/ebiomes_gooseberries.png new file mode 100644 index 0000000..fe89a8f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_gooseberries.png differ diff --git a/mods/ebiomes/textures/ebiomes_gooseberry_bush_leaves.png b/mods/ebiomes/textures/ebiomes_gooseberry_bush_leaves.png new file mode 100644 index 0000000..e3bd3c9 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_gooseberry_bush_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_gooseberry_bush_sapling.png b/mods/ebiomes/textures/ebiomes_gooseberry_bush_sapling.png new file mode 100644 index 0000000..42461e7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_gooseberry_bush_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_gooseberry_overlay.png b/mods/ebiomes/textures/ebiomes_gooseberry_overlay.png new file mode 100644 index 0000000..c590f77 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_gooseberry_overlay.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid.png b/mods/ebiomes/textures/ebiomes_grass_arid.png new file mode 100644 index 0000000..79debee Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_1.png b/mods/ebiomes/textures/ebiomes_grass_arid_1.png new file mode 100644 index 0000000..3ae194e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_2.png b/mods/ebiomes/textures/ebiomes_grass_arid_2.png new file mode 100644 index 0000000..1312da0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_3.png b/mods/ebiomes/textures/ebiomes_grass_arid_3.png new file mode 100644 index 0000000..281a9b2 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_4.png b/mods/ebiomes/textures/ebiomes_grass_arid_4.png new file mode 100644 index 0000000..c9fb832 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_5.png b/mods/ebiomes/textures/ebiomes_grass_arid_5.png new file mode 100644 index 0000000..690a43d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool.png new file mode 100644 index 0000000..c30b9e3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool_1.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool_1.png new file mode 100644 index 0000000..4430522 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool_2.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool_2.png new file mode 100644 index 0000000..420271b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool_3.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool_3.png new file mode 100644 index 0000000..b6fa7c7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool_4.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool_4.png new file mode 100644 index 0000000..2a0eb02 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool_5.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool_5.png new file mode 100644 index 0000000..7603aea Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_cool_side.png b/mods/ebiomes/textures/ebiomes_grass_arid_cool_side.png new file mode 100644 index 0000000..3112cf3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_cool_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_arid_side.png b/mods/ebiomes/textures/ebiomes_grass_arid_side.png new file mode 100644 index 0000000..26a5347 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_arid_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_bog_1.png b/mods/ebiomes/textures/ebiomes_grass_bog_1.png new file mode 100644 index 0000000..d183328 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_bog_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_bog_2.png b/mods/ebiomes/textures/ebiomes_grass_bog_2.png new file mode 100644 index 0000000..380d414 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_bog_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_bog_3.png b/mods/ebiomes/textures/ebiomes_grass_bog_3.png new file mode 100644 index 0000000..88e70dd Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_bog_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_bog_4.png b/mods/ebiomes/textures/ebiomes_grass_bog_4.png new file mode 100644 index 0000000..083c77e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_bog_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_bog_5.png b/mods/ebiomes/textures/ebiomes_grass_bog_5.png new file mode 100644 index 0000000..343a55e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_bog_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold.png b/mods/ebiomes/textures/ebiomes_grass_cold.png new file mode 100644 index 0000000..af11f87 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold_1.png b/mods/ebiomes/textures/ebiomes_grass_cold_1.png new file mode 100644 index 0000000..8436f27 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold_2.png b/mods/ebiomes/textures/ebiomes_grass_cold_2.png new file mode 100644 index 0000000..156f19f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold_3.png b/mods/ebiomes/textures/ebiomes_grass_cold_3.png new file mode 100644 index 0000000..1a396c4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold_4.png b/mods/ebiomes/textures/ebiomes_grass_cold_4.png new file mode 100644 index 0000000..434128c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold_5.png b/mods/ebiomes/textures/ebiomes_grass_cold_5.png new file mode 100644 index 0000000..44d7ef2 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_cold_side.png b/mods/ebiomes/textures/ebiomes_grass_cold_side.png new file mode 100644 index 0000000..caaf62c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_cold_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med.png b/mods/ebiomes/textures/ebiomes_grass_med.png new file mode 100644 index 0000000..42bcfbe Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med_1.png b/mods/ebiomes/textures/ebiomes_grass_med_1.png new file mode 100644 index 0000000..3b6c028 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med_2.png b/mods/ebiomes/textures/ebiomes_grass_med_2.png new file mode 100644 index 0000000..98c672e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med_3.png b/mods/ebiomes/textures/ebiomes_grass_med_3.png new file mode 100644 index 0000000..955abab Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med_4.png b/mods/ebiomes/textures/ebiomes_grass_med_4.png new file mode 100644 index 0000000..ec9711a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med_5.png b/mods/ebiomes/textures/ebiomes_grass_med_5.png new file mode 100644 index 0000000..35926e3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_med_side.png b/mods/ebiomes/textures/ebiomes_grass_med_side.png new file mode 100644 index 0000000..984ea05 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_med_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe.png b/mods/ebiomes/textures/ebiomes_grass_steppe.png new file mode 100644 index 0000000..06888fd Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_1.png b/mods/ebiomes/textures/ebiomes_grass_steppe_1.png new file mode 100644 index 0000000..62e2552 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_2.png b/mods/ebiomes/textures/ebiomes_grass_steppe_2.png new file mode 100644 index 0000000..6743533 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_3.png b/mods/ebiomes/textures/ebiomes_grass_steppe_3.png new file mode 100644 index 0000000..4dfa69d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_4.png b/mods/ebiomes/textures/ebiomes_grass_steppe_4.png new file mode 100644 index 0000000..e0d7457 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_5.png b/mods/ebiomes/textures/ebiomes_grass_steppe_5.png new file mode 100644 index 0000000..04423aa Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold.png new file mode 100644 index 0000000..3fd24ca Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold_1.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_1.png new file mode 100644 index 0000000..6c70646 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold_2.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_2.png new file mode 100644 index 0000000..0d57615 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold_3.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_3.png new file mode 100644 index 0000000..0929e81 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold_4.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_4.png new file mode 100644 index 0000000..97bd680 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold_5.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_5.png new file mode 100644 index 0000000..d252f29 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_cold_side.png b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_side.png new file mode 100644 index 0000000..790e417 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_cold_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_side.png b/mods/ebiomes/textures/ebiomes_grass_steppe_side.png new file mode 100644 index 0000000..e581017 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm.png new file mode 100644 index 0000000..d619115 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm_1.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_1.png new file mode 100644 index 0000000..4766516 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm_2.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_2.png new file mode 100644 index 0000000..198f587 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm_3.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_3.png new file mode 100644 index 0000000..dd2d347 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm_4.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_4.png new file mode 100644 index 0000000..2a749fe Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm_5.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_5.png new file mode 100644 index 0000000..115d24e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_steppe_warm_side.png b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_side.png new file mode 100644 index 0000000..c0006ad Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_steppe_warm_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp.png b/mods/ebiomes/textures/ebiomes_grass_swamp.png new file mode 100644 index 0000000..916136e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp_1.png b/mods/ebiomes/textures/ebiomes_grass_swamp_1.png new file mode 100644 index 0000000..8c97b6e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp_2.png b/mods/ebiomes/textures/ebiomes_grass_swamp_2.png new file mode 100644 index 0000000..06a53bf Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp_3.png b/mods/ebiomes/textures/ebiomes_grass_swamp_3.png new file mode 100644 index 0000000..431299a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp_4.png b/mods/ebiomes/textures/ebiomes_grass_swamp_4.png new file mode 100644 index 0000000..cd30055 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp_5.png b/mods/ebiomes/textures/ebiomes_grass_swamp_5.png new file mode 100644 index 0000000..10a1cd4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_swamp_side.png b/mods/ebiomes/textures/ebiomes_grass_swamp_side.png new file mode 100644 index 0000000..d1fb27f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_swamp_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm.png b/mods/ebiomes/textures/ebiomes_grass_warm.png new file mode 100644 index 0000000..e562380 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm_1.png b/mods/ebiomes/textures/ebiomes_grass_warm_1.png new file mode 100644 index 0000000..7213832 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm_2.png b/mods/ebiomes/textures/ebiomes_grass_warm_2.png new file mode 100644 index 0000000..35267d1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm_3.png b/mods/ebiomes/textures/ebiomes_grass_warm_3.png new file mode 100644 index 0000000..6c7db2c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm_4.png b/mods/ebiomes/textures/ebiomes_grass_warm_4.png new file mode 100644 index 0000000..d450e06 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm_5.png b/mods/ebiomes/textures/ebiomes_grass_warm_5.png new file mode 100644 index 0000000..557b501 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_grass_warm_side.png b/mods/ebiomes/textures/ebiomes_grass_warm_side.png new file mode 100644 index 0000000..ea5ef71 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_grass_warm_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_hardy_bush_leaves.png b/mods/ebiomes/textures/ebiomes_hardy_bush_leaves.png new file mode 100644 index 0000000..0484af0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hardy_bush_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_hardy_bush_sapling.png b/mods/ebiomes/textures/ebiomes_hardy_bush_sapling.png new file mode 100644 index 0000000..028cfc1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hardy_bush_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_hardy_bush_stem.png b/mods/ebiomes/textures/ebiomes_hardy_bush_stem.png new file mode 100644 index 0000000..8ff65c7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hardy_bush_stem.png differ diff --git a/mods/ebiomes/textures/ebiomes_hornbeam_leaves.png b/mods/ebiomes/textures/ebiomes_hornbeam_leaves.png new file mode 100644 index 0000000..4ad509e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hornbeam_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_hornbeam_sapling.png b/mods/ebiomes/textures/ebiomes_hornbeam_sapling.png new file mode 100644 index 0000000..bdee797 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hornbeam_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_hornbeam_tree.png b/mods/ebiomes/textures/ebiomes_hornbeam_tree.png new file mode 100644 index 0000000..9040af4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hornbeam_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_hornbeam_tree_top.png b/mods/ebiomes/textures/ebiomes_hornbeam_tree_top.png new file mode 100644 index 0000000..b3824f6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hornbeam_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_hornbeam_wood.png b/mods/ebiomes/textures/ebiomes_hornbeam_wood.png new file mode 100644 index 0000000..566a472 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_hornbeam_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass.png new file mode 100644 index 0000000..6d75b7b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass_1.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_1.png new file mode 100644 index 0000000..6d587eb Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass_2.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_2.png new file mode 100644 index 0000000..0853847 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass_3.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_3.png new file mode 100644 index 0000000..4958324 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass_4.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_4.png new file mode 100644 index 0000000..4386e7a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass_5.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_5.png new file mode 100644 index 0000000..e250e85 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_humid_savanna_grass_side.png b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_side.png new file mode 100644 index 0000000..df28266 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_humid_savanna_grass_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_japanese_rainforest_litter.png b/mods/ebiomes/textures/ebiomes_japanese_rainforest_litter.png new file mode 100644 index 0000000..67fa252 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_japanese_rainforest_litter.png differ diff --git a/mods/ebiomes/textures/ebiomes_japanese_rainforest_litter_side.png b/mods/ebiomes/textures/ebiomes_japanese_rainforest_litter_side.png new file mode 100644 index 0000000..c4cb997 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_japanese_rainforest_litter_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_jaragua_grass.png b/mods/ebiomes/textures/ebiomes_jaragua_grass.png new file mode 100644 index 0000000..cbea194 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jaragua_grass.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass.png new file mode 100644 index 0000000..eb4594e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_1.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_1.png new file mode 100644 index 0000000..543d43e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_1.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_2.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_2.png new file mode 100644 index 0000000..b77a858 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_2.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_3.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_3.png new file mode 100644 index 0000000..db1320c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_3.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_4.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_4.png new file mode 100644 index 0000000..3414375 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_4.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_5.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_5.png new file mode 100644 index 0000000..464d044 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_5.png differ diff --git a/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_side.png b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_side.png new file mode 100644 index 0000000..2035756 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_jungle_savanna_grass_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_larkspur.png b/mods/ebiomes/textures/ebiomes_larkspur.png new file mode 100644 index 0000000..d84e1bd Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_larkspur.png differ diff --git a/mods/ebiomes/textures/ebiomes_limba_black_wood.png b/mods/ebiomes/textures/ebiomes_limba_black_wood.png new file mode 100644 index 0000000..6b26d9a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_limba_black_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_limba_leaves.png b/mods/ebiomes/textures/ebiomes_limba_leaves.png new file mode 100644 index 0000000..00d6e02 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_limba_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_limba_sapling.png b/mods/ebiomes/textures/ebiomes_limba_sapling.png new file mode 100644 index 0000000..ed7f995 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_limba_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_limba_tree.png b/mods/ebiomes/textures/ebiomes_limba_tree.png new file mode 100644 index 0000000..68a5629 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_limba_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_limba_tree_top.png b/mods/ebiomes/textures/ebiomes_limba_tree_top.png new file mode 100644 index 0000000..cd337d5 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_limba_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_limba_wood.png b/mods/ebiomes/textures/ebiomes_limba_wood.png new file mode 100644 index 0000000..411f01f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_limba_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_maple_leaves.png b/mods/ebiomes/textures/ebiomes_maple_leaves.png new file mode 100644 index 0000000..df3c45a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_maple_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_maple_leaves_simple.png b/mods/ebiomes/textures/ebiomes_maple_leaves_simple.png new file mode 100644 index 0000000..58d25a0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_maple_leaves_simple.png differ diff --git a/mods/ebiomes/textures/ebiomes_maple_sapling.png b/mods/ebiomes/textures/ebiomes_maple_sapling.png new file mode 100644 index 0000000..cd664b4 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_maple_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_maple_tree.png b/mods/ebiomes/textures/ebiomes_maple_tree.png new file mode 100644 index 0000000..ad7e5bb Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_maple_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_maple_tree_top.png b/mods/ebiomes/textures/ebiomes_maple_tree_top.png new file mode 100644 index 0000000..b282b37 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_maple_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_maple_wood.png b/mods/ebiomes/textures/ebiomes_maple_wood.png new file mode 100644 index 0000000..4728de0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_maple_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_marigold.png b/mods/ebiomes/textures/ebiomes_marigold.png new file mode 100644 index 0000000..9d5838d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_marigold.png differ diff --git a/mods/ebiomes/textures/ebiomes_marsh_grass_green.png b/mods/ebiomes/textures/ebiomes_marsh_grass_green.png new file mode 100644 index 0000000..9f8131b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_marsh_grass_green.png differ diff --git a/mods/ebiomes/textures/ebiomes_marsh_grass_yellow.png b/mods/ebiomes/textures/ebiomes_marsh_grass_yellow.png new file mode 100644 index 0000000..b922751 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_marsh_grass_yellow.png differ diff --git a/mods/ebiomes/textures/ebiomes_marsh_stitchwort.png b/mods/ebiomes/textures/ebiomes_marsh_stitchwort.png new file mode 100644 index 0000000..7cda412 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_marsh_stitchwort.png differ diff --git a/mods/ebiomes/textures/ebiomes_mizunara_leaves.png b/mods/ebiomes/textures/ebiomes_mizunara_leaves.png new file mode 100644 index 0000000..a238f09 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_mizunara_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_mizunara_sapling.png b/mods/ebiomes/textures/ebiomes_mizunara_sapling.png new file mode 100644 index 0000000..d108ade Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_mizunara_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_mizunara_tree.png b/mods/ebiomes/textures/ebiomes_mizunara_tree.png new file mode 100644 index 0000000..f7aab00 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_mizunara_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_mizunara_tree_top.png b/mods/ebiomes/textures/ebiomes_mizunara_tree_top.png new file mode 100644 index 0000000..06f935b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_mizunara_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_mizunara_wood.png b/mods/ebiomes/textures/ebiomes_mizunara_wood.png new file mode 100644 index 0000000..a70b59e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_mizunara_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_moss.png b/mods/ebiomes/textures/ebiomes_moss.png new file mode 100644 index 0000000..233ea3f Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_moss.png differ diff --git a/mods/ebiomes/textures/ebiomes_moss_clump.png b/mods/ebiomes/textures/ebiomes_moss_clump.png new file mode 100644 index 0000000..9be9dfe Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_moss_clump.png differ diff --git a/mods/ebiomes/textures/ebiomes_mountain_lily.png b/mods/ebiomes/textures/ebiomes_mountain_lily.png new file mode 100644 index 0000000..b6730ec Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_mountain_lily.png differ diff --git a/mods/ebiomes/textures/ebiomes_oak_leaves.png b/mods/ebiomes/textures/ebiomes_oak_leaves.png new file mode 100644 index 0000000..6e68b7b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_oak_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_oak_sapling.png b/mods/ebiomes/textures/ebiomes_oak_sapling.png new file mode 100644 index 0000000..b9e5a92 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_oak_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_oak_tree.png b/mods/ebiomes/textures/ebiomes_oak_tree.png new file mode 100644 index 0000000..b5ccab8 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_oak_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_oak_tree_top.png b/mods/ebiomes/textures/ebiomes_oak_tree_top.png new file mode 100644 index 0000000..868eda5 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_oak_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_oak_wood.png b/mods/ebiomes/textures/ebiomes_oak_wood.png new file mode 100644 index 0000000..333f413 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_oak_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_olive_leaves.png b/mods/ebiomes/textures/ebiomes_olive_leaves.png new file mode 100644 index 0000000..8e81df6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_olive_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_olive_sapling.png b/mods/ebiomes/textures/ebiomes_olive_sapling.png new file mode 100644 index 0000000..078418d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_olive_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_olive_tree.png b/mods/ebiomes/textures/ebiomes_olive_tree.png new file mode 100644 index 0000000..f10f0ca Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_olive_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_olive_tree_top.png b/mods/ebiomes/textures/ebiomes_olive_tree_top.png new file mode 100644 index 0000000..dd25c62 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_olive_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_olive_wood.png b/mods/ebiomes/textures/ebiomes_olive_wood.png new file mode 100644 index 0000000..8b6ab45 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_olive_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_olives.png b/mods/ebiomes/textures/ebiomes_olives.png new file mode 100644 index 0000000..2e8d782 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_olives.png differ diff --git a/mods/ebiomes/textures/ebiomes_pear.png b/mods/ebiomes/textures/ebiomes_pear.png new file mode 100644 index 0000000..fd83bd6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_pear.png differ diff --git a/mods/ebiomes/textures/ebiomes_pear_leaves.png b/mods/ebiomes/textures/ebiomes_pear_leaves.png new file mode 100644 index 0000000..cd6675b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_pear_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_pear_sapling.png b/mods/ebiomes/textures/ebiomes_pear_sapling.png new file mode 100644 index 0000000..9150445 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_pear_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_pear_tree.png b/mods/ebiomes/textures/ebiomes_pear_tree.png new file mode 100644 index 0000000..1a93cbd Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_pear_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_pear_tree_top.png b/mods/ebiomes/textures/ebiomes_pear_tree_top.png new file mode 100644 index 0000000..86ea5df Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_pear_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_pear_wood.png b/mods/ebiomes/textures/ebiomes_pear_wood.png new file mode 100644 index 0000000..76b444b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_pear_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_peas_cooked.png b/mods/ebiomes/textures/ebiomes_peas_cooked.png new file mode 100644 index 0000000..7b6168e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peas_cooked.png differ diff --git a/mods/ebiomes/textures/ebiomes_peashrub_leaves.png b/mods/ebiomes/textures/ebiomes_peashrub_leaves.png new file mode 100644 index 0000000..e536db6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peashrub_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_peashrub_overlay.png b/mods/ebiomes/textures/ebiomes_peashrub_overlay.png new file mode 100644 index 0000000..d1320e7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peashrub_overlay.png differ diff --git a/mods/ebiomes/textures/ebiomes_peashrub_peas.png b/mods/ebiomes/textures/ebiomes_peashrub_peas.png new file mode 100644 index 0000000..f7d61a0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peashrub_peas.png differ diff --git a/mods/ebiomes/textures/ebiomes_peashrub_sapling.png b/mods/ebiomes/textures/ebiomes_peashrub_sapling.png new file mode 100644 index 0000000..d7b19cd Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peashrub_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_peat.png b/mods/ebiomes/textures/ebiomes_peat.png new file mode 100644 index 0000000..d8eea3c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peat.png differ diff --git a/mods/ebiomes/textures/ebiomes_peat_dry.png b/mods/ebiomes/textures/ebiomes_peat_dry.png new file mode 100644 index 0000000..1adf758 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peat_dry.png differ diff --git a/mods/ebiomes/textures/ebiomes_peat_wet.png b/mods/ebiomes/textures/ebiomes_peat_wet.png new file mode 100644 index 0000000..8d0e837 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_peat_wet.png differ diff --git a/mods/ebiomes/textures/ebiomes_quince.png b/mods/ebiomes/textures/ebiomes_quince.png new file mode 100644 index 0000000..dccc7d1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_quince.png differ diff --git a/mods/ebiomes/textures/ebiomes_quince_leaves.png b/mods/ebiomes/textures/ebiomes_quince_leaves.png new file mode 100644 index 0000000..6d8f943 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_quince_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_quince_sapling.png b/mods/ebiomes/textures/ebiomes_quince_sapling.png new file mode 100644 index 0000000..aeb6857 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_quince_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_quince_tree.png b/mods/ebiomes/textures/ebiomes_quince_tree.png new file mode 100644 index 0000000..f885ea8 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_quince_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_quince_tree_top.png b/mods/ebiomes/textures/ebiomes_quince_tree_top.png new file mode 100644 index 0000000..34cc49c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_quince_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_quince_wood.png b/mods/ebiomes/textures/ebiomes_quince_wood.png new file mode 100644 index 0000000..c0bec33 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_quince_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_redcurrant_bush_leaves.png b/mods/ebiomes/textures/ebiomes_redcurrant_bush_leaves.png new file mode 100644 index 0000000..e935f20 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_redcurrant_bush_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_redcurrant_bush_sapling.png b/mods/ebiomes/textures/ebiomes_redcurrant_bush_sapling.png new file mode 100644 index 0000000..a1d87ae Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_redcurrant_bush_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_redcurrant_overlay.png b/mods/ebiomes/textures/ebiomes_redcurrant_overlay.png new file mode 100644 index 0000000..c16b5fa Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_redcurrant_overlay.png differ diff --git a/mods/ebiomes/textures/ebiomes_redcurrants.png b/mods/ebiomes/textures/ebiomes_redcurrants.png new file mode 100644 index 0000000..5b7abb1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_redcurrants.png differ diff --git a/mods/ebiomes/textures/ebiomes_reeds.png b/mods/ebiomes/textures/ebiomes_reeds.png new file mode 100644 index 0000000..b8bbc0b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_reeds.png differ diff --git a/mods/ebiomes/textures/ebiomes_russian_iris.png b/mods/ebiomes/textures/ebiomes_russian_iris.png new file mode 100644 index 0000000..bdb0c4e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_russian_iris.png differ diff --git a/mods/ebiomes/textures/ebiomes_sand_with_debris.png b/mods/ebiomes/textures/ebiomes_sand_with_debris.png new file mode 100644 index 0000000..f7d82b6 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sand_with_debris.png differ diff --git a/mods/ebiomes/textures/ebiomes_savory.png b/mods/ebiomes/textures/ebiomes_savory.png new file mode 100644 index 0000000..f64be2a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_savory.png differ diff --git a/mods/ebiomes/textures/ebiomes_siberian_lily.png b/mods/ebiomes/textures/ebiomes_siberian_lily.png new file mode 100644 index 0000000..120d259 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_siberian_lily.png differ diff --git a/mods/ebiomes/textures/ebiomes_silver_sand_with_debris.png b/mods/ebiomes/textures/ebiomes_silver_sand_with_debris.png new file mode 100644 index 0000000..f010fc0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_silver_sand_with_debris.png differ diff --git a/mods/ebiomes/textures/ebiomes_siri_leaves.png b/mods/ebiomes/textures/ebiomes_siri_leaves.png new file mode 100644 index 0000000..6cef7be Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_siri_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_siri_sapling.png b/mods/ebiomes/textures/ebiomes_siri_sapling.png new file mode 100644 index 0000000..35f7f01 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_siri_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_siri_tree.png b/mods/ebiomes/textures/ebiomes_siri_tree.png new file mode 100644 index 0000000..e7c1537 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_siri_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_siri_tree_top.png b/mods/ebiomes/textures/ebiomes_siri_tree_top.png new file mode 100644 index 0000000..3df70b0 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_siri_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_siri_wood.png b/mods/ebiomes/textures/ebiomes_siri_wood.png new file mode 100644 index 0000000..d6b0178 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_siri_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_staehelina.png b/mods/ebiomes/textures/ebiomes_staehelina.png new file mode 100644 index 0000000..cb4ad19 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_staehelina.png differ diff --git a/mods/ebiomes/textures/ebiomes_stoneoak_leaves.png b/mods/ebiomes/textures/ebiomes_stoneoak_leaves.png new file mode 100644 index 0000000..cf4e513 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_stoneoak_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_stoneoak_sapling.png b/mods/ebiomes/textures/ebiomes_stoneoak_sapling.png new file mode 100644 index 0000000..9529c56 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_stoneoak_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_stoneoak_tree.png b/mods/ebiomes/textures/ebiomes_stoneoak_tree.png new file mode 100644 index 0000000..0d9d766 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_stoneoak_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_stoneoak_tree_top.png b/mods/ebiomes/textures/ebiomes_stoneoak_tree_top.png new file mode 100644 index 0000000..06300e9 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_stoneoak_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_stoneoak_wood.png b/mods/ebiomes/textures/ebiomes_stoneoak_wood.png new file mode 100644 index 0000000..0106465 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_stoneoak_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_sugi_leaves.png b/mods/ebiomes/textures/ebiomes_sugi_leaves.png new file mode 100644 index 0000000..7d9486c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sugi_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_sugi_sapling.png b/mods/ebiomes/textures/ebiomes_sugi_sapling.png new file mode 100644 index 0000000..80e50c3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sugi_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_sugi_tree.png b/mods/ebiomes/textures/ebiomes_sugi_tree.png new file mode 100644 index 0000000..fa97ab7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sugi_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_sugi_tree_top.png b/mods/ebiomes/textures/ebiomes_sugi_tree_top.png new file mode 100644 index 0000000..672013a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sugi_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_sugi_wood.png b/mods/ebiomes/textures/ebiomes_sugi_wood.png new file mode 100644 index 0000000..c34cb8b Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sugi_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_sundew.png b/mods/ebiomes/textures/ebiomes_sundew.png new file mode 100644 index 0000000..5cb301d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_sundew.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_moss_green.png b/mods/ebiomes/textures/ebiomes_swamp_moss_green.png new file mode 100644 index 0000000..97cafe3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_moss_green.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_moss_green_side.png b/mods/ebiomes/textures/ebiomes_swamp_moss_green_side.png new file mode 100644 index 0000000..31fb17a Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_moss_green_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_moss_yellow.png b/mods/ebiomes/textures/ebiomes_swamp_moss_yellow.png new file mode 100644 index 0000000..12284e3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_moss_yellow.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_moss_yellow_side.png b/mods/ebiomes/textures/ebiomes_swamp_moss_yellow_side.png new file mode 100644 index 0000000..89fb0f7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_moss_yellow_side.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_water.png b/mods/ebiomes/textures/ebiomes_swamp_water.png new file mode 100644 index 0000000..8d3217e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_water.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_water_flowing_animated.png b/mods/ebiomes/textures/ebiomes_swamp_water_flowing_animated.png new file mode 100644 index 0000000..f1502ec Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_water_flowing_animated.png differ diff --git a/mods/ebiomes/textures/ebiomes_swamp_water_source_animated.png b/mods/ebiomes/textures/ebiomes_swamp_water_source_animated.png new file mode 100644 index 0000000..de09294 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_swamp_water_source_animated.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_leaves.png b/mods/ebiomes/textures/ebiomes_tamarind_leaves.png new file mode 100644 index 0000000..a14f32c Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_pods.png b/mods/ebiomes/textures/ebiomes_tamarind_pods.png new file mode 100644 index 0000000..751b29d Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_pods.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_pods_hanging.png b/mods/ebiomes/textures/ebiomes_tamarind_pods_hanging.png new file mode 100644 index 0000000..582d3df Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_pods_hanging.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_pulp.png b/mods/ebiomes/textures/ebiomes_tamarind_pulp.png new file mode 100644 index 0000000..c50c680 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_pulp.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_sapling.png b/mods/ebiomes/textures/ebiomes_tamarind_sapling.png new file mode 100644 index 0000000..3b6c1d2 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_tree.png b/mods/ebiomes/textures/ebiomes_tamarind_tree.png new file mode 100644 index 0000000..f94792e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_tree_top.png b/mods/ebiomes/textures/ebiomes_tamarind_tree_top.png new file mode 100644 index 0000000..f230677 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_tamarind_wood.png b/mods/ebiomes/textures/ebiomes_tamarind_wood.png new file mode 100644 index 0000000..70b7ad7 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_tamarind_wood.png differ diff --git a/mods/ebiomes/textures/ebiomes_thorn_bush_leaves.png b/mods/ebiomes/textures/ebiomes_thorn_bush_leaves.png new file mode 100644 index 0000000..9936a22 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_thorn_bush_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_thorn_bush_sapling.png b/mods/ebiomes/textures/ebiomes_thorn_bush_sapling.png new file mode 100644 index 0000000..747114e Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_thorn_bush_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_willow_leaves.png b/mods/ebiomes/textures/ebiomes_willow_leaves.png new file mode 100644 index 0000000..8aeee03 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_willow_leaves.png differ diff --git a/mods/ebiomes/textures/ebiomes_willow_sapling.png b/mods/ebiomes/textures/ebiomes_willow_sapling.png new file mode 100644 index 0000000..02ddd09 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_willow_sapling.png differ diff --git a/mods/ebiomes/textures/ebiomes_willow_tree.png b/mods/ebiomes/textures/ebiomes_willow_tree.png new file mode 100644 index 0000000..f5b1e77 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_willow_tree.png differ diff --git a/mods/ebiomes/textures/ebiomes_willow_tree_top.png b/mods/ebiomes/textures/ebiomes_willow_tree_top.png new file mode 100644 index 0000000..43d3fa1 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_willow_tree_top.png differ diff --git a/mods/ebiomes/textures/ebiomes_willow_wood.png b/mods/ebiomes/textures/ebiomes_willow_wood.png new file mode 100644 index 0000000..d2176b3 Binary files /dev/null and b/mods/ebiomes/textures/ebiomes_willow_wood.png differ diff --git a/mods/ebiomes/trainforest.lua b/mods/ebiomes/trainforest.lua new file mode 100644 index 0000000..803dcb9 --- /dev/null +++ b/mods/ebiomes/trainforest.lua @@ -0,0 +1,807 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +core.register_alias("beech_tree", "ebiomes:beech_tree") +core.register_alias("beech_wood", "ebiomes:beech_wood") +core.register_alias("beech_leaves", "ebiomes:beech_leaves") +core.register_alias("beech_sapling", "ebiomes:beech_sapling") + +--Base + + core.register_node("ebiomes:dirt_with_forest_litter", { + description = S("Dirt with Forest Litter"), + tiles = {"ebiomes_forest_litter.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_forest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_forest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_forest_litter_footsteps", { + description = S("Dirt with Forest Litter and Footsteps"), + tiles = {"ebiomes_forest_litter.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_forest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + + + core.register_biome({ + name = "temperate_rainforest", + node_top = "ebiomes:dirt_with_forest_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 60, + humidity_point = 80, + }) + + core.register_biome({ + name = "temperate_rainforest_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -1, + heat_point = 60, + humidity_point = 80, + }) + + core.register_biome({ + name = "temperate_rainforest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 60, + humidity_point = 80, + }) + + core.register_biome({ + name = "temperate_rainforest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 60, + humidity_point = 80, + }) + + +--Global non-tree decors + + +--Grass + + + for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_trf_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + biomes = {"temperate_rainforest"}, + noise_params = { + offset = 0.03, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:grass_"..length, + }) + end + +--Non-tree decors + +for length = 1, 3 do + core.register_decoration({ + name = "ebiomes:ferntrf_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 80, + fill_ratio = 0.02, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "default:fern_"..length, + }) +end + + core.register_decoration({ + name = "ebiomes:bush_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:pine_bush_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 278, + octaves = 3, + persist = 0.7, + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) + + + --flowers + + core.register_decoration({ + name = "ebiomes:rose_trf", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 357, + octaves = 3, + persist = 0.05 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:rose", + }) + + --mushrooms + + core.register_decoration({ + name = "ebiomes:mushroom_brown_trf", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:mushroom_brown", + }) + + core.register_decoration({ + name = "ebiomes:mushroom_red_trf", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:mushroom_brown", + }) + +--ebiomes bushes + + core.register_decoration({ + name = "ebiomes:blackcurrant_bush_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 787, + octaves = 3, + persist = 0.7, + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_blackcurrant_bush.mts", + flags = "place_center_x, place_center_z", + }) + + core.register_decoration({ + name = "ebiomes:gooseberry_bush_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 969, + octaves = 3, + persist = 0.7, + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_gooseberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + + +--Trees + +--Beech + + core.register_node("ebiomes:beech_tree", { + description = S("Beech Tree"), + tiles = {"ebiomes_beech_tree_top.png", "ebiomes_beech_tree_top.png", + "ebiomes_beech_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:beech_wood", { + description = S("Beech Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_beech_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:beech_wood 4", + recipe = { + {"ebiomes:beech_tree"}, + } + }) + + core.register_node("ebiomes:beech_leaves", { + description = S("Beech Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_beech_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:beech_sapling"}, rarity = 20}, + {items = {"ebiomes:beech_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:beech_tree"}, + leaves = {"ebiomes:beech_leaves"}, + radius = 3, + }) + +local function grow_new_beech_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_beech_tree.mts", "0", nil, false) +end + + core.register_node("ebiomes:beech_sapling", { + description = S("Beech Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_beech_sapling.png"}, + inventory_image = "ebiomes_beech_sapling.png", + wield_image = "ebiomes_beech_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_beech_tree, + selection_box = { + type = "fixed", + fixed = {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:beech_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 4, y = 11, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:beech_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.009, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 113, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_beech_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:beech_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 113, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_beech_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:beech_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_beech_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_forest_litter"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:beech_sapling", grow_new_beech_tree, "soil"}, +}) +end + + stairs.register_stair_and_slab("beech_wood", "ebiomes:beech_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_beech_wood.png"}, + S("Beech Wood Stair"), + S("Beech Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Beech Wood Stair"), + S("Outer Beech Wood Stair") + ) + + default.register_fence("ebiomes:fence_beech_wood", { + description = S("Beech Wood Fence"), + texture = "ebiomes_fence_beech_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_beech_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_beech_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:beech_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_beech_wood", { + description = S("Beech Wood Fence Rail"), + texture = "ebiomes_fence_rail_beech_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_beech_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_beech_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:beech_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_beech_wood", { + description = S("Beech Wood Mese Post Light"), + texture = "ebiomes_fence_beech_wood.png", + material = "ebiomes:beech_wood", + }) + + doors.register_fencegate("ebiomes:gate_beech_wood", { + description = S("Beech Wood Fence Gate"), + texture = "ebiomes_beech_wood.png", + material = "ebiomes:beech_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_beech_wood_closed", + burntime = 9, + }) + + -- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:beech_sapling") + +end + +-- Decors +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:alder_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.005, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 103, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_alder_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:alder_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.03, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 103, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_alder_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:alder_log_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_alder_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:hornbeam_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.032, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:hornbeam_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:hornbeam_log_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_forest_litter"}, + num_spawn_by = 8, + }) + + + core.register_decoration({ + name = "ebiomes:chestnut_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_chestnut_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:chestnut_log_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_chestnut_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_forest_litter"}, + num_spawn_by = 8, + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:pine_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = 0.048, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/pine_tree.mts", + flags = "place_center_x, place_center_z", + }) +else + core.register_decoration({ + name = "ebiomes:pine_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.004, + scale = 0.048, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/pine_tree.mts", + flags = "place_center_x, place_center_z", + }) +end + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:small_pine_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = -0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 101, + octaves = 3, + persist = 0.03 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) +else + core.register_decoration({ + name = "ebiomes:small_pine_tree_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + sidelen = 16, + noise_params = { + offset = 0.001, + scale = -0.005, + spread = {x = 250, y = 250, z = 250}, + seed = 101, + octaves = 3, + persist = 0.03 + }, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) +end + + core.register_decoration({ + name = "ebiomes:pine_log_trf", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_forest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"temperate_rainforest"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pine_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_cold"}, + num_spawn_by = 8, + }) + + +-- Mod support + +-- Bonemeal +if core.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"ebiomes:dirt_with_forest_litter", {"default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:fern_1", "default:fern_2", "default:fern_3"}, + {"flowers:rose"} } + }) +end diff --git a/mods/ebiomes/warms.lua b/mods/ebiomes/warms.lua new file mode 100644 index 0000000..c03add6 --- /dev/null +++ b/mods/ebiomes/warms.lua @@ -0,0 +1,1472 @@ +local S = core.get_translator("ebiomes") + +--from runs cooltrees +local modname = "ebiomes" +local modpath = core.get_modpath(modname) +local mg_name = core.get_mapgen_setting("mg_name") + +--Aliases + +core.register_alias("dirt_with_warm_grass", "ebiomes:dirt_with_grass_warm") +core.register_alias("dirt_with_warm_grass_footsteps", "ebiomes:dirt_with_grass_warm_footsteps") + +core.register_alias("larkspur", "ebiomes:larkspur") + +core.register_alias("chestnut_tree", "ebiomes:chestnut_tree") +core.register_alias("chestnut_wood", "ebiomes:chestnut_wood") +core.register_alias("chestnut_leaves", "ebiomes:chestnut_leaves") +core.register_alias("chestnut_sapling", "ebiomes:chestnut_sapling") +core.register_alias("chestnuts", "ebiomes:chestnuts") +core.register_alias("chestnuts_peeled", "ebiomes:chestnuts_peeled") +core.register_alias("chestnuts_roasted", "ebiomes:chestnuts_roasted") + +core.register_alias("pear_tree", "ebiomes:pear_tree") +core.register_alias("pear_wood", "ebiomes:pear_wood") +core.register_alias("pear_leaves", "ebiomes:pear_leaves") +core.register_alias("pear_sapling", "ebiomes:pear_sapling") +core.register_alias("pear", "ebiomes:pear") +core.register_alias("quince_tree", "ebiomes:quince_tree") +core.register_alias("quince_wood", "ebiomes:quince_wood") +core.register_alias("quince_leaves", "ebiomes:quince_leaves") +core.register_alias("quince_sapling", "ebiomes:quince_sapling") +core.register_alias("quince", "ebiomes:quince") +core.register_alias("dried_quince_pieces", "ebiomes:dried_quince_pieces") + +-- Warm deciduous forest + + core.register_node("ebiomes:dirt_with_grass_warm", { + description = S("Dirt with Warm Grass"), + tiles = {"ebiomes_grass_warm.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_warm_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + soil = { + base = "ebiomes:dirt_with_grass_warm", + dry = "farming:soil", + wet = "farming:soil_wet" + } + }) + + core.register_node("ebiomes:dirt_with_grass_warm_footsteps", { + description = S("Dirt with Warm Grass and Footsteps"), + tiles = {"ebiomes_grass_warm.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^ebiomes_grass_warm_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), + }) + + core.register_node("ebiomes:grass_warm_1", { + description = S("Warm Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_warm_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "ebiomes_grass_warm_3.png", + wield_image = "ebiomes_grass_warm_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_warm_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("ebiomes:grass_warm_" .. math.random(1,5)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack("ebiomes:grass_warm_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, + }) + +for i = 2, 5 do + core.register_node("ebiomes:grass_warm_" .. i, { + description = S("Warm Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"ebiomes_grass_warm_" .. i .. ".png"}, + inventory_image = "ebiomes_grass_warm_" .. i .. ".png", + wield_image = "ebiomes_grass_warm_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "ebiomes:grass_warm_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"ebiomes:grass_warm_1"}}, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + core.register_biome({ + name = "deciduous_forest_warm", + node_top = "ebiomes:dirt_with_grass_warm", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 65, + humidity_point = 60, + }) + + core.register_biome({ + name = "deciduous_forest_warm_shore", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -1, + heat_point = 65, + humidity_point = 60, + }) + + core.register_biome({ + name = "deciduous_forest_warm_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 65, + humidity_point = 60, + }) + + core.register_biome({ + name = "deciduous_forest_warm_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 65, + humidity_point = 60, + }) + +for length = 1, 5 do + core.register_decoration({ + name = "ebiomes:grass_warm_"..length, + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.05, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:grass_warm_"..length, + }) +end + + + +--Warm Grassland + +core.register_biome({ + name = "grassland_warm", + node_top = "ebiomes:dirt_with_grass_warm", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 65, + humidity_point = 35, + }) + + core.register_biome({ + name = "grassland_warm_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 65, + humidity_point = 35, + }) + + core.register_biome({ + name = "grassland_warm_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 65, + humidity_point = 35, + }) + + core.register_biome({ + name = "grassland_warm_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -400, + heat_point = 65, + humidity_point = 35, + }) + +--Folliage + +--Biome specific + + core.register_node("ebiomes:larkspur", { + description = S("Larkspur"), + tiles = {"ebiomes_larkspur.png"}, + inventory_image = "ebiomes_larkspur.png", + wield_image = "ebiomes_larkspur.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {flower = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } + }) + + core.register_craft({ + output = "dye:violet 4", + recipe = { + {"ebiomes:larkspur"} + }, + }) + + core.register_decoration({ + name = "ebiomes:larkspur", + deco_type = "simple", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.006, + scale = 0.001, + spread = {x = 100, y = 100, z = 100}, + seed = 384, + octaves = 3, + persist = 0.05 + }, + y_max = 31000, + y_min = 1, + decoration = "ebiomes:larkspur", + }) + +--Woods + +--Warm deciduous + +--Pear + + core.register_node("ebiomes:pear_tree", { + description = S("Pear Tree"), + tiles = {"ebiomes_pear_tree_top.png", "ebiomes_pear_tree_top.png", + "ebiomes_pear_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:pear_wood", { + description = S("Pear Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_pear_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:pear_wood 4", + recipe = { + {"ebiomes:pear_tree"}, + } + }) + + core.register_node("ebiomes:pear_leaves", { + description = S("Pear Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_pear_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:pear_sapling"}, rarity = 20}, + {items = {"ebiomes:pear_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:pear_tree"}, + leaves = {"ebiomes:pear_leaves"}, + radius = 3, + }) + +local function grow_new_pear_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-2, y = pos.y, z = pos.z-2}, modpath.."/schematics/ebiomes_pear_tree.mts", "0", nil, false) +end + + + core.register_node("ebiomes:pear_sapling", { + description = S("Pear Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_pear_sapling.png"}, + inventory_image = "ebiomes_pear_sapling.png", + wield_image = "ebiomes_pear_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_pear_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:pear_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 10, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:pear_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 100, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pear_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:pear_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 100, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pear_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:pear_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_pear_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_warm"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:pear_sapling", grow_new_pear_tree, "soil"}, +}) +end + + --forms sampled from pigiron mod + stairs.register_stair_and_slab("pear_wood", "ebiomes:pear_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_pear_wood.png"}, + S("Pear Wood Stair"), + S("Pear Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Pear Wood Stair"), + S("Outer Pear Wood Stair") + ) + + default.register_fence("ebiomes:fence_pear_wood", { + description = S("Pear Wood Fence"), + texture = "ebiomes_fence_pear_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_pear_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_pear_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:pear_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_pear_wood", { + description = S("Pear Wood Fence Rail"), + texture = "ebiomes_fence_rail_pear_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_pear_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_pear_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:pear_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_pear_wood", { + description = S("Pear Wood Mese Post Light"), + texture = "ebiomes_fence_pear_wood.png", + material = "ebiomes:pear_wood", + }) + + doors.register_fencegate("ebiomes:gate_pear_wood", { + description = S("Pear Wood Fence Gate"), + texture = "ebiomes_pear_wood.png", + material = "ebiomes:pear_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_pear_wood_closed", + burntime = 9, + }) + + + core.register_node("ebiomes:pear", { + description = S("Pear"), + drawtype = "plantlike", + tiles = {"ebiomes_pear.png"}, + inventory_image = "ebiomes_pear.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1, eatable = 2}, + on_use = core.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:pear", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, {name = "ebiomes:pear_mark"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, + }) + + core.register_node("ebiomes:pear_mark", { + description = S("Pear Marker"), + inventory_image = "ebiomes_pear.png^default_invisible_node_overlay.png", + wield_image = "ebiomes_pear.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, "ebiomes:pear_leaves") then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:pear"}) + end + end + }) + + + +--Quince + + core.register_node("ebiomes:quince_tree", { + description = S("Quince Tree"), + tiles = {"ebiomes_quince_tree_top.png", "ebiomes_quince_tree_top.png", + "ebiomes_quince_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:quince_wood", { + description = S("Quince Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_quince_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:quince_wood 4", + recipe = { + {"ebiomes:quince_tree"}, + } + }) + + core.register_node("ebiomes:quince_leaves", { + description = S("Quince Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_quince_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:quince_sapling"}, rarity = 20}, + {items = {"ebiomes:quince_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:quince_tree"}, + leaves = {"ebiomes:quince_leaves"}, + radius = 3, + }) + +local function grow_new_quince_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-1, y = pos.y, z = pos.z-1}, modpath.."/schematics/ebiomes_quince_tree.mts", "0", nil, false) +end + + + core.register_node("ebiomes:quince_sapling", { + description = S("Quince Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_quince_sapling.png"}, + inventory_image = "ebiomes_quince_sapling.png", + wield_image = "ebiomes_quince_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_quince_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:quince_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 6, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:quince_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 101, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_quince_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:quince_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_quince_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_warm"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:quince_sapling", grow_new_quince_tree, "soil"}, +}) +end + + --forms sampled from pigiron mod + stairs.register_stair_and_slab("quince_wood", "ebiomes:quince_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_quince_wood.png"}, + S("Quince Wood Stair"), + S("Quince Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Quince Wood Stair"), + S("Outer Quince Wood Stair") + ) + + default.register_fence("ebiomes:fence_quince_wood", { + description = S("Quince Wood Fence"), + texture = "ebiomes_fence_quince_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_quince_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_quince_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:quince_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_quince_wood", { + description = S("Quince Wood Fence Rail"), + texture = "ebiomes_fence_rail_quince_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_quince_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_quince_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:quince_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_quince_wood", { + description = S("Quince Wood Mese Post Light"), + texture = "ebiomes_fence_quince_wood.png", + material = "ebiomes:quince_wood", + }) + + doors.register_fencegate("ebiomes:gate_quince_wood", { + description = S("Quince Wood Fence Gate"), + texture = "ebiomes_quince_wood.png", + material = "ebiomes:quince_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_quince_wood_closed", + burntime = 9, + }) + + + core.register_node("ebiomes:quince", { + description = S("Quince"), + drawtype = "plantlike", + tiles = {"ebiomes_quince.png"}, + inventory_image = "ebiomes_quince.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1, eatable = 1}, + on_use = core.item_eat(1), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:quince", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, {name = "ebiomes:quince_mark"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, + }) + + core.register_node("ebiomes:quince_mark", { + description = S("Quince Marker"), + inventory_image = "ebiomes_quince.png^default_invisible_node_overlay.png", + wield_image = "ebiomes_quince.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, "ebiomes:quince_leaves") then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:quince"}) + end + end + }) + + + + core.register_craftitem("ebiomes:dried_quince_pieces", { + description = S("Dried Quince Pieces"), + inventory_image = "ebiomes_dried_quince_pieces.png", + on_use = core.item_eat(4), + groups = {food_bread = 1, flammable = 2, eatable = 4}, + }) + + core.register_craft({ + type = "cooking", + cooktime = 2, + output = "ebiomes:dried_quince_pieces", + recipe = "ebiomes:quince", + }) + + + + +--Chestnut + + core.register_node("ebiomes:chestnut_tree", { + description = S("Chestnut Tree"), + tiles = {"ebiomes_chestnut_tree_top.png", "ebiomes_chestnut_tree_top.png", + "ebiomes_chestnut_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:chestnut_wood", { + description = S("Chestnut Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_chestnut_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:chestnut_wood 4", + recipe = { + {"ebiomes:chestnut_tree"}, + } + }) + + core.register_node("ebiomes:chestnut_leaves", { + description = S("Chestnut Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_chestnut_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:chestnut_sapling"}, rarity = 20}, + {items = {"ebiomes:chestnut_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:chestnut_tree"}, + leaves = {"ebiomes:chestnut_leaves"}, + radius = 3, + }) + + +local function grow_new_chestnut_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-4, y = pos.y, z = pos.z-4}, modpath.."/schematics/ebiomes_chestnut_tree.mts", "0", nil, false) +end + + + core.register_node("ebiomes:chestnut_sapling", { + description = S("Chestnut Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_chestnut_sapling.png"}, + inventory_image = "ebiomes_chestnut_sapling.png", + wield_image = "ebiomes_chestnut_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_chestnut_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:chestnut_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -4, y = 1, z = -4}, + {x = 4, y = 13, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + + core.register_decoration({ + name = "ebiomes:chestnut_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.002, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_chestnut_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + core.register_decoration({ + name = "ebiomes:chestnut_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_chestnut_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_warm"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:chestnut_sapling", grow_new_chestnut_tree, "soil"}, +}) +end + + --forms sampled from pigiron mod + stairs.register_stair_and_slab("chestnut_wood", "ebiomes:chestnut_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_chestnut_wood.png"}, + S("Chestnut Wood Stair"), + S("Chestnut Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Chestnut Wood Stair"), + S("Outer Chestnut Wood Stair") + ) + + default.register_fence("ebiomes:fence_chestnut_wood", { + description = S("Chestnut Wood Fence"), + texture = "ebiomes_fence_chestnut_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_chestnut_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_chestnut_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:chestnut_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_chestnut_wood", { + description = S("Chestnut Wood Fence Rail"), + texture = "ebiomes_fence_rail_chestnut_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_chestnut_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_chestnut_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:chestnut_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_chestnut_wood", { + description = S("Chestnut Wood Mese Post Light"), + texture = "ebiomes_fence_chestnut_wood.png", + material = "ebiomes:chestnut_wood", + }) + + doors.register_fencegate("ebiomes:gate_chestnut_wood", { + description = S("Chestnut Wood Fence Gate"), + texture = "ebiomes_chestnut_wood.png", + material = "ebiomes:chestnut_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_chestnut_wood_closed", + burntime = 9, + }) + + + core.register_node("ebiomes:chestnuts", { + description = S("Chestnuts"), + drawtype = "plantlike", + tiles = {"ebiomes_chestnuts.png"}, + inventory_image = "ebiomes_chestnuts.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1}, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + core.set_node(pos, {name = "ebiomes:chestnuts", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, {name = "ebiomes:chestnuts_mark"}) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, + }) + + core.register_node("ebiomes:chestnuts_mark", { + description = S("Chestnut Marker"), + inventory_image = "ebiomes_chestnuts.png^default_invisible_node_overlay.png", + wield_image = "ebiomes_chestnuts.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, "ebiomes:chestnut_leaves") then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, {name = "ebiomes:chestnuts"}) + end + end + }) + + + + core.register_craftitem("ebiomes:chestnuts_peeled", { + description = S("Peeled Chestnuts"), + inventory_image = "ebiomes_chestnuts_peeled.png", + groups = {food_bread = 1, flammable = 2}, + }) + + core.register_craft({ + output = "ebiomes:chestnuts_peeled", + recipe = { + {"ebiomes:chestnuts"}, + } + }) + + core.register_craftitem("ebiomes:chestnuts_roasted", { + description = S("Roasted Chestnuts"), + inventory_image = "ebiomes_chestnuts_roasted.png", + on_use = core.item_eat(4), + groups = {food_bread = 1, flammable = 2, eatable = 4}, + }) + + core.register_craft({ + type = "cooking", + cooktime = 2, + output = "ebiomes:chestnuts_roasted", + recipe = "ebiomes:chestnuts_peeled", + }) + + +--Hornbeam + + core.register_node("ebiomes:hornbeam_tree", { + description = S("Hornbeam Tree"), + tiles = {"ebiomes_hornbeam_tree_top.png", "ebiomes_hornbeam_tree_top.png", + "ebiomes_hornbeam_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = core.rotate_node + }) + + core.register_node("ebiomes:hornbeam_wood", { + description = S("Hornbeam Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"ebiomes_hornbeam_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), + }) + + core.register_craft({ + output = "ebiomes:hornbeam_wood 4", + recipe = { + {"ebiomes:hornbeam_tree"}, + } + }) + + core.register_node("ebiomes:hornbeam_leaves", { + description = S("Hornbeam Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"ebiomes_hornbeam_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"ebiomes:hornbeam_sapling"}, rarity = 20}, + {items = {"ebiomes:hornbeam_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, + }) + + default.register_leafdecay({ + trunks = {"ebiomes:hornbeam_tree"}, + leaves = {"ebiomes:hornbeam_leaves"}, + radius = 3, + }) + + +local function grow_new_hornbeam_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + core.get_node_timer(pos):start(math.random(150, 300)) + return + end + core.remove_node(pos) + core.place_schematic({x = pos.x-3, y = pos.y, z = pos.z-3}, modpath.."/schematics/ebiomes_hornbeam_tree.mts", "0", nil, false) +end + + + core.register_node("ebiomes:hornbeam_sapling", { + description = S("Hornbeam Tree Sapling"), + drawtype = "plantlike", + tiles = {"ebiomes_hornbeam_sapling.png"}, + inventory_image = "ebiomes_hornbeam_sapling.png", + wield_image = "ebiomes_hornbeam_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_hornbeam_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "ebiomes:hornbeam_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 10, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + }) + +if core.settings:get_bool("light_mapgen", true) then + core.register_decoration({ + name = "ebiomes:hornbeam_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +else + core.register_decoration({ + name = "ebiomes:hornbeam_tree", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 106, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 1, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) +end + + core.register_decoration({ + name = "ebiomes:hornbeam_log", + deco_type = "schematic", + place_on = {"ebiomes:dirt_with_grass_warm"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0009, + biomes = {"deciduous_forest_warm"}, + y_max = 31000, + y_min = 4, + schematic = core.get_modpath("ebiomes") .. "/schematics/ebiomes_hornbeam_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"ebiomes:dirt_with_grass_warm"}, + num_spawn_by = 8, + }) + +if core.get_modpath("bonemeal") ~= nil then +bonemeal:add_sapling({ + {"ebiomes:hornbeam_sapling", grow_new_hornbeam_tree, "soil"}, +}) +end + + --forms sampled from pigiron mod + stairs.register_stair_and_slab("hornbeam_wood", "ebiomes:hornbeam_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"ebiomes_hornbeam_wood.png"}, + S("Hornbeam Wood Stair"), + S("Hornbeam Wood Slab"), + default.node_sound_wood_defaults(), + true, + S("Inner Hornbeam Wood Stair"), + S("Outer Hornbeam Wood Stair") + ) + + default.register_fence("ebiomes:fence_hornbeam_wood", { + description = S("Hornbeam Wood Fence"), + texture = "ebiomes_fence_hornbeam_wood.png", + inventory_image = "default_fence_overlay.png^ebiomes_fence_hornbeam_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^ebiomes_fence_hornbeam_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "ebiomes:hornbeam_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_fence_rail("ebiomes:fence_rail_hornbeam_wood", { + description = S("Hornbeam Wood Fence Rail"), + texture = "ebiomes_fence_rail_hornbeam_wood.png", + inventory_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_hornbeam_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^ebiomes_fence_rail_hornbeam_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "ebiomes:hornbeam_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + }) + + default.register_mesepost("ebiomes:mese_post_light_hornbeam_wood", { + description = S("Hornbeam Wood Mese Post Light"), + texture = "ebiomes_fence_hornbeam_wood.png", + material = "ebiomes:hornbeam_wood", + }) + + doors.register_fencegate("ebiomes:gate_hornbeam_wood", { + description = S("Hornbeam Wood Fence Gate"), + texture = "ebiomes_hornbeam_wood.png", + material = "ebiomes:hornbeam_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} + }) + + core.register_craft({ + type = "fuel", + recipe = "ebiomes:gate_hornbeam_wood_closed", + burntime = 9, + }) + +--Loot + +if core.global_exists("dungeon_loot") then + dungeon_loot.register ({ + {name = "ebiomes:chestnuts_peeled", chance = 0.3, count = {2, 8}}, + {name = "ebiomes:pear", chance = 0.4, count = {1, 4}}, + {name = "ebiomes:dried_quince_pieces", chance = 0.6, count = {1, 8}}, + }) +end + +--Bonemeal +if core.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"ebiomes:dirt_with_grass_warm", {"ebiomes:grass_warm_1", "ebiomes:grass_warm_2", "ebiomes:grass_warm_3", "ebiomes:grass_warm_4", "ebiomes:grass_warm_5"}, + {"flowers:dandelion_yellow", "flowers:dandelion_white", "flowers:tulip", "flowers:chrysanthemum_green", "ebiomes:larkspur"} } + }) +end + +--Peripheral mod support + +--sampled from cool_trees +-- stairsplus/moreblocks +if core.get_modpath("moreblocks") then + + stairsplus:register_all("pear_tree", "wood", "ebiomes:pear_wood", { + description = "Pear Wood", + tiles = {"ebiomes_pear_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("quince_tree", "wood", "ebiomes:quince_wood", { + description = "Quince Wood", + tiles = {"ebiomes_quince_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("chestnut_tree", "wood", "ebiomes:chestnut_wood", { + description = "Chestnut Wood", + tiles = {"ebiomes_chestnut_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + + stairsplus:register_all("hornbeam_tree", "wood", "ebiomes:hornbeam_wood", { + description = "Hornbeam Wood", + tiles = {"ebiomes_hornbeam_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + }) + +end + +-- Support for flowerpot +if core.global_exists("flowerpot") then + + flowerpot.register_node("ebiomes:pear_sapling") + flowerpot.register_node("ebiomes:quince_sapling") + flowerpot.register_node("ebiomes:chestnut_sapling") + flowerpot.register_node("ebiomes:hornbeam_sapling") + + flowerpot.register_node("ebiomes:larkspur") + +end diff --git a/mods/livingcaves/LICENSE b/mods/livingcaves/LICENSE new file mode 100644 index 0000000..e810afb --- /dev/null +++ b/mods/livingcaves/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2022 +Textures and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/livingcaves/cavenodes.lua b/mods/livingcaves/cavenodes.lua new file mode 100644 index 0000000..51555c2 --- /dev/null +++ b/mods/livingcaves/cavenodes.lua @@ -0,0 +1,494 @@ +local S = minetest.get_translator("livingcaves") + +local modname = "livingcaves" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- ground nodes + +minetest.register_node("livingcaves:mossycaverock", { + description = S("Mossy Cave Rock"), + tiles = {"livingcaves_mossycaverock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:mossycaverock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:lichycaverock", { + description = S("Lichen infested Cave Rock"), + tiles = {"livingcaves_lichyrock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:lichycaverock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:mushcave_bottom", { + description = S("Mushroom Infested Rock"), + tiles = {"livingcaves_mushcave_bottom.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:mushcave_bottom", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:mushcave_bottom2", { + description = S("Mushroom Infested Rock"), + tiles = {"livingcaves_mushcave_bottom2.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:mushcave_bottom2", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:dripstonecave_bottom", { + description = S("Dripstone Cave Stone"), + tiles = {"livingcaves_dripstonecave_bottom.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:dripstonecave_bottom", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:dripstonecave_bottom2", { + description = S("Dripstone Cave Stone"), + tiles = {"livingcaves_dripstonecave_bottom2.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:dripstonecave_bottom2", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_bottom", { + description = S("Bacteria Infested Rock"), + tiles = {"livingcaves_bacteriacave_bottom.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:bacteriacave_bottom", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_bottom2", { + description = S("Bacteria Infested Rock"), + tiles = {"livingcaves_bacteriacave_bottom2.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:bacteriacave_bottom2", + light_source = 4, + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:rootdirt", { + description = S("Dirt With Roots"), + tiles = {"livingcaves_rootdirt.png"}, + groups = {crumbly = 3, soil = 1,}, + drop = "livingcaves:rootdirt", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:rootdirt2", { + description = S("Dirt With Roots"), + tiles = {"livingcaves_rootdirt2.png"}, + groups = {crumbly = 3, soil = 1,}, + drop = "livingcaves:rootdirt2", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:icecave_ice", { + description = S("Cave Ice"), + tiles = {"livingcaves_icecave_ice.png"}, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + drop = "livingcaves:icecave_ice", + legacy_mineral = true, + sounds = default.node_sound_ice_defaults(), +}) + +minetest.register_node("livingcaves:icecave_ice2", { + description = S("Cave Ice"), + tiles = {"livingcaves_icecave_ice2.png"}, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + drop = "livingcaves:icecave_ice2", + legacy_mineral = true, + sounds = default.node_sound_ice_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_trapstone", { + description = S("Flesh Eating Bacteria Trapstone"), + tiles = {"livingcaves_bacteriacave_trapstone.png"}, + groups = {choppy = 3, wood = 1}, + drop = "livingcaves:bacteriacave_trapstone", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_trapnode", { + description = S("Flesh Eating Bacteria Trap"), + tiles = {"livingcaves_bacteriacave_bottom.png"}, + groups = {choppy = 3, wood = 1}, + walkable = false, + drop = "livingcaves:bacteriacave_trapnode", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_poolstone", { + description = S("Bacteria Poolstone"), + tiles = {"livingcaves_bacteriacave_poolstone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingcaves:bacteriacave_poolstone", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_nestfoot", { + description = S("Bacteria Nest Foot"), + tiles = {"livingcaves_bacteriacave_nestfoot.png"}, + groups = {choppy = 3, stone = 1}, + drop = "livingcaves:bacteriacave_nestfoot", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingcaves:bacteriacave_nest", { + description = S("Bacteria Nest Core"), +tiles = { + { + name = "livingcaves_bacteriacave_nest.png", + animation = {type="vertical_frames", length = 4} + } + }, + groups = {choppy = 3, stone = 1}, + light_source = 7, + drop = "livingcaves:bacteriacave_nest", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + flags = "force_placement,all_floors", + y_max = -30, + y_min = -90, + decoration = "livingcaves:mushcave_bottom" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + flags = "force_placement,all_ceilings", + y_max = -30, + y_min = -90, + decoration = "livingcaves:mushcave_bottom2" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + flags = "force_placement,all_floors", + y_max = -90, + y_min = -200, + decoration = "livingcaves:dripstonecave_bottom" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + flags = "force_placement,all_ceilings", + y_max = -90, + y_min = -200, + decoration = "livingcaves:dripstonecave_bottom2" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + flags = "force_placement,all_floors", + y_max = -200, + y_min = -400, + decoration = "livingcaves:bacteriacave_bottom" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + flags = "force_placement,all_ceilings", + y_max = -200, + y_min = -400, + decoration = "livingcaves:bacteriacave_bottom2" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + biomes = {"snowy_grassland", "icesheet_under", "icesheet", "snowy_grassland_under", "tundra_highland", "tundra_beach", "tundra_under", "taiga", "taiga_under", "livingfloatlands:coldsteppe"}, + flags = "force_placement,all_floors", + y_max = -1, + y_min = -30, + decoration = "livingcaves:icecave_ice" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 8, + biomes = {"snowy_grassland", "icesheet_under", "icesheet", "snowy_grassland_under", "tundra_highland", "tundra_beach", "tundra_under", "taiga", "taiga_under", "livingfloatlands:coldsteppe"}, + flags = "force_placement,all_ceilings", + y_max = -1, + y_min = -30, + decoration = "livingcaves:icecave_ice2" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 2, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "rainforest", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + flags = "force_placement,all_ceilings", + y_max = -1, + y_min = -30, + decoration = "livingcaves:rootdirt" + +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:stone"}, + is_ground_content = true, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 2, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "rainforest", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + flags = "force_placement,all_ceilings", + y_max = -1, + y_min = -30, + decoration = "livingcaves:rootdirt2" + +}) + +minetest.register_node("livingcaves:spiderweb", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet.png"}, + drop = "livingcaves:spiderweb", + drawtype = "plantlike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb", + liquid_alternative_source = "livingcaves:spiderweb", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb2", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet2.png"}, + drop = "livingcaves:spiderweb2", + drawtype = "plantlike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb2", + liquid_alternative_source = "livingcaves:spiderweb2", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb3", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet3.png"}, + drop = "livingcaves:spiderweb3", + drawtype = "plantlike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb3", + liquid_alternative_source = "livingcaves:spiderweb3", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb4", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet4.png"}, + drop = "livingcaves:spiderweb4", + drawtype = "plantlike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb4", + liquid_alternative_source = "livingcaves:spiderweb4", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb5", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet5.png"}, + drop = "livingcaves:spiderweb5", + drawtype = "plantlike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb5", + liquid_alternative_source = "livingcaves:spiderweb5", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb6", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet6.png"}, + drop = "livingcaves:spiderweb6", + drawtype = "plantlike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb6", + liquid_alternative_source = "livingcaves:spiderweb6", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb7", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet7.png"}, + drop = "livingcaves:spiderweb7", + drawtype = "raillike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb7", + liquid_alternative_source = "livingcaves:spiderweb7", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb8", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet8.png"}, + drop = "livingcaves:spiderweb8", + drawtype = "raillike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb8", + liquid_alternative_source = "livingcaves:spiderweb8", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + +minetest.register_node("livingcaves:spiderweb9", { + description = S("Spider Web"), + tiles = {"livingcaves_spidernet9.png"}, + drop = "livingcaves:spiderweb9", + drawtype = "raillike", + liquid_viscosity = 15, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:spiderweb9", + liquid_alternative_source = "livingcaves:spiderweb9", + liquid_renewable = false, + liquid_range = 0, + drowning = 0, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = false, + groups = {crumbly = 3, sand = 1, liquid = 3, disable_jump = 1}, + sounds = default.node_sound_sand_defaults() +}) + diff --git a/mods/livingcaves/crafting.lua b/mods/livingcaves/crafting.lua new file mode 100644 index 0000000..b3a9715 --- /dev/null +++ b/mods/livingcaves/crafting.lua @@ -0,0 +1,527 @@ +local S = minetest.get_translator("livingcaves") + +-- bucket + +minetest.register_craft({ + output = "livingcaves:bucket_empty 1", + recipe = { + {"livingcaves:stalagmitelarge", "", "livingcaves:stalagmitelarge"}, + {"", "default:stick", ""}, + } +}) + +-- root wood +minetest.register_node("livingcaves:root_wood", { + description = S("Root Woven"), + tiles = {"livingcaves_rootdirt_woven.png"}, + paramtype = "light", + drawtype = "allfaces_optional", + is_ground_content = false, + groups = {wood = 1, snappy = 3, flammable = 2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingcaves:root_wood 4", + recipe = {{"livingcaves:rootdirt"}} +}) + +minetest.register_craft({ + output = "livingcaves:root_wood 4", + recipe = {{"livingcaves:rootdirt2"}} +}) + + stairs.register_stair_and_slab( + "livingcaves_rootdirt_woven", + "livingcaves:root_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingcaves_rootdirt_woven.png"}, + S("Root Stair"), + S("Root Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "livingcaves_root_dirt", + "livingcaves:rootdirt", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingcaves_rootdirt.png", "livingcaves_rootdirt.png", "livingcaves_rootdirt.png"}, + S("Root Dirt Stair"), + S("Root Dirt Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "livingcaves:gate_root_wood", + { + description = S("Root Fence Gate"), + texture = "livingcaves_rootdirt_fencewood.png", + material = "livingcaves:root_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "livingcaves:fence_root_wood", + { + description = S("Root Fence"), + texture = "livingcaves_rootdirt_fencewood.png", + inventory_image = "default_fence_overlay.png^livingcaves_rootdirt_fencewood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingcaves_rootdirt_fencewood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingcaves:root_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "livingcaves:fence_rail_root_wood", + { + description = S("Root Fence Rail"), + texture = "livingcaves_rootdirt_fencewood.png", + inventory_image = "default_fence_rail_overlay.png^livingcaves_rootdirt_fencewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingcaves_rootdirt_fencewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingcaves:root_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +doors.register( "door_livingcaves_root", { + tiles = { { name = "livingcaves_door_rootdirt.png", backface_culling = true } }, + description = S"Root Door", + inventory_image = "livingcaves_door_rootdirt_inv.png", + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + recipe = { + { "livingcaves:root_wood", "livingcaves:root_wood", "livingcaves:root_wood" }, + { "default:stick", "default:stick", "default:stick" }, + { "livingcaves:root_wood", "livingcaves:root_wood", "livingcaves:root_wood" }, + } +} ) + +doors.register_trapdoor("livingcaves:root_trapdoor", { + description = S("Root Trapdoor"), + inventory_image = "livingcaves_roottrapdoor.png", + wield_image = "livingcaves_roottrapdoor.png", + tile_front = "livingcaves_roottrapdoor.png", + tile_side = "livingcaves_root_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + +minetest.register_craft({ + output = "livingcaves:root_trapdoor", + recipe = { + {"livingcaves:root_wood", "livingcaves:root_wood", "livingcaves:root_wood"}, + {"livingcaves:root_wood", "livingcaves:root_wood", "livingcaves:root_wood"}, + {"", "", ""}, + } +}) + +minetest.register_node("livingcaves:root_lamp", { + description = S("Root Mushroom Lamp"), + light_source = 9, + drawtype = "torchlike", + inventory_image = "livingcaves_rootlamp.png", + wield_image = "livingcaves_rootlamp.png", + paramtype2 = "wallmounted", + walkable = false, + groups = {dig_immediate = 3, attached_node = 1}, + tiles = { + { + name = "livingcaves_rootlamp2.png", + }, + { + name = "livingcaves_rootlamp3.png", + }, + { + name = "livingcaves_rootlamp.png", + } + }, + selection_box = { + type = "wallmounted", + wall_top = {-0.25, -0.3, -0.25, 0.25, 0.5, 0.25}, + wall_bottom = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25}, + wall_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15} + } +}) + +minetest.register_craft({ + output = "livingcaves:root_lamp", + recipe = { + {"livingcaves:rootcave_hangingroot", "livingcaves:glowshroom_top", "livingcaves:glowshroom"}, + {"", "", ""}, + } +}) + +minetest.register_craft({ + output = "livingcaves:root_lamp", + recipe = { + {"livingcaves:rootcave_hangingroot2", "livingcaves:glowshroom_top", "livingcaves:glowshroom"}, + {"", "", ""}, + } +}) + +--- ice + +walls.register(":livingcaves:icebrick_wall", S"Ice Brick Wall", "livingcaves_icecbricks.png", + "livingcaves:icebrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingcaves_icecbricks", + "livingcaves:icebrick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingcaves_icecbricks.png"}, + S("Ice Brick Stair"), + S("Ice Brick Slab"), + default.node_sound_ice_defaults() + ) + +minetest.register_node("livingcaves:icebrick", { + description = S("Ice Brick"), + tiles = {"livingcaves_icecbricks.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_ice_defaults(), +}) + +minetest.register_craft({ + output = "livingcaves:icebrick", + type = "shapeless", + recipe = + {"livingcaves:icecave_ice", "livingcaves:icecave_ice"} + + +}) + +minetest.register_craft({ + output = "livingcaves:icebrick", + type = "shapeless", + recipe = + {"livingcaves:icecave_ice2", "livingcaves:icecave_ice2"} + + +}) + +minetest.register_craft({ + output = "livingcaves:icebrick_wall", + type = "shapeless", + recipe = + {"livingcaves:icebrick"} + + +}) + +default.register_fence( + "livingcaves:fence_ice", + { + description = S("Ice Fence"), + texture = "livingcaves_ice_fencewood.png", + inventory_image = "default_fence_overlay.png^livingcaves_ice_fencewood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingcaves_ice_fencewood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingcaves:icebrick", + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_ice_defaults(), + } +) + +default.register_fence_rail( + "livingcaves:fence_rail_ice", + { + description = S("Ice Fence Rail"), + texture = "livingcaves_ice_fencewood.png", + inventory_image = "default_fence_rail_overlay.png^livingcaves_ice_fencewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingcaves_ice_fencewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingcaves:icebrick", + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_ice_defaults(), + } +) + +doors.register( "door_livingcaves_ice", { + tiles = { { name = "livingcaves_door_ice.png", backface_culling = true } }, + description = S"Ice Door", + inventory_image = "livingcaves_door_ice_inv.png", + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_metal_defaults( ), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + recipe = { + { "livingcaves:icebrick", "livingcaves:icebrick", "livingcaves:icebrick" }, + { "livingcaves:icestalagmite", "livingcaves:icestalagmite", "livingcaves:icestalagmite" }, + { "livingcaves:icestalagmitelarge", "livingcaves:icestalagmitelarge", "livingcaves:icestalagmitelarge" }, + } +} ) + +doors.register_trapdoor("livingcaves:ice_trapdoor", { + description = S("Ice Trapdoor"), + inventory_image = "livingcaves_icetrapdoor.png", + wield_image = "livingcaves_icetrapdoor.png", + tile_front = "livingcaves_icetrapdoor.png", + tile_side = "livingcaves_icetrapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + sounds = default.node_sound_metal_defaults( ), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + groups = {cracky = 3, stone = 2, door = 1}, +}) + +minetest.register_craft({ + output = "livingcaves:ice_trapdoor", + recipe = { + {"livingcaves:icestalagmite", "livingcaves:icestalagmite", "livingcaves:icestalagmite"}, + {"livingcaves:icestalagmite", "livingcaves:icestalagmite", "livingcaves:icestalagmite"}, + {"", "", ""}, + } +}) + +--- dripstone + +walls.register(":livingcaves:dripstonebrick_wall", S"Dripstone Brick Wall", "livingcaves_dripstonecave_bricks.png", + "livingcaves:dripstonebrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingcaves_dripstonecave_bricks", + "livingcaves:dripstonebrick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingcaves_dripstonecave_bricks.png"}, + S("Dripstone Brick Stair"), + S("Dripstone Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("livingcaves:dripstonebrick", { + description = S("Dripstone Bricks"), + tiles = {"livingcaves_dripstonecave_bricks.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingcaves:dripstonebrick", + type = "shapeless", + recipe = + {"livingcaves:dripstonecave_bottom", "livingcaves:dripstonecave_bottom"} + + +}) + +minetest.register_craft({ + output = "livingcaves:dripstonebrick", + type = "shapeless", + recipe = + {"livingcaves:dripstonecave_bottom2", "livingcaves:dripstonecave_bottom2"} + + +}) + +minetest.register_craft({ + output = "livingcaves:dripstonebrick_wall", + type = "shapeless", + recipe = + {"livingcaves:dripstonebrick"} + + +}) + +doors.register( "door_livingcaves_dripstone", { + tiles = { { name = "livingcaves_door_dripstone.png", backface_culling = true } }, + description = S"Dripstone Door", + inventory_image = "livingcaves_door_dripstone_inv.png", + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_metal_defaults( ), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + recipe = { + { "livingcaves:dripstonebrick", "livingcaves:dripstonebrick", "livingcaves:dripstonebrick" }, + { "livingcaves:stalagmite", "livingcaves:stalagmite", "livingcaves:stalagmite" }, + { "livingcaves:stalagmitelarge", "livingcaves:stalagmitelarge", "livingcaves:stalagmitelarge" }, + } +} ) + +doors.register_trapdoor("livingcaves:dripstone_trapdoor", { + description = S("Dripstone Trapdoor"), + inventory_image = "livingcaves_dripstonetrapdoor.png", + wield_image = "livingcaves_dripstonetrapdoor.png", + tile_front = "livingcaves_dripstonetrapdoor.png", + tile_side = "livingcaves_dripstonetrapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + sounds = default.node_sound_metal_defaults( ), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + groups = {cracky = 3, stone = 2, door = 1}, +}) + +minetest.register_craft({ + output = "livingcaves:dripstone_trapdoor", + recipe = { + {"livingcaves:stalagmite", "livingcaves:stalagmite", "livingcaves:stalagmite"}, + {"livingcaves:stalagmite", "livingcaves:stalagmite", "livingcaves:stalagmite"}, + {"", "", ""}, + } +}) + +--- mushroom + +walls.register(":livingcaves:mossybrick_wall", S"Mossy Brick Wall", "livingcaves_mushcave_mossybricks.png", + "livingcaves:mossybrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingcaves_mushcave_mossybricks", + "livingcaves:mushcave_mossybricks", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingcaves_mushcave_mossybricks.png"}, + S("Mossy Stone Brick Stair"), + S("Mossy Stone Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("livingcaves:mushcave_mossybricks", { + description = S("Mushcave Mossy Bricks"), + tiles = {"livingcaves_mushcave_mossybricks.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingcaves:mushcave_mossybricks", + type = "shapeless", + recipe = + {"livingcaves:mushcave_bottom", "livingcaves:mushcave_bottom"} + + +}) + +minetest.register_craft({ + output = "livingcaves:mossybrick_wall", + type = "shapeless", + recipe = + {"livingcaves:mushcave_mossybricks"} + + +}) + +--- coocking + + + + + +minetest.register_node("livingcaves:healingsoup", { + description = S("Healing Soup"), + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + wield_image = "livingcaves_healingsoup_inv.png", + inventory_image = "livingcaves_healingsoup_inv.png", +tiles = { + { + name = "livingcaves_healingsoup.png", + animation = {type="vertical_frames", length = 2} + } + }, +selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + groups = {drink = 1, food = 1, snappy = 3, flammable = 2}, + on_use = minetest.item_eat(5), + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_craft({ + output = "livingcaves:healingsoup", +type = "shapeless", + recipe = + {"livingcaves:lichen", "livingcaves:glowshroom_top", "livingcaves:mushroom_edible", "livingcaves:bucket_cavewater"} + + +}) + +--- spider web to string + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb9", "livingcaves:spiderweb9"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb8", "livingcaves:spiderweb8"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb7", "livingcaves:spiderweb7"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb6", "livingcaves:spiderweb6"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb5", "livingcaves:spiderweb5"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb4", "livingcaves:spiderweb4"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb3", "livingcaves:spiderweb3"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb2", "livingcaves:spiderweb2"} + +}) + +minetest.register_craft({ + output = "farming:string", +type = "shapeless", + recipe = + {"livingcaves:spiderweb", "livingcaves:spiderweb"} + + +}) \ No newline at end of file diff --git a/mods/livingcaves/decor.lua b/mods/livingcaves/decor.lua new file mode 100644 index 0000000..a6b357d --- /dev/null +++ b/mods/livingcaves/decor.lua @@ -0,0 +1,2036 @@ +local S = minetest.get_translator("livingcaves") + +local modname = "livingcaves" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +--- stone cave + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:stone"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,all_ceilings", + place_offset_y = -1, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "sandstone_desert_under", "rainforest", "rainforest_under", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + y_max = -5, + y_min = -25, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_spiderweb.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:stone"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,all_ceilings", + place_offset_y = -1, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "sandstone_desert_under", "rainforest", "rainforest_under", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + y_max = -5, + y_min = -25, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_spiderweb2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:stone"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,all_floors", + place_offset_y = -1, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "sandstone_desert_under", "rainforest", "rainforest_under", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + y_max = -5, + y_min = -25, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_spiderweb3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:stone"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,all_floors", + place_offset_y = -1, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "sandstone_desert_under", "rainforest", "rainforest_under", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + y_max = -5, + y_min = -25, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_spiderweb4.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:stone"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,all_floors", + place_offset_y = -1, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "sandstone_desert_under", "rainforest", "rainforest_under", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + y_max = -5, + y_min = -25, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_spiderweb5.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:stone"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,all_floors", + place_offset_y = -1, + biomes = {"coniferous_forest_under", "coniferous_forest", "deciduous_forest_under", "deciduous_forest", "savanna", "savanna_under", "sandstone_desert_under", "rainforest", "rainforest_under", "rainforest_swamp", "rainforest_under", "naturalbiomes:alpine", "naturalbiomes:mediterranean", "naturalbiomes:wetsavanna", "livingjungle:jungle", "livingfloatlands:coldgiantforest", "livingfloatlands:giantforest", "livingfloatlands:paleojungle"}, + y_max = -5, + y_min = -25, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_spiderweb6.mts", + rotation = "random", +}) + +--- moss cave + + minetest.register_decoration({ + name = "livingcaves:moss", + deco_type = "simple", + place_on = {"livingcaves:mushcave_bottom"}, + sidelen = 16, + fill_ratio = 0.085, + flags = "all_floors", + y_max = -30, + y_min = -90, + decoration = "livingcaves:moss", + }) + +minetest.register_node("livingcaves:moss", { + description = S"Cave Moss", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_moss.png"}, + inventory_image = "livingcaves_moss.png", + wield_image = "livingcaves_moss.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + y_max = -30, + y_min = -90, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_lichycaverock.mts", + rotation = "random", +}) + +minetest.register_node("livingcaves:lichen", { + description = S"Cave Lichen", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_mushroom3.png"}, + inventory_image = "livingcaves_mushroom3.png", + wield_image = "livingcaves_mushroom3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_node("livingcaves:hangingmoss", { + description = S("Hanging Moss"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_hangingmoss.png"}, + inventory_image = "livingcaves_hangingmoss.png", + wield_image = "livingcaves_hangingmoss.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:hangingmossend", { + description = S("Hanging Moss"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_hangingmoss_top.png"}, + inventory_image = "livingcaves_hangingmoss_top.png", + wield_image = "livingcaves_hangingmoss_top.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom2"}, + sidelen = 16, + fill_ratio = 0.09, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -30, + y_min = -90, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmoss.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom2"}, + sidelen = 16, + fill_ratio = 0.08, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -30, + y_min = -90, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmoss2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom2"}, + sidelen = 16, + fill_ratio = 0.06, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -30, + y_min = -90, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmoss3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom2"}, + sidelen = 16, + fill_ratio = 0.03, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -30, + y_min = -90, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmoss4.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom2"}, + sidelen = 16, + fill_ratio = 0.01, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -30, + y_min = -90, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmoss5.mts", + rotation = "random", +}) + +minetest.register_node("livingcaves:glowshroom", { + description = S("Glowing Mushroom Stem"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_mushroom.png"}, + inventory_image = "livingcaves_mushroom.png", + wield_image = "livingcaves_mushroom.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:glowshroom_top", { + description = S("Glowing Mushroom Hat"), + drawtype = "plantlike", + waving = 0, + light_source = 7, + tiles = {"livingcaves_mushroom_top.png"}, + inventory_image = "livingcaves_mushroom_top.png", + wield_image = "livingcaves_mushroom_top.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom"}, + sidelen = 16, + fill_ratio = 0.06, + flags = "place_center_x,place_center_z,force_placement,all_floors", + y_max = -30, + y_min = -90, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_glowshroom.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:mushcave_bottom"}, + sidelen = 16, + fill_ratio = 0.06, + flags = "place_center_x,place_center_z,force_placement,all_floors", + y_max = -30, + y_min = -90, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_glowshroom2.mts", + rotation = "random", +}) + +--- dripstone cave + +minetest.register_node("livingcaves:stalagmitelarge", { + description = S("Large Stalagmite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstone.png"}, + inventory_image = "livingcaves_dripstone.png", + wield_image = "livingcaves_dripstone.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagmitelargeend", { + description = S("Large Stalagmite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstone_top.png"}, + inventory_image = "livingcaves_dripstone_top.png", + wield_image = "livingcaves_dripstone_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagmite", { + description = S("Stalagmite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstonesmall.png"}, + inventory_image = "livingcaves_dripstonesmall.png", + wield_image = "livingcaves_dripstonesmall.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagmiteend", { + description = S("Stalagmite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstonesmall_top.png"}, + inventory_image = "livingcaves_dripstonesmall_top.png", + wield_image = "livingcaves_dripstonesmall_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagtite", { + description = S("Stalagtite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstonesmall2.png"}, + inventory_image = "livingcaves_dripstonesmall2.png", + wield_image = "livingcaves_dripstonesmall2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagtiteend", { + description = S("Stalagtite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstonesmall2_top.png"}, + inventory_image = "livingcaves_dripstonesmall2_top.png", + wield_image = "livingcaves_dripstonesmall2_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagtitelarge", { + description = S("Large Stalagtite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstone2.png"}, + inventory_image = "livingcaves_dripstone2.png", + wield_image = "livingcaves_dripstone2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:stalagtitelargeend", { + description = S("Large Stalagtite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_dripstone2_top.png"}, + inventory_image = "livingcaves_dripstone2_top.png", + wield_image = "livingcaves_dripstone2_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, +noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -2, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_pool1.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, +noise_params = { + offset = -0.1, + scale = 0.05, + spread = {x = 100, y = 100, z = 100}, + seed = 4321, + octaves = 3, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -2, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_pool2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, +noise_params = { + offset = -0.1, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 1368, + octaves = 5, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -3, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_pool3.mts", + rotation = "random", +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.01, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_largestalagmitegroup.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.01, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_largestalagmitegroup2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.01, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_largestalagtitegroup.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.01, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_largestalagtitegroup2.mts", + rotation = "random", +}) + + + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagmite.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagmite2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagmite3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagmitesmall.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagmitesmall2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagmitesmall3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagtite.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagtite2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagtite3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagtitesmall.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagtitesmall2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:dripstonecave_bottom2"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -90, + y_min = -200, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_stalagtitesmall3.mts", + rotation = "random", +}) + +minetest.register_node("livingcaves:water_source", { + description = S("Cave Water Source"), + drawtype = "liquid", + waving = 3, + light_source = 7, + tiles = { + { + name = "livingcaves_water_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "livingcaves_water_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "livingcaves:water_flowing", + liquid_alternative_source = "livingcaves:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("livingcaves:water_flowing", { + description = S("Flowing Cave Water"), + drawtype = "flowingliquid", + waving = 3, + light_source = 7, + tiles = {"livingcaves_water_source_animated.png"}, + special_tiles = { + { + name = "livingcaves_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "livingcaves_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "livingcaves:water_flowing", + liquid_alternative_source = "livingcaves:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_craft({ + output = 'livingcaves:bucket_empty 1', + recipe = { + {'default_steel_ingot', '', 'livingcaves:dripstonecave_bottom'}, + {'', 'group:wood', ''}, + } +}) + + +bucket_cave = {} +bucket_cave.liquids = {} + +local function check_protection(pos, name, text) + if minetest.is_protected(pos, name) then + minetest.log("action", (name ~= "" and name or "A mod") + .. " tried to " .. text + .. " at protected position " + .. minetest.pos_to_string(pos) + .. " with a cave bucket") + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- inventory_image = texture of the new bucket item (ignored if itemname == nil) +-- name = text description of the bucket item +-- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. +-- This function can be called from any mod (that depends on bucket). +function bucket_cave.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) + bucket_cave.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + force_renew = force_renew, + } + bucket_cave.liquids[flowing] = bucket_cave.liquids[source] + + if itemname ~= nil then + minetest.register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + stack_max = 1, + liquids_pointable = true, + groups = groups, + + on_place = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + + local node = minetest.get_node_or_nil(pointed_thing.under) + local ndef = node and minetest.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if ndef and ndef.on_rightclick and + not (user and user:is_player() and + user:get_player_control().sneak) then + return ndef.on_rightclick( + pointed_thing.under, + node, user, + itemstack) + end + + local lpos + + -- Check if pointing to a buildable node + if ndef and ndef.buildable_to then + -- buildable; replace the node + lpos = pointed_thing.under + else + -- not buildable to; place the liquid above + -- check if the node above can be replaced + + lpos = pointed_thing.above + node = minetest.get_node_or_nil(lpos) + local above_ndef = node and minetest.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then + -- do not remove the bucket with the liquid + return itemstack + end + end + + if check_protection(lpos, user + and user:get_player_name() + or "", "place "..source) then + return + end + + minetest.set_node(lpos, {name = source}) + return ItemStack("livingcaves:bucket_empty") + end + }) + end +end + +minetest.register_craftitem("livingcaves:bucket_empty", { + description = S"Empty Cave Bucket", + inventory_image = "bucket_cave.png", + stack_max = 99, + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "object" then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= "node" then + -- do nothing if it's neither object nor node + return + end + -- Check if pointing to a liquid source + local node = minetest.get_node(pointed_thing.under) + local liquiddef = bucket_cave.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source then + if check_protection(pointed_thing.under, + user:get_player_name(), + "take ".. node.name) then + return + end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + if inv:room_for_item("main", {name=liquiddef.itemname}) then + inv:add_item("main", liquiddef.itemname) + else + local pos = user:get_pos() + pos.y = math.floor(pos.y + 0.5) + minetest.add_item(pos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = "livingcaves:bucket_empty "..tostring(item_count-1) + + end + + -- force_renew requires a source neighbour + local source_neighbor = false + if liquiddef.force_renew then + source_neighbor = + minetest.find_node_near(pointed_thing.under, 1, liquiddef.source) + end + if not (source_neighbor and liquiddef.force_renew) then + minetest.add_node(pointed_thing.under, {name = "air"}) + end + + return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = minetest.registered_nodes[node.name] + if node_def then + node_def.on_punch(pointed_thing.under, node, user, pointed_thing) + end + return user:get_wielded_item() + end + end, +}) + +bucket_cave.register_liquid( + "livingcaves:water_source", + "livingcaves:water_flowing", + "livingcaves:bucket_cavewater", + "bucket_cave_cavewater.png", + S"Cave Water Bucket", + {water_bucket_cave = 1} +) + +-- River water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + +bucket_cave.register_liquid( + "default:water_source", + "default:water_flowing", + "livingcaves:bucket_water", + "bucket_cave_water.png", + S"Water Bucket", + {water_bucket_cave = 1} +) + +bucket_cave.register_liquid( + "default:river_water_source", + "default:river_water_flowing", + "livingcaves:bucket_river_water", + "bucket_cave_river_water.png", + S"River Water Bucket", + {water_bucket_cave = 1}, + true +) + + +--- bacteria cave + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 3789, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -3, + y_max = -200, + y_mint = -400, + schematic = minetest.get_modpath("livingcaves").."/schematics/bacteriacave_trap.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 8734, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -2, + y_max = -200, + y_mint = -400, + schematic = minetest.get_modpath("livingcaves").."/schematics/bacteriacave_pool.mts", + rotation = "random", +}) + +minetest.register_node("livingcaves:hangingmold", { + description = S("Hanging Mold"), + drawtype = "plantlike", + waving = 0, + light_source = 3, + tiles = {"livingcaves_hangingmold.png"}, + inventory_image = "livingcaves_hangingmold.png", + wield_image = "livingcaves_hangingmold.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:hangingmoldend", { + description = S("Hanging Mold"), + drawtype = "plantlike", + waving = 0, + light_source = 3, + tiles = {"livingcaves_hangingmold_top.png"}, + inventory_image = "livingcaves_hangingmold_top.png", + wield_image = "livingcaves_hangingmold_top.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom2"}, + sidelen = 16, + fill_ratio = 0.07, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -200, + y_mint = -400, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmold.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom2"}, + sidelen = 16, + fill_ratio = 0.05, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -200, + y_mint = -400, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmold2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom2"}, + sidelen = 16, + fill_ratio = 0.03, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -200, + y_mint = -400, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingmold3.mts", + rotation = "random", +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, + fill_ratio = 0.065, + flags = "all_floors", + y_max = -100, + y_min = -200, + decoration = "livingcaves:bacteriacave_mold", + }) + +minetest.register_node("livingcaves:bacteriacave_mold", { + description = S"Bacteria with Mold", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_bacteriacave_mold.png"}, + inventory_image = "livingcaves_bacteriacave_mold.png", + wield_image = "livingcaves_bacteriacave_mold.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, + fill_ratio = 0.065, + flags = "all_floors", + y_max = -200, + y_mint = -400, + decoration = "livingcaves:bacteriacave_mold2", + }) + +minetest.register_node("livingcaves:bacteriacave_mold2", { + description = S"Bacteria Colony", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_bacteriacave_mold2.png"}, + inventory_image = "livingcaves_bacteriacave_mold2.png", + wield_image = "livingcaves_bacteriacave_mold2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, + fill_ratio = 0.065, + flags = "all_floors", + y_max = -200, + y_mint = -400, + decoration = "livingcaves:bacteriacave_mold3", + }) + +minetest.register_node("livingcaves:bacteriacave_mold3", { + description = S"Bacteria Colony", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_bacteriacave_mold3.png"}, + inventory_image = "livingcaves_bacteriacave_mold3.png", + wield_image = "livingcaves_bacteriacave_mold3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_node("livingcaves:mushroom_edible", { + description = S("Smelly Mushroom"), + drawtype = "allfaces_optional", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_mushroom2.png"}, + special_tiles = {"livingcaves_mushroom2.png"}, + paramtype = "light", + on_use = minetest.item_eat(5), + is_ground_content = false, + groups = {food = 1, snappy = 3, leafdecay = 3, flammable = 2}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingcaves:mushroom_edible'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingcaves:mushroom_edible'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "all_floors", + y_max = -200, + y_mint = -400, + decoration = "livingcaves:mushroom_edible", + }) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -2, + y_max = -200, + y_mint = -400, + schematic = minetest.get_modpath("livingcaves").."/schematics/bacteriacave_nest.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:bacteriacave_bottom"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -1, + y_max = -200, + y_mint = -400, + schematic = minetest.get_modpath("livingcaves").."/schematics/bacteriacave_nest2.mts", + rotation = "random", +}) + + + + +--- rootcave + +minetest.register_node("livingcaves:rootcave_hangingroot", { + description = S("Hanging Roots"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_rootcave_hangingroot.png"}, + inventory_image = "livingcaves_rootcave_hangingroot.png", + wield_image = "livingcaves_rootcave_hangingroot.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:rootcave_hangingroot2", { + description = S("Hanging Roots"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_rootcave_hangingroot_top.png"}, + inventory_image = "livingcaves_rootcave_hangingroot_top.png", + wield_image = "livingcaves_rootcave_hangingroot_top.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:rootdirt"}, + sidelen = 16, + fill_ratio = 0.1, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingroot.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:rootdirt"}, + sidelen = 16, + fill_ratio = 0.09, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingroot2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:rootdirt"}, + sidelen = 16, + fill_ratio = 0.07, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + place_offset_y=-1, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_hangingroot3.mts", + rotation = "random", +}) + + minetest.register_decoration({ + name = "livingcaves:rootcave_smallroot", + deco_type = "simple", + place_on = {"livingcaves:rootdirt2"}, + sidelen = 16, + offset = -0.03, + scale = 0.5, + spread = {x = 100, y = 100, z = 100}, + seed = 7123, + octaves = 7, + persist = 1, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + decoration = "livingcaves:rootcave_smallroot", + }) + +minetest.register_node("livingcaves:rootcave_smallroot", { + description = S"Small Cave Roots", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_rootcave_smallroot.png"}, + inventory_image = "livingcaves_rootcave_smallroot.png", + wield_image = "livingcaves_rootcave_smallroot.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingcaves:rootcave_smallroot2", + deco_type = "simple", + place_on = {"livingcaves:rootdirt2"}, + sidelen = 16, + offset = -0.03, + scale = 0.5, + spread = {x = 100, y = 100, z = 100}, + seed = 5123, + octaves = 7, + persist = 1, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + decoration = "livingcaves:rootcave_smallroot2", + }) + +minetest.register_node("livingcaves:rootcave_smallroot2", { + description = S"Small Cave Roots", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_rootcave_smallroot2.png"}, + inventory_image = "livingcaves_rootcave_smallroot2.png", + wield_image = "livingcaves_rootcave_smallroot2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingcaves:rootcave_bigroot", + deco_type = "simple", + place_on = {"livingcaves:rootdirt2"}, + sidelen = 16, + fill_ratio = 0.07, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + decoration = "livingcaves:rootcave_bigroot", + }) + +minetest.register_node("livingcaves:rootcave_bigroot", { + description = S"Big Cave Roots", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_rootcave_bigroot.png"}, + inventory_image = "livingcaves_rootcave_bigroot.png", + wield_image = "livingcaves_rootcave_bigroot.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingcaves:rootcave_bigroot2", + deco_type = "simple", + place_on = {"livingcaves:rootdirt2"}, + sidelen = 16, + fill_ratio = 0.05, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + y_max = -0, + y_min = -30, + decoration = "livingcaves:rootcave_bigroot2", + }) + +minetest.register_node("livingcaves:rootcave_bigroot2", { + description = S"Big Cave Roots", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingcaves_rootcave_bigroot2.png"}, + inventory_image = "livingcaves_rootcave_bigroot2.png", + wield_image = "livingcaves_rootcave_bigroot2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +--- ice cave + +minetest.register_node("livingcaves:icestalagmitelarge", { + description = S("Large Ice Stalagmite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespikelarge.png"}, + inventory_image = "livingcaves_icecave_icespikelarge.png", + wield_image = "livingcaves_icecave_icespikelarge.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagmitelargeend", { + description = S("Large Ice Stalagmite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespikelarge_top.png"}, + inventory_image = "livingcaves_icecave_icespikelarge_top.png", + wield_image = "livingcaves_icecave_icespikelarge_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagmite", { + description = S("Ice Stalagmite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespike2.png"}, + inventory_image = "livingcaves_icecave_icespike2.png", + wield_image = "livingcaves_icecave_icespike2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagmiteend", { + description = S("Ice Stalagmite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespike2_top.png"}, + inventory_image = "livingcaves_icecave_icespike2_top.png", + wield_image = "livingcaves_icecave_icespike2_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagtite", { + description = S("Ice Stalagtite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespike.png"}, + inventory_image = "livingcaves_icecave_icespike.png", + wield_image = "livingcaves_icecave_icespike.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagtiteend", { + description = S("Stalagtite Ice Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespike_top.png"}, + inventory_image = "livingcaves_icecave_icespike_top.png", + wield_image = "livingcaves_icecave_icespike_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagtitelarge", { + description = S("Large Ice Stalagtite"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespike2large.png"}, + inventory_image = "livingcaves_icecave_icespike2large.png", + wield_image = "livingcaves_icecave_icespike2large.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingcaves:icestalagtitelargeend", { + description = S("Large Ice Stalagtite Spike"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingcaves_icecave_icespike2large_top.png"}, + inventory_image = "livingcaves_icecave_icespike2large_top.png", + wield_image = "livingcaves_icecave_icespike2large_top.png", + paramtype = "light", + damage_per_second = 4, + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmite.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmite2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmite3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmitesmall.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmitesmall2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = 0, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmitesmall3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice2"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagtite.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice2"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagtite2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice2"}, + sidelen = 16, + fill_ratio = 0.02, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagtite3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice2"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagtitesmall.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice2"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagtitesmall2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice2"}, + sidelen = 16, + fill_ratio = 0.04, + flags = "place_center_x,place_center_z,force_placement,all_ceilings", + place_offset_y = -1, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagtitesmall3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 0405, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -5, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmitegroup.mts", + rotation = "random", +}) + + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingcaves:icecave_ice"}, + sidelen = 16, +noise_params = { + scale = 0.01, + spread = {x = 40, y = 40, z = 40}, + seed = 1053, + octaves = 6, + persist = 1, + }, + flags = "place_center_x,place_center_z,force_placement,all_floors", + place_offset_y = -5, + y_max = -0, + y_min = -30, + schematic = minetest.get_modpath("livingcaves").."/schematics/livingcaves_icestalagmitegroup2.mts", + rotation = "random", +}) + diff --git a/mods/livingcaves/dye.lua b/mods/livingcaves/dye.lua new file mode 100644 index 0000000..ff80012 --- /dev/null +++ b/mods/livingcaves/dye.lua @@ -0,0 +1,79 @@ + +minetest.register_craft({ + output = "dye:orange 2", + recipe = { + {"livingcaves:bacteriacave_mold3"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"livingcaves:bacteriacave_mold"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"livingcaves:rootcave_smallroot"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"livingcaves:rootcave_smallroot2"} + }, +}) + + +minetest.register_craft({ + output = "dye:green 2", + recipe = { + {"livingcaves:hangingmoss"} + }, +}) + +minetest.register_craft({ + output = "dye:green 2", + recipe = { + {"livingcaves:hangingmossend"} + }, +}) + + +minetest.register_craft({ + output = "dye:grey 2", + recipe = { + {"livingcaves:bacteriacave_mold2"} + }, +}) + +minetest.register_craft({ + output = "dye:grey 2", + recipe = { + {"livingcaves:hangingmold"} + }, +}) + +minetest.register_craft({ + output = "dye:grey 2", + recipe = { + {"livingcaves:hangingmoldend"} + }, +}) + +minetest.register_craft({ + output = "dye:dark_green 2", + recipe = { + {"livingcaves:moss"} + }, +}) + +minetest.register_craft({ + output = "dye:cyan 2", + recipe = { + {"livingcaves:lichen"} + }, +}) \ No newline at end of file diff --git a/mods/livingcaves/hunger.lua b/mods/livingcaves/hunger.lua new file mode 100644 index 0000000..8bc313a --- /dev/null +++ b/mods/livingcaves/hunger.lua @@ -0,0 +1,9 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('livingcaves:mushroom_edible', { + satiates = 2.0, + }) + hunger_ng.add_hunger_data('livingcaves:healingsoup', { + heals = 20.0, + satiates = 3.0, +}) +end \ No newline at end of file diff --git a/mods/livingcaves/init.lua b/mods/livingcaves/init.lua new file mode 100644 index 0000000..89facdf --- /dev/null +++ b/mods/livingcaves/init.lua @@ -0,0 +1,32 @@ +--This creates the livingcaves object. +livingcaves = {} + +--This creates the livingcaves.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +livingcaves.settings = { + clear_biomes = minetest.settings:get_bool("livingcaves.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("livingcaves.clear_decos") or false, + clear_ores = minetest.settings:get_bool("livingcaves.clear_ores") or false, +} + +if livingcaves.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if livingcaves.settings.clear_decos then + minetest.clear_registered_decorations() +end +if livingcaves.settings.clear_ores then + minetest.clear_registered_ores() +end + +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +-- plants +dofile(path .. "cavenodes.lua") -- +dofile(path .. "decor.lua") -- +dofile(path .. "water.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "dye.lua") -- +dofile(path .. "hunger.lua") -- + + + diff --git a/mods/livingcaves/locale/livingcaves.de.tr b/mods/livingcaves/locale/livingcaves.de.tr new file mode 100644 index 0000000..0e43c08 --- /dev/null +++ b/mods/livingcaves/locale/livingcaves.de.tr @@ -0,0 +1,85 @@ +# textdomain: livingcaves + +### cavenodes.lua ### +Mossy Cave Rock=Moosbewachsener Höhlenstein +Lichen infested Cave Rock=Flechtenzersetzter Höhlenstein +Mushroom Infested Rock=Pilzzersetzter Stein +Dripstone Cave Stone=Tropfstein Höhlenstein +Bacteria Infested Rock=Bakterienzersetzter Stein +Dirt With Roots=Dreck mit Wurzeln +Cave Ice=Höhleneis +Flesh Eating Bacteria Trapstone=Fleischfressender Bakterien Stein +Flesh Eating Bacteria Trap=Fleischfressende Bakterien Falle +Bacteria Poolstone=Bakterien Beckenstein +Bacteria Nest Foot=Bakterien Nestfuß +Bacteria Nest Core=Bakteriennest Kern +Spider Web=Spinnennetz + +### crafting.lua ### +Root Woven=Geflochtene Wurzel +Root Stair=Wurzeltreppe +Root Slab=Wurzelplatte +Root Dirt Stair=Wurzeldreck Treppe +Root Dirt Slab=Wurzeldreck Platte +Root Fence Gate=Wurzelzauntor +Root Fence=Wurzelzaun +Root Fence Rail=Wurzelzaun Geländer +Root Door=Wurzeltür +Root Trapdoor=Wurzelfalltür +Root Mushroom Lamp=Wurzelpilz Lampe +Ice Brick Wall=Eisziegelmauer +Ice Brick Stair=Eisziegeltreppe +Ice Brick Slab=Eisziegelplatte +Ice Brick=Eisziegel +Ice Fence=Eiszaun +Ice Fence Rail=Eiszaun Geländer +Ice Door=Eistür +Ice Trapdoor=Eisfalltür +Dripstone Brick Wall=Tropfsteinziegelmauer +Dripstone Brick Stair=Tropfsteinziegeltreppe +Dripstone Brick Slab=Tropfsteinziegelplatte +Dripstone Bricks=Tropfsteinziegel +Dripstone Door=Tropfsteintür +Dripstone Trapdoor=Tropfsteinfalltür +Mossy Brick Wall=Bemooste Ziegelmauer +Mossy Stone Brick Stair=Bemooste Ziegletreppe +Mossy Stone Brick Slab=Bemooste Ziegelplatte +Mushcave Mossy Bricks=Bemooste Ziegel +Healing Soup=Heilende Suppe + +### decor.lua ### +Cave Moss=Höhlenmoos +Cave Lichen=Höhlenflechte +Hanging Moss=Hängemoos +Glowing Mushroom Stem=Leuchtender Pilzstamm +Glowing Mushroom Hat=Leuchtender Pilzhut +Large Stalagmite=Großer Stalagmit +Large Stalagmite Spike=Große Stalagmitenspitze +Stalagmite=Stalagmit +Stalagmite Spike=Stalgmitenspitze +Stalagtite=Stalagtit +Stalagtite Spike=Stalagtitenspitze +Large Stalagtite=Großer Stalagtit +Large Stalagtite Spike=Große Stalagtitenspitze +Cave Water Source=Höhlenwasser Quelle +Flowing Cave Water=Fließendes Höhlenwasser +Empty Cave Bucket=Leerer Höhleneimer +Cave Water Bucket=Höhlenwassereimer +Water Bucket=Wassereimer +River Water Bucket=Flusswassereimer +Hanging Mold=Hängender Schimmel +Bacteria with Mold=Bakterien mit Schimmel +Bacteria Colony=Bakterienkolonie +Smelly Mushroom=Stinkender Pilz +Hanging Roots=Hängende Wurzeln +Small Cave Roots=Kleine Höhlenwurzeln +Big Cave Roots=Große Höhlenwurzeln +Large Ice Stalagmite=Großer Eisstalagmit +Large Ice Stalagmite Spike=Große Eisstalagmitenspitze +Ice Stalagmite=Eisstalagmit +Ice Stalagmite Spike=Eisstalagmit Spitze +Ice Stalagtite=Eisstalagtit +Stalagtite Ice Spike=Eisstalagtitenspitze +Large Ice Stalagtite=Großer Eisstalagtit +Large Ice Stalagtite Spike=Große Eisstalagtitenspitze + diff --git a/mods/livingcaves/mod.conf b/mods/livingcaves/mod.conf new file mode 100644 index 0000000..ce211c9 --- /dev/null +++ b/mods/livingcaves/mod.conf @@ -0,0 +1,3 @@ +name = livingcaves +description = modifies the caves of minetest game +depends = default, stairs, doors, bucket \ No newline at end of file diff --git a/mods/livingcaves/schematics/bacteriacave_nest.mts b/mods/livingcaves/schematics/bacteriacave_nest.mts new file mode 100644 index 0000000..78c36eb Binary files /dev/null and b/mods/livingcaves/schematics/bacteriacave_nest.mts differ diff --git a/mods/livingcaves/schematics/bacteriacave_nest2.mts b/mods/livingcaves/schematics/bacteriacave_nest2.mts new file mode 100644 index 0000000..57ae3f9 Binary files /dev/null and b/mods/livingcaves/schematics/bacteriacave_nest2.mts differ diff --git a/mods/livingcaves/schematics/bacteriacave_pool.mts b/mods/livingcaves/schematics/bacteriacave_pool.mts new file mode 100644 index 0000000..bae4cfe Binary files /dev/null and b/mods/livingcaves/schematics/bacteriacave_pool.mts differ diff --git a/mods/livingcaves/schematics/bacteriacave_trap.mts b/mods/livingcaves/schematics/bacteriacave_trap.mts new file mode 100644 index 0000000..f3dfaf7 Binary files /dev/null and b/mods/livingcaves/schematics/bacteriacave_trap.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_glowshroom.mts b/mods/livingcaves/schematics/livingcaves_glowshroom.mts new file mode 100644 index 0000000..b77b433 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_glowshroom.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_glowshroom2.mts b/mods/livingcaves/schematics/livingcaves_glowshroom2.mts new file mode 100644 index 0000000..a41695c Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_glowshroom2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmold.mts b/mods/livingcaves/schematics/livingcaves_hangingmold.mts new file mode 100644 index 0000000..6ea2e6b Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmold.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmold2.mts b/mods/livingcaves/schematics/livingcaves_hangingmold2.mts new file mode 100644 index 0000000..f87e3f3 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmold2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmold3.mts b/mods/livingcaves/schematics/livingcaves_hangingmold3.mts new file mode 100644 index 0000000..669b5d4 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmold3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmoss.mts b/mods/livingcaves/schematics/livingcaves_hangingmoss.mts new file mode 100644 index 0000000..2fca466 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmoss.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmoss2.mts b/mods/livingcaves/schematics/livingcaves_hangingmoss2.mts new file mode 100644 index 0000000..83b9568 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmoss2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmoss3.mts b/mods/livingcaves/schematics/livingcaves_hangingmoss3.mts new file mode 100644 index 0000000..d945829 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmoss3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmoss4.mts b/mods/livingcaves/schematics/livingcaves_hangingmoss4.mts new file mode 100644 index 0000000..d73c9bf Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmoss4.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingmoss5.mts b/mods/livingcaves/schematics/livingcaves_hangingmoss5.mts new file mode 100644 index 0000000..d586952 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingmoss5.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingroot.mts b/mods/livingcaves/schematics/livingcaves_hangingroot.mts new file mode 100644 index 0000000..173b7f3 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingroot.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingroot2.mts b/mods/livingcaves/schematics/livingcaves_hangingroot2.mts new file mode 100644 index 0000000..f1ed952 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingroot2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_hangingroot3.mts b/mods/livingcaves/schematics/livingcaves_hangingroot3.mts new file mode 100644 index 0000000..d61ddb4 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_hangingroot3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmite.mts b/mods/livingcaves/schematics/livingcaves_icestalagmite.mts new file mode 100644 index 0000000..ca40779 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmite.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmite2.mts b/mods/livingcaves/schematics/livingcaves_icestalagmite2.mts new file mode 100644 index 0000000..0ebcc6e Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmite2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmite3.mts b/mods/livingcaves/schematics/livingcaves_icestalagmite3.mts new file mode 100644 index 0000000..69f6f63 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmite3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmitegroup.mts b/mods/livingcaves/schematics/livingcaves_icestalagmitegroup.mts new file mode 100644 index 0000000..19e77b8 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmitegroup.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmitegroup2.mts b/mods/livingcaves/schematics/livingcaves_icestalagmitegroup2.mts new file mode 100644 index 0000000..1b794a7 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmitegroup2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmitesmall.mts b/mods/livingcaves/schematics/livingcaves_icestalagmitesmall.mts new file mode 100644 index 0000000..6b82fd2 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmitesmall.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmitesmall2.mts b/mods/livingcaves/schematics/livingcaves_icestalagmitesmall2.mts new file mode 100644 index 0000000..03f6e84 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmitesmall2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagmitesmall3.mts b/mods/livingcaves/schematics/livingcaves_icestalagmitesmall3.mts new file mode 100644 index 0000000..513bc0f Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagmitesmall3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagtite.mts b/mods/livingcaves/schematics/livingcaves_icestalagtite.mts new file mode 100644 index 0000000..89c4b9c Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagtite.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagtite2.mts b/mods/livingcaves/schematics/livingcaves_icestalagtite2.mts new file mode 100644 index 0000000..a60db92 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagtite2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagtite3.mts b/mods/livingcaves/schematics/livingcaves_icestalagtite3.mts new file mode 100644 index 0000000..f8d3446 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagtite3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagtitesmall.mts b/mods/livingcaves/schematics/livingcaves_icestalagtitesmall.mts new file mode 100644 index 0000000..dba0df4 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagtitesmall.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagtitesmall2.mts b/mods/livingcaves/schematics/livingcaves_icestalagtitesmall2.mts new file mode 100644 index 0000000..ff7bb61 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagtitesmall2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_icestalagtitesmall3.mts b/mods/livingcaves/schematics/livingcaves_icestalagtitesmall3.mts new file mode 100644 index 0000000..324de7f Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_icestalagtitesmall3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_largestalagmitegroup.mts b/mods/livingcaves/schematics/livingcaves_largestalagmitegroup.mts new file mode 100644 index 0000000..359ef06 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_largestalagmitegroup.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_largestalagmitegroup2.mts b/mods/livingcaves/schematics/livingcaves_largestalagmitegroup2.mts new file mode 100644 index 0000000..8fd8890 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_largestalagmitegroup2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_largestalagtitegroup.mts b/mods/livingcaves/schematics/livingcaves_largestalagtitegroup.mts new file mode 100644 index 0000000..b6391cf Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_largestalagtitegroup.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_largestalagtitegroup2.mts b/mods/livingcaves/schematics/livingcaves_largestalagtitegroup2.mts new file mode 100644 index 0000000..cec0b7a Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_largestalagtitegroup2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_lichycaverock.mts b/mods/livingcaves/schematics/livingcaves_lichycaverock.mts new file mode 100644 index 0000000..30c3cc8 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_lichycaverock.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_pool1.mts b/mods/livingcaves/schematics/livingcaves_pool1.mts new file mode 100644 index 0000000..9d56024 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_pool1.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_pool2.mts b/mods/livingcaves/schematics/livingcaves_pool2.mts new file mode 100644 index 0000000..6569814 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_pool2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_pool3.mts b/mods/livingcaves/schematics/livingcaves_pool3.mts new file mode 100644 index 0000000..bd1c5e2 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_pool3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_spiderweb.mts b/mods/livingcaves/schematics/livingcaves_spiderweb.mts new file mode 100644 index 0000000..d89933b Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_spiderweb.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_spiderweb2.mts b/mods/livingcaves/schematics/livingcaves_spiderweb2.mts new file mode 100644 index 0000000..4ae4b6a Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_spiderweb2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_spiderweb3.mts b/mods/livingcaves/schematics/livingcaves_spiderweb3.mts new file mode 100644 index 0000000..0d15905 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_spiderweb3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_spiderweb4.mts b/mods/livingcaves/schematics/livingcaves_spiderweb4.mts new file mode 100644 index 0000000..24ee2f7 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_spiderweb4.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_spiderweb5.mts b/mods/livingcaves/schematics/livingcaves_spiderweb5.mts new file mode 100644 index 0000000..81f937c Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_spiderweb5.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_spiderweb6.mts b/mods/livingcaves/schematics/livingcaves_spiderweb6.mts new file mode 100644 index 0000000..8ffb883 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_spiderweb6.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagmite.mts b/mods/livingcaves/schematics/livingcaves_stalagmite.mts new file mode 100644 index 0000000..0e6aef4 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagmite.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagmite2.mts b/mods/livingcaves/schematics/livingcaves_stalagmite2.mts new file mode 100644 index 0000000..5193216 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagmite2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagmite3.mts b/mods/livingcaves/schematics/livingcaves_stalagmite3.mts new file mode 100644 index 0000000..083b039 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagmite3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagmitesmall.mts b/mods/livingcaves/schematics/livingcaves_stalagmitesmall.mts new file mode 100644 index 0000000..7e6227b Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagmitesmall.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagmitesmall2.mts b/mods/livingcaves/schematics/livingcaves_stalagmitesmall2.mts new file mode 100644 index 0000000..b118f73 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagmitesmall2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagmitesmall3.mts b/mods/livingcaves/schematics/livingcaves_stalagmitesmall3.mts new file mode 100644 index 0000000..338009d Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagmitesmall3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagtite.mts b/mods/livingcaves/schematics/livingcaves_stalagtite.mts new file mode 100644 index 0000000..3b00f7f Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagtite.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagtite2.mts b/mods/livingcaves/schematics/livingcaves_stalagtite2.mts new file mode 100644 index 0000000..3cd70db Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagtite2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagtite3.mts b/mods/livingcaves/schematics/livingcaves_stalagtite3.mts new file mode 100644 index 0000000..7388131 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagtite3.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagtitesmall.mts b/mods/livingcaves/schematics/livingcaves_stalagtitesmall.mts new file mode 100644 index 0000000..59d32b5 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagtitesmall.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagtitesmall2.mts b/mods/livingcaves/schematics/livingcaves_stalagtitesmall2.mts new file mode 100644 index 0000000..7de07f2 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagtitesmall2.mts differ diff --git a/mods/livingcaves/schematics/livingcaves_stalagtitesmall3.mts b/mods/livingcaves/schematics/livingcaves_stalagtitesmall3.mts new file mode 100644 index 0000000..ead9993 Binary files /dev/null and b/mods/livingcaves/schematics/livingcaves_stalagtitesmall3.mts differ diff --git a/mods/livingcaves/screenshot.png b/mods/livingcaves/screenshot.png new file mode 100644 index 0000000..7c27bcf Binary files /dev/null and b/mods/livingcaves/screenshot.png differ diff --git a/mods/livingcaves/settingtypes.txt b/mods/livingcaves/settingtypes.txt new file mode 100644 index 0000000..5d9f9bc --- /dev/null +++ b/mods/livingcaves/settingtypes.txt @@ -0,0 +1,10 @@ +#livingcaves settings + +#If enabled, will clear all registered biomes. +livingcaves.clear_biomes (Enable to clear registered biomes. true / false) bool true + +#If enabled, will clear all registered decorations. +livingcaves.clear_decos (Enable to clear registered decorations. true / false) bool true + +#If enabled, will clear all registered ores. +livingcaves.clear_ores (Enable to clear registered ores. true / false) bool false diff --git a/mods/livingcaves/textures/bucket_cave.png b/mods/livingcaves/textures/bucket_cave.png new file mode 100644 index 0000000..c32e05a Binary files /dev/null and b/mods/livingcaves/textures/bucket_cave.png differ diff --git a/mods/livingcaves/textures/bucket_cave_cavewater.png b/mods/livingcaves/textures/bucket_cave_cavewater.png new file mode 100644 index 0000000..53a77a5 Binary files /dev/null and b/mods/livingcaves/textures/bucket_cave_cavewater.png differ diff --git a/mods/livingcaves/textures/bucket_cave_river_water.png b/mods/livingcaves/textures/bucket_cave_river_water.png new file mode 100644 index 0000000..c726c2e Binary files /dev/null and b/mods/livingcaves/textures/bucket_cave_river_water.png differ diff --git a/mods/livingcaves/textures/bucket_cave_water.png b/mods/livingcaves/textures/bucket_cave_water.png new file mode 100644 index 0000000..08f44cc Binary files /dev/null and b/mods/livingcaves/textures/bucket_cave_water.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_bottom.png b/mods/livingcaves/textures/livingcaves_bacteriacave_bottom.png new file mode 100644 index 0000000..8f11c97 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_bottom.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_bottom2.png b/mods/livingcaves/textures/livingcaves_bacteriacave_bottom2.png new file mode 100644 index 0000000..7b5a011 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_bottom2.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_glowbricks.png b/mods/livingcaves/textures/livingcaves_bacteriacave_glowbricks.png new file mode 100644 index 0000000..7b5a011 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_glowbricks.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_mold.png b/mods/livingcaves/textures/livingcaves_bacteriacave_mold.png new file mode 100644 index 0000000..09b311a Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_mold.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_mold2.png b/mods/livingcaves/textures/livingcaves_bacteriacave_mold2.png new file mode 100644 index 0000000..1ae491b Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_mold2.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_mold3.png b/mods/livingcaves/textures/livingcaves_bacteriacave_mold3.png new file mode 100644 index 0000000..38dda50 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_mold3.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_nest.png b/mods/livingcaves/textures/livingcaves_bacteriacave_nest.png new file mode 100644 index 0000000..18994a9 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_nest.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_nestfoot.png b/mods/livingcaves/textures/livingcaves_bacteriacave_nestfoot.png new file mode 100644 index 0000000..b82b2dc Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_nestfoot.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_poolstone.png b/mods/livingcaves/textures/livingcaves_bacteriacave_poolstone.png new file mode 100644 index 0000000..b69ddf8 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_poolstone.png differ diff --git a/mods/livingcaves/textures/livingcaves_bacteriacave_trapstone.png b/mods/livingcaves/textures/livingcaves_bacteriacave_trapstone.png new file mode 100644 index 0000000..3b7a6f4 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_bacteriacave_trapstone.png differ diff --git a/mods/livingcaves/textures/livingcaves_door_dripstone.png b/mods/livingcaves/textures/livingcaves_door_dripstone.png new file mode 100644 index 0000000..7a49d2d Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_door_dripstone.png differ diff --git a/mods/livingcaves/textures/livingcaves_door_dripstone_inv.png b/mods/livingcaves/textures/livingcaves_door_dripstone_inv.png new file mode 100644 index 0000000..5a42e03 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_door_dripstone_inv.png differ diff --git a/mods/livingcaves/textures/livingcaves_door_ice.png b/mods/livingcaves/textures/livingcaves_door_ice.png new file mode 100644 index 0000000..47bf354 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_door_ice.png differ diff --git a/mods/livingcaves/textures/livingcaves_door_ice_inv.png b/mods/livingcaves/textures/livingcaves_door_ice_inv.png new file mode 100644 index 0000000..992c89f Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_door_ice_inv.png differ diff --git a/mods/livingcaves/textures/livingcaves_door_rootdirt.png b/mods/livingcaves/textures/livingcaves_door_rootdirt.png new file mode 100644 index 0000000..ac7bab5 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_door_rootdirt.png differ diff --git a/mods/livingcaves/textures/livingcaves_door_rootdirt_inv.png b/mods/livingcaves/textures/livingcaves_door_rootdirt_inv.png new file mode 100644 index 0000000..ea83565 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_door_rootdirt_inv.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstone.png b/mods/livingcaves/textures/livingcaves_dripstone.png new file mode 100644 index 0000000..9a63ec4 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstone.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstone2.png b/mods/livingcaves/textures/livingcaves_dripstone2.png new file mode 100644 index 0000000..489a93a Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstone2.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstone2_top.png b/mods/livingcaves/textures/livingcaves_dripstone2_top.png new file mode 100644 index 0000000..707eb8b Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstone2_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstone_top.png b/mods/livingcaves/textures/livingcaves_dripstone_top.png new file mode 100644 index 0000000..a325f35 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstone_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonecave_bottom.png b/mods/livingcaves/textures/livingcaves_dripstonecave_bottom.png new file mode 100644 index 0000000..9123508 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonecave_bottom.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonecave_bottom2.png b/mods/livingcaves/textures/livingcaves_dripstonecave_bottom2.png new file mode 100644 index 0000000..cb3dfcb Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonecave_bottom2.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonecave_bricks.png b/mods/livingcaves/textures/livingcaves_dripstonecave_bricks.png new file mode 100644 index 0000000..66b572e Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonecave_bricks.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonesmall.png b/mods/livingcaves/textures/livingcaves_dripstonesmall.png new file mode 100644 index 0000000..03809d6 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonesmall.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonesmall2.png b/mods/livingcaves/textures/livingcaves_dripstonesmall2.png new file mode 100644 index 0000000..b75fc8b Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonesmall2.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonesmall2_top.png b/mods/livingcaves/textures/livingcaves_dripstonesmall2_top.png new file mode 100644 index 0000000..aff5b9e Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonesmall2_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonesmall_top.png b/mods/livingcaves/textures/livingcaves_dripstonesmall_top.png new file mode 100644 index 0000000..2e998a3 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonesmall_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonetrapdoor.png b/mods/livingcaves/textures/livingcaves_dripstonetrapdoor.png new file mode 100644 index 0000000..2ea3200 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonetrapdoor.png differ diff --git a/mods/livingcaves/textures/livingcaves_dripstonetrapdoor_side.png b/mods/livingcaves/textures/livingcaves_dripstonetrapdoor_side.png new file mode 100644 index 0000000..e7fd38b Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_dripstonetrapdoor_side.png differ diff --git a/mods/livingcaves/textures/livingcaves_hangingmold.png b/mods/livingcaves/textures/livingcaves_hangingmold.png new file mode 100644 index 0000000..0f2c431 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_hangingmold.png differ diff --git a/mods/livingcaves/textures/livingcaves_hangingmold_top.png b/mods/livingcaves/textures/livingcaves_hangingmold_top.png new file mode 100644 index 0000000..ead95b5 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_hangingmold_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_hangingmoss.png b/mods/livingcaves/textures/livingcaves_hangingmoss.png new file mode 100644 index 0000000..1461fdf Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_hangingmoss.png differ diff --git a/mods/livingcaves/textures/livingcaves_hangingmoss_top.png b/mods/livingcaves/textures/livingcaves_hangingmoss_top.png new file mode 100644 index 0000000..6c9d156 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_hangingmoss_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_healingsoup.png b/mods/livingcaves/textures/livingcaves_healingsoup.png new file mode 100644 index 0000000..855533f Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_healingsoup.png differ diff --git a/mods/livingcaves/textures/livingcaves_healingsoup_inv.png b/mods/livingcaves/textures/livingcaves_healingsoup_inv.png new file mode 100644 index 0000000..f2e72b2 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_healingsoup_inv.png differ diff --git a/mods/livingcaves/textures/livingcaves_ice_fencewood.png b/mods/livingcaves/textures/livingcaves_ice_fencewood.png new file mode 100644 index 0000000..b63f040 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_ice_fencewood.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_ice.png b/mods/livingcaves/textures/livingcaves_icecave_ice.png new file mode 100644 index 0000000..027cc55 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_ice.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_ice2.png b/mods/livingcaves/textures/livingcaves_icecave_ice2.png new file mode 100644 index 0000000..a6a18f9 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_ice2.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespike.png b/mods/livingcaves/textures/livingcaves_icecave_icespike.png new file mode 100644 index 0000000..2aa19b1 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespike.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespike2.png b/mods/livingcaves/textures/livingcaves_icecave_icespike2.png new file mode 100644 index 0000000..cc5ec98 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespike2.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespike2_top.png b/mods/livingcaves/textures/livingcaves_icecave_icespike2_top.png new file mode 100644 index 0000000..187cece Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespike2_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespike2large.png b/mods/livingcaves/textures/livingcaves_icecave_icespike2large.png new file mode 100644 index 0000000..fad3bb6 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespike2large.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespike2large_top.png b/mods/livingcaves/textures/livingcaves_icecave_icespike2large_top.png new file mode 100644 index 0000000..ed41638 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespike2large_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespike_top.png b/mods/livingcaves/textures/livingcaves_icecave_icespike_top.png new file mode 100644 index 0000000..e85cd35 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespike_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespikelarge.png b/mods/livingcaves/textures/livingcaves_icecave_icespikelarge.png new file mode 100644 index 0000000..25198d1 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespikelarge.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecave_icespikelarge_top.png b/mods/livingcaves/textures/livingcaves_icecave_icespikelarge_top.png new file mode 100644 index 0000000..d7ed50f Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecave_icespikelarge_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_icecbricks.png b/mods/livingcaves/textures/livingcaves_icecbricks.png new file mode 100644 index 0000000..974c36c Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icecbricks.png differ diff --git a/mods/livingcaves/textures/livingcaves_icetrapdoor.png b/mods/livingcaves/textures/livingcaves_icetrapdoor.png new file mode 100644 index 0000000..a48c6bf Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icetrapdoor.png differ diff --git a/mods/livingcaves/textures/livingcaves_icetrapdoor_side.png b/mods/livingcaves/textures/livingcaves_icetrapdoor_side.png new file mode 100644 index 0000000..bb9757d Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_icetrapdoor_side.png differ diff --git a/mods/livingcaves/textures/livingcaves_lichyrock.png b/mods/livingcaves/textures/livingcaves_lichyrock.png new file mode 100644 index 0000000..ba8ad12 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_lichyrock.png differ diff --git a/mods/livingcaves/textures/livingcaves_moss.png b/mods/livingcaves/textures/livingcaves_moss.png new file mode 100644 index 0000000..ea954e3 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_moss.png differ diff --git a/mods/livingcaves/textures/livingcaves_mossycaverock.png b/mods/livingcaves/textures/livingcaves_mossycaverock.png new file mode 100644 index 0000000..5e5abb3 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mossycaverock.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushcave_bottom.png b/mods/livingcaves/textures/livingcaves_mushcave_bottom.png new file mode 100644 index 0000000..6c4e6fd Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushcave_bottom.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushcave_bottom2.png b/mods/livingcaves/textures/livingcaves_mushcave_bottom2.png new file mode 100644 index 0000000..b1ce3b0 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushcave_bottom2.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushcave_mossybricks.png b/mods/livingcaves/textures/livingcaves_mushcave_mossybricks.png new file mode 100644 index 0000000..af75a45 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushcave_mossybricks.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushroom.png b/mods/livingcaves/textures/livingcaves_mushroom.png new file mode 100644 index 0000000..82cad57 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushroom.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushroom2.png b/mods/livingcaves/textures/livingcaves_mushroom2.png new file mode 100644 index 0000000..290f1ef Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushroom2.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushroom3.png b/mods/livingcaves/textures/livingcaves_mushroom3.png new file mode 100644 index 0000000..1f5f6eb Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushroom3.png differ diff --git a/mods/livingcaves/textures/livingcaves_mushroom_top.png b/mods/livingcaves/textures/livingcaves_mushroom_top.png new file mode 100644 index 0000000..aee4999 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_mushroom_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_root_trapdoor_side.png b/mods/livingcaves/textures/livingcaves_root_trapdoor_side.png new file mode 100644 index 0000000..314b996 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_root_trapdoor_side.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootcave_bigroot.png b/mods/livingcaves/textures/livingcaves_rootcave_bigroot.png new file mode 100644 index 0000000..24029da Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootcave_bigroot.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootcave_bigroot2.png b/mods/livingcaves/textures/livingcaves_rootcave_bigroot2.png new file mode 100644 index 0000000..29fcfcc Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootcave_bigroot2.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootcave_hangingroot.png b/mods/livingcaves/textures/livingcaves_rootcave_hangingroot.png new file mode 100644 index 0000000..9a182f8 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootcave_hangingroot.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootcave_hangingroot_top.png b/mods/livingcaves/textures/livingcaves_rootcave_hangingroot_top.png new file mode 100644 index 0000000..f62e9ad Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootcave_hangingroot_top.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootcave_smallroot.png b/mods/livingcaves/textures/livingcaves_rootcave_smallroot.png new file mode 100644 index 0000000..ea3bb96 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootcave_smallroot.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootcave_smallroot2.png b/mods/livingcaves/textures/livingcaves_rootcave_smallroot2.png new file mode 100644 index 0000000..cf17f4f Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootcave_smallroot2.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootdirt.png b/mods/livingcaves/textures/livingcaves_rootdirt.png new file mode 100644 index 0000000..e26b0e9 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootdirt.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootdirt2.png b/mods/livingcaves/textures/livingcaves_rootdirt2.png new file mode 100644 index 0000000..53fa7c6 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootdirt2.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootdirt_fencewood.png b/mods/livingcaves/textures/livingcaves_rootdirt_fencewood.png new file mode 100644 index 0000000..622453a Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootdirt_fencewood.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootdirt_woven.png b/mods/livingcaves/textures/livingcaves_rootdirt_woven.png new file mode 100644 index 0000000..3e3951c Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootdirt_woven.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootlamp.png b/mods/livingcaves/textures/livingcaves_rootlamp.png new file mode 100644 index 0000000..0a89e30 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootlamp.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootlamp2.png b/mods/livingcaves/textures/livingcaves_rootlamp2.png new file mode 100644 index 0000000..d73f5da Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootlamp2.png differ diff --git a/mods/livingcaves/textures/livingcaves_rootlamp3.png b/mods/livingcaves/textures/livingcaves_rootlamp3.png new file mode 100644 index 0000000..c38bcc5 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_rootlamp3.png differ diff --git a/mods/livingcaves/textures/livingcaves_roottrapdoor.png b/mods/livingcaves/textures/livingcaves_roottrapdoor.png new file mode 100644 index 0000000..423960f Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_roottrapdoor.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet.png b/mods/livingcaves/textures/livingcaves_spidernet.png new file mode 100644 index 0000000..c8bf58f Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet2.png b/mods/livingcaves/textures/livingcaves_spidernet2.png new file mode 100644 index 0000000..81ef840 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet2.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet3.png b/mods/livingcaves/textures/livingcaves_spidernet3.png new file mode 100644 index 0000000..9c34d86 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet3.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet4.png b/mods/livingcaves/textures/livingcaves_spidernet4.png new file mode 100644 index 0000000..5272ed1 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet4.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet5.png b/mods/livingcaves/textures/livingcaves_spidernet5.png new file mode 100644 index 0000000..593458b Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet5.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet6.png b/mods/livingcaves/textures/livingcaves_spidernet6.png new file mode 100644 index 0000000..41b60e5 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet6.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet7.png b/mods/livingcaves/textures/livingcaves_spidernet7.png new file mode 100644 index 0000000..65d53bc Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet7.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet8.png b/mods/livingcaves/textures/livingcaves_spidernet8.png new file mode 100644 index 0000000..1019ada Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet8.png differ diff --git a/mods/livingcaves/textures/livingcaves_spidernet9.png b/mods/livingcaves/textures/livingcaves_spidernet9.png new file mode 100644 index 0000000..00109b5 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_spidernet9.png differ diff --git a/mods/livingcaves/textures/livingcaves_water_flowing_animated.png b/mods/livingcaves/textures/livingcaves_water_flowing_animated.png new file mode 100644 index 0000000..954af40 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_water_flowing_animated.png differ diff --git a/mods/livingcaves/textures/livingcaves_water_source_animated.png b/mods/livingcaves/textures/livingcaves_water_source_animated.png new file mode 100644 index 0000000..5453b09 Binary files /dev/null and b/mods/livingcaves/textures/livingcaves_water_source_animated.png differ diff --git a/mods/livingcaves/water.lua b/mods/livingcaves/water.lua new file mode 100644 index 0000000..3fcbe73 --- /dev/null +++ b/mods/livingcaves/water.lua @@ -0,0 +1,106 @@ +local S = minetest.get_translator("livingcaves") + +-- Parameters + +-- Node search radius around player +local radius = 8 + +local allsounds = { + ["env_sounds_water"] = { + trigger = {"livingcaves:water_flowing"}, + base_volume = 0.04, + max_volume = 0.4, + per_node = 0.004, + }, + +} + +if minetest.settings:get_bool("river_source_sounds") then + table.insert(allsounds["env_sounds_water"].trigger, + "livingcaves:water_source") +end + + +-- Cache the union of all trigger nodes + +local cache_triggers = {} + +for sound, def in pairs(allsounds) do + for _, name in ipairs(def.trigger) do + table.insert(cache_triggers, name) + end +end + + +-- Update sound for player + +local function update_sound(player) + local player_name = player:get_player_name() + local ppos = player:get_pos() + ppos = vector.add(ppos, player:get_properties().eye_height) + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + + local pos = minetest.find_nodes_in_area(areamin, areamax, cache_triggers, true) + if next(pos) == nil then -- If table empty + return + end + for sound, def in pairs(allsounds) do + -- Find average position + local posav = {0, 0, 0} + local count = 0 + for _, name in ipairs(def.trigger) do + if pos[name] then + for _, p in ipairs(pos[name]) do + posav[1] = posav[1] + p.x + posav[2] = posav[2] + p.y + posav[3] = posav[3] + p.z + end + count = count + #pos[name] + end + end + + if count > 0 then + posav = vector.new(posav[1] / count, posav[2] / count, + posav[3] / count) + + -- Calculate gain + local gain = def.base_volume + if type(def.per_node) == 'table' then + for name, multiplier in pairs(def.per_node) do + if pos[name] then + gain = gain + #pos[name] * multiplier + end + end + else + gain = gain + count * def.per_node + end + gain = math.min(gain, def.max_volume) + + minetest.sound_play(sound, { + pos = posav, + to_player = player_name, + gain = gain, + }, true) + end + end +end + + +-- Update sound when player joins + +minetest.register_on_joinplayer(function(player) + update_sound(player) +end) + + +-- Cyclic sound update + +local function cyclic_update() + for _, player in pairs(minetest.get_connected_players()) do + update_sound(player) + end + minetest.after(3.5, cyclic_update) +end + +minetest.after(0, cyclic_update) diff --git a/mods/livingcavesmobs/LICENSE b/mods/livingcavesmobs/LICENSE new file mode 100644 index 0000000..e8aca04 --- /dev/null +++ b/mods/livingcavesmobs/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2022 +Textures, Models, Sounds and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/livingcavesmobs/biter.lua b/mods/livingcavesmobs/biter.lua new file mode 100644 index 0000000..a7af952 --- /dev/null +++ b/mods/livingcavesmobs/biter.lua @@ -0,0 +1,89 @@ +local S = minetest.get_translator("livingcavesmobs") + +mobs:register_mob("livingcavesmobs:biter", { +stepheight = 3, + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 4, + hp_min = 35, + hp_max = 55, + armor = 100, + collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.95, 0.3}, + visual = "mesh", + mesh = "Biter.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturebiter.png"}, + {"texturebiter2.png"}, + {"texturebiter3.png"}, + }, + sounds = { + random = "livingcavesmobs_biter2", + attack = "livingcavesmobs_biter2", + death = "livingcavesmobs_biter3", + damage = "livingcavesmobs_biter", + }, + makes_footstep_sound = true, + walk_velocity = 2, + run_velocity = 3, + runaway = false, + jump = true, + jump_height = 6, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 1, max = 1}, + {name = "mobs:leather", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 1, + fear_height = 4, + stay_near = {{"livingcaves:water_flowing", "livingcaves:water_source"}, 4}, + animation = { + speed_normal = 75, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + follow = { + "ethereal:fish_raw", "anjimalworld:rawfish", "mobs_fish:tropical", + "mobs:meat_raw", "animalworld:rabbit_raw", "xocean:fish_edible", "fishing:fish_raw", "water_life:meat_raw", "fishing:carp_raw", "animalworld:chicken_raw" + }, + view_range = 12, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_livingcavesmobs then +mobs:spawn({ + name = "livingcavesmobs:biter", + nodes = {"livingcaves:dripstonecave_bottom"}, + min_light = 0, + interval = 60, + chance = 80, + active_object_count = 3, + min_height = -200, + max_height = -90, +}) +end + +mobs:register_egg("livingcavesmobs:biter", S("Biter"), "abiter.png") diff --git a/mods/livingcavesmobs/chubby.lua b/mods/livingcavesmobs/chubby.lua new file mode 100644 index 0000000..d18015e --- /dev/null +++ b/mods/livingcavesmobs/chubby.lua @@ -0,0 +1,91 @@ +local S = minetest.get_translator("livingcavesmobs") + +mobs:register_mob("livingcavesmobs:chubby", { + stepheight = 3, + type = "animal", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = true, + reach = 2, + damage = 1, + hp_min = 5, + hp_max = 35, + armor = 100, + collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.3, 0.3}, + visual = "mesh", + mesh = "Chubby.b3d", + textures = { + {"texturechubby.png"}, + }, + makes_footstep_sound = true, + sounds = { + death = "livingcavesmobs_chubby", + attack = "livingcavesmobs_chubby2", + }, + walk_velocity = 1.5, + run_velocity = 2, + jump = true, + jump_height = 4, + pushable = true, + stay_near = {"livingcaves:bacteriacave_poolstone", 4}, + follow = {"fishing:bait:worm", "ethereal:worm", "animalworld:ant", "animalworld:termite", "animalworld:cockroach"}, + view_range = 10, + drops = { + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 4, + animation = { + speed_normal = 160, + stand_speed = 80, + stand_start = 0, + stand_end = 100, + stand1_start = 100, + stand1_end = 200, + walk_start = 200, + walk_end = 300, + punch_speed = 70, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", "livingcaves:water_source", "livingcaves:water_flowing",}, + floats = 0, + follow = { + "ethereal:worm", "seaweed", "fishing:bait_worm", "animalworld:ant", "animalworld:termite", "animalworld:fishfood" + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_livingcavesmobs then +mobs:spawn({ + name = "livingcavesmobs:chubby", + nodes = {"livingcaves:water_source", "livingcaves:water_flowing"}, + neighbors = {"livingcaves:bacteriacave_poolstone"}, + min_light = 0, + interval = 60, + chance = 80, + active_object_count = 1, + min_height = -400, + max_height = -200, +}) +end + +mobs:register_egg("livingcavesmobs:chubby", ("Chubby"), "achubby.png") + + +mobs:alias_mob("livingcavesmobs:chubby", "livingcavesmobs:chubby") -- compatibility + + diff --git a/mods/livingcavesmobs/depends.txt b/mods/livingcavesmobs/depends.txt new file mode 100644 index 0000000..896403a --- /dev/null +++ b/mods/livingcavesmobs/depends.txt @@ -0,0 +1,6 @@ +default +livingcaves +mobs +tnt +ethereal? +naturalbiomes? \ No newline at end of file diff --git a/mods/livingcavesmobs/description.txt b/mods/livingcavesmobs/description.txt new file mode 100644 index 0000000..85eb014 --- /dev/null +++ b/mods/livingcavesmobs/description.txt @@ -0,0 +1 @@ +adds mobs to the livingcaves mod \ No newline at end of file diff --git a/mods/livingcavesmobs/explodingbacteria.lua b/mods/livingcavesmobs/explodingbacteria.lua new file mode 100644 index 0000000..06af681 --- /dev/null +++ b/mods/livingcavesmobs/explodingbacteria.lua @@ -0,0 +1,125 @@ +local S = minetest.get_translator("livingcavesmobs") +local random = math.random + +mobs:register_mob("livingcavesmobs:explodingbacteria", { +stepheight = 0, + type = "animal", + passive = false, + attack_type = "explode", + explosion_radius = 2, + explosion_damage__radius = 6, + explosion_timer = 2, + attack_npcs = false, + attack_animals = false, + reach = 3, + damage = 18, + hp_min = 15, + hp_max = 30, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + visual = "mesh", + visual_size = {x = 2.6, y = 2.6}, + mesh = "Explodingbacteria.b3d", + drawtype = "front", + textures = { + {"textureexplodingbacteria.png"}, + + }, +sounds = { + random = "",}, + makes_footstep_sound = false, + walk_velocity = 1.5, + run_velocity = 2, + runaway = false, + jump = false, + jump_height = 6, + stay_near = {{"livingcaves:bacteriacave_nest"}, 5}, + sounds = { + attack = "livingcavesmobs_explodingbacteria", + random = "livingcavesmobs_explodingbacteria3", + damage = "livingcavesmobs_explodingbacteria2", + distance = 10, + }, + drops = { + {name = "tnt:gunpowder", chance = 1, min = 0, max = 1}, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 0, + animation = { + speed_normal = 50, + stand_start = 1, + stand_end = 100, + stand1_start = 100, + stand1_end = 200, + walk_start = 200, + walk_end = 300, + fly_start = 200, -- swim animation + fly_end = 300, + punch_start = 300, + punch_end = 400, + }, + fly_in = {"air"}, + floats = 1, + fly = true, + follow = {"default:stone", "default:coal", "livingcaves:hangingmoldend", "livingcaves:hangingmold"}, + view_range = 13, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_livingcavesmobs then +mobs:spawn({ + name = "livingcavesmobs:explodingbacteria", + nodes = {"livingcaves:bacteriacave_nest"}, + neighbors = {"livingcaves:bacteriacave_nestfoot"}, + min_light = 0, + interval = 10, + chance = 1, + active_object_count = 4, + min_height = -400, + max_height = -200, + + on_spawn = function(self, pos) + + local nods = minetest.find_nodes_in_area_under_air( + {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, + {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, + {"livingcaves:bacteriacave_nest"}) + + if nods and #nods > 0 then + + -- min herd of 4 + local iter = math.min(#nods, 4) + +-- print("--- explodingbacteria at", minetest.pos_to_string(pos), iter) + + for n = 1, iter do + + local pos2 = nods[random(#nods)] + local kid = random(4) == 1 and true or nil + + pos2.y = pos2.y + 2 + + if minetest.get_node(pos2).name == "air" then + + mobs:add_mob(pos2, { + name = "livingcavesmobs:explodingbacteria", child = kid}) + end + end + end + end + }) +end + + +mobs:register_egg("livingcavesmobs:explodingbacteria", S("Giant Bacteria"), "aexplodingbacteria.png", 0) + + +mobs:alias_mob("livingcavesmobs:explodingbacteria", "livingcavesmobs:explodingbacteria") -- compatibility \ No newline at end of file diff --git a/mods/livingcavesmobs/flesheatingbacteria.lua b/mods/livingcavesmobs/flesheatingbacteria.lua new file mode 100644 index 0000000..24c29ac --- /dev/null +++ b/mods/livingcavesmobs/flesheatingbacteria.lua @@ -0,0 +1,73 @@ +local S = minetest.get_translator("livingcavesmobs") + +mobs:register_mob("livingcavesmobs:flesheatingbacteria", { +stepheight = 0, + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 1, + damage = 6, + hp_min = 5, + hp_max = 10, + armor = 100, + collisionbox = {-0.1, -0.01, -0.1, 0.1, 0.1, 0.1}, + visual = "mesh", + visual_size = {x = 0.5, y = 0.5}, + mesh = "Flesheatingbacteria.b3d", + textures = { + {"textureflesheatingbacteria.png"}, + }, + sounds = { + attack = "livingcavesmobs_flesheatingbacteria", + }, + makes_footstep_sound = false, + walk_velocity = 0.3, + run_velocity = 0.5, + runaway = false, + jump = false, + jump_height = 0, + stepheight = 0, + stay_near = {"livingcaves:bacteriacave_trapstone", 3}, + drops = { + }, + water_damage = 1, + lava_damage = 1, + light_damage = 1, + fear_height = 0, + animation = { + speed_normal = 75, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + -- 50-70 is slide/water idle + }, + view_range = 3, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 25, 0, 0, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_livingcavesmobs then +mobs:spawn({ + name = "livingcavesmobs:flesheatingbacteria", + nodes = {"livingcaves:bacteriacave_trapnode"}, + min_light = 0, + interval = 10, + chance = 1, + active_object_count = 4, + min_height = -400, + max_height = -200, +}) +end + +mobs:register_egg("livingcavesmobs:flesheatingbacteria", S("Flesh Eating Bacteria"), "aflesheatingbacteria.png") diff --git a/mods/livingcavesmobs/grub.lua b/mods/livingcavesmobs/grub.lua new file mode 100644 index 0000000..daea565 --- /dev/null +++ b/mods/livingcavesmobs/grub.lua @@ -0,0 +1,244 @@ +local S = minetest.get_translator("livingcavesmobs") + +mobs.grub_drops = { + "farming:string" +} + +mobs:register_mob("livingcavesmobs:grub", { + stepheight = 1, + type = "npc", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + owner = "", + order = "follow", + reach = 2, + damage = 0, + hp_min = 10, + hp_max = 20, + armor = 100, + collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.3, 0.2}, + visual = "mesh", + mesh = "Grub.b3d", + textures = { + {"texturegrub.png"}, + }, + makes_footstep_sound = false, + sounds = { + }, + walk_velocity = 0.5, + run_velocity = 0.7, + runaway = true, + stay_near = {{"livingcaves:glowshroom_top", "default:bush_leaves", "default:blueberry_bush_leaves", "naturalbiomes:cowberrybush_leaves", "naturalbiomes:beach_bush_leaves", "naturalbiomes:outback_bush_leaves"}, 4}, + jump = false, + jump_height = 3, + pushable = true, + view_range = 3, + drops = { + {name = "livingcavesmobs:grub", chance = 3, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 70, + stand_start = 0, + stand_end = 100, + stand_start = 100, + stand_end = 200, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 25, 0, 0, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.grub_drops + if item:get_name() == "default:bush_leaves" or item:get_name() == "default:blueberry_bush_leaves" or item:get_name() == "naturalbiomes:beach_bush_leaves" or item:get_name() == "naturalbiomes:outback_bush_leaves" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.grub_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Grub dropped you a string for bush leaves!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Grub stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Grub will follow you.")) + end + end + end, +}) + + + +mobs:register_egg("livingcavesmobs:grub", S("Grub"), "agrub.png") + + +mobs:alias_mob("livingcavesmobs:grub", "livingcavesmobs:grub") -- compatibility + +minetest.register_craftitem(":livingcavesmobs:cocoon", { + description = S("Moth Cocoon"), + inventory_image = "livingcavesmobs_cocoon.png", + drawtype = "plantlike", + tiles = {"livingcavesmobs_cocoon.png"}, + inventory_image = "livingcavesmobs_cocoon.png", + wield_image = "livingcavesmobs_cocoon.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + groups = {food = 1, flammable = 2, fleshy = 3, dig_immediate = 3}, + drop = "livingcavesmobs:cocoon", + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "livingcavesmobs:cocoon", param2 = 1}) + end + end +}) + +minetest.register_craftitem(":livingcavesmobs:mothegg", { + description = S("Moth Egg"), + inventory_image = "livingcavesmobs_mothegg.png", + drawtype = "plantlike", + tiles = {"livingcavesmobs_mothegg.png"}, + inventory_image = "livingcavesmobs_mothegg.png", + wield_image = "livingcavesmobs_mothegg.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + on_use = minetest.item_eat(2), + groups = {food = 1, flammable = 2, fleshy = 3, dig_immediate = 3}, + drop = "livingcavesmobs:mothegg", + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "livingcavesmobs:mothegg", param2 = 1}) + end + end +}) + + +minetest.register_craft({ + output = "livingcavesmobs:cocoon", + type = "shapeless", + recipe = + {"livingcavesmobs:grub", "default:bush_leaves", "default:bush_leaves", "default:bush_leaves"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:cocoon", + type = "shapeless", + recipe = + {"livingcavesmobs:grub", "default:blueberry_bush_leaves", "default:blueberry_bush_leaves", "default:blueberry_bush_leaves"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:cocoon", + type = "shapeless", + recipe = + {"livingcavesmobs:grub", "naturalbiomes:beach_bush_leaves", "naturalbiomes:beach_bush_leaves", "naturalbiomes:beach_bush_leaves"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:cocoon", + type = "shapeless", + recipe = + {"livingcavesmobs:grub", "naturalbiomes:outback_bush_leaves", "naturalbiomes:outback_bush_leaves", "naturalbiomes:outback_bush_leaves"} +}) + +minetest.register_craft({ + output = "wool:white", + type = "shapeless", + recipe = + {"livingcavesmobs:cocoon", "livingcavesmobs:cocoon", "livingcavesmobs:cocoon", "livingcavesmobs:cocoon"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:moth", + type = "shapeless", + recipe = + {"livingcavesmobs:cocoon", "default:stick"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:grub", + type = "shapeless", + recipe = + {"livingcavesmobs:mothegg", "naturalbiomes:outback_bush_leaves", "naturalbiomes:outback_bush_leaves", "naturalbiomes:outback_bush_leaves"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:grub", + type = "shapeless", + recipe = + {"livingcavesmobs:mothegg", "naturalbiomes:beach_bush_leaves", "naturalbiomes:beach_bush_leaves", "naturalbiomes:beach_bush_leaves"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:grub", + type = "shapeless", + recipe = + {"livingcavesmobs:mothegg", "default:blueberry_bush_leaves", "default:blueberry_bush_leaves", "default:blueberry_bush_leaves"} +}) + +minetest.register_craft({ + output = "livingcavesmobs:grub", + type = "shapeless", + recipe = + {"livingcavesmobs:mothegg", "default:bush_leaves", "default:bush_leaves", "default:bush_leaves"} +}) diff --git a/mods/livingcavesmobs/hunger.lua b/mods/livingcavesmobs/hunger.lua new file mode 100644 index 0000000..6547898 --- /dev/null +++ b/mods/livingcavesmobs/hunger.lua @@ -0,0 +1,5 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('livingcavesmobs:cocoon', { + satiates = 1.0, + }) +end \ No newline at end of file diff --git a/mods/livingcavesmobs/init.lua b/mods/livingcavesmobs/init.lua new file mode 100644 index 0000000..b7c036f --- /dev/null +++ b/mods/livingcavesmobs/init.lua @@ -0,0 +1,47 @@ +--This creates the livingcavesmobs object. +livingcavesmobs = {} + +--This creates the livingcavesmobs.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +livingcavesmobs.settings = { + clear_biomes = minetest.settings:get_bool("livingcavesmobs.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("livingcavesmobs.clear_decos") or false, + clear_ores = minetest.settings:get_bool("livingcavesmobs.clear_ores") or false, +} + +if livingcavesmobs.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if livingcavesmobs.settings.clear_decos then + minetest.clear_registered_decorations() +end +if livingcavesmobs.settings.clear_ores then + minetest.clear_registered_ores() +end + +local modname = "livingcavesmobs" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("livingcavesmobs") or + dofile(path .. "intllib.lua") + + + +-- plants +dofile(path .. "biter.lua") -- +dofile(path .. "chubby.lua") -- +dofile(path .. "explodingbacteria.lua") -- +dofile(path .. "flesheatingbacteria.lua") -- +dofile(path .. "moth.lua") -- +dofile(path .. "grub.lua") -- +dofile(path .. "yeti.lua") -- +dofile(path .. "hunger.lua") -- + + + + + +print (S("[MOD] Caves loaded")) diff --git a/mods/livingcavesmobs/intllib.lua b/mods/livingcavesmobs/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/livingcavesmobs/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/livingcavesmobs/locale/livingcavesmobs.de.tr b/mods/livingcavesmobs/locale/livingcavesmobs.de.tr new file mode 100644 index 0000000..2926f25 --- /dev/null +++ b/mods/livingcavesmobs/locale/livingcavesmobs.de.tr @@ -0,0 +1,22 @@ +# textdomain: livingcavesmobs + +### biter.lua ### +Biter=Beißer + +### explodingbacteria.lua ### +Giant Bacteria=Riesenbakterie + +### flesheatingbacteria.lua ### +Flesh Eating Bacteria=Fleischfressende Bakterie + +### grub.lua ### +Grub dropped you a string for bush leaves!=Die Larve hat einen Faden für Buschblätter produziert! +Grub stands still=Larve wartet +Grub will follow you=Die Larve folgt dir +Grub=Larve +Moth Cocoon=Mottenkokon +Moth Egg=Mottenei + +### moth.lua ### +Moth=Motte + diff --git a/mods/livingcavesmobs/mod.conf b/mods/livingcavesmobs/mod.conf new file mode 100644 index 0000000..6626408 --- /dev/null +++ b/mods/livingcavesmobs/mod.conf @@ -0,0 +1,2 @@ +name = livingcavesmobs + diff --git a/mods/livingcavesmobs/models/Biter.b3d b/mods/livingcavesmobs/models/Biter.b3d new file mode 100644 index 0000000..e30b7ab Binary files /dev/null and b/mods/livingcavesmobs/models/Biter.b3d differ diff --git a/mods/livingcavesmobs/models/Chubby.b3d b/mods/livingcavesmobs/models/Chubby.b3d new file mode 100644 index 0000000..66f58d8 Binary files /dev/null and b/mods/livingcavesmobs/models/Chubby.b3d differ diff --git a/mods/livingcavesmobs/models/Explodingbacteria.b3d b/mods/livingcavesmobs/models/Explodingbacteria.b3d new file mode 100644 index 0000000..f6b945c Binary files /dev/null and b/mods/livingcavesmobs/models/Explodingbacteria.b3d differ diff --git a/mods/livingcavesmobs/models/Flesheatingbacteria.b3d b/mods/livingcavesmobs/models/Flesheatingbacteria.b3d new file mode 100644 index 0000000..19f5463 Binary files /dev/null and b/mods/livingcavesmobs/models/Flesheatingbacteria.b3d differ diff --git a/mods/livingcavesmobs/models/Grub.b3d b/mods/livingcavesmobs/models/Grub.b3d new file mode 100644 index 0000000..29b0696 Binary files /dev/null and b/mods/livingcavesmobs/models/Grub.b3d differ diff --git a/mods/livingcavesmobs/models/Moth.b3d b/mods/livingcavesmobs/models/Moth.b3d new file mode 100644 index 0000000..7c12469 Binary files /dev/null and b/mods/livingcavesmobs/models/Moth.b3d differ diff --git a/mods/livingcavesmobs/models/Yeti.b3d b/mods/livingcavesmobs/models/Yeti.b3d new file mode 100644 index 0000000..0860b14 Binary files /dev/null and b/mods/livingcavesmobs/models/Yeti.b3d differ diff --git a/mods/livingcavesmobs/moth.lua b/mods/livingcavesmobs/moth.lua new file mode 100644 index 0000000..aafd633 --- /dev/null +++ b/mods/livingcavesmobs/moth.lua @@ -0,0 +1,136 @@ +local S = minetest.get_translator("livingcavesmobs") + +mobs.moth_drops = { + "livingcavesmobs:mothegg" +} + +mobs:register_mob("livingcavesmobs:moth", { +stepheight = 3, + type = "npc", + passive = true, + attack_type = "dogfight", + attack_animals = false, + owner_loyal = true, + reach = 2, + damage = 0, + hp_min = 5, + hp_max = 15, + armor = 100, + collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.3, 0.3}, + visual = "mesh", + visual_size = {x = 2.0, y = 2.0}, + mesh = "Moth.b3d", + textures = { + {"texturemoth.png"}, + }, + sounds = { + }, + makes_footstep_sound = false, + walk_velocity = 2, + run_velocity = 3, + walk_chance = 15, + fall_speed = 0, + jump = false, + jump_height = 6, + stepheight = 3, + fly = true, + owner = "", + order = "follow", + drops = { + }, + water_damage = 4, + lava_damage = 4, + light_damage = 0, + fear_height = 0, + stay_near = {{"livingcaves:glowshroom_top"}, 3}, + animation = { + speed_normal = 200, + stand_speed = 50, + stand_start = 120, + stand_end = 170, + fly_start = 0, + fly_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + +fly_in = {"air"}, + floats = 0, +view_range = 5, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.moth_drops + if item:get_name() == "farming:melon_slice" or item:get_name() == "farming:pineapple" or item:get_name() == "ethereal:banana" or item:get_name() == "naturalbiomes:banana" or item:get_name() == "livingdesert:date_palm_fruits" or item:get_name() == "livingdesert:figcactus_fruit" or item:get_name() == "default:apple" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.moth_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, ("Moth dropped you an egg for fruit!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, ("Moth stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, ("Moth will follow you.")) + end + end + end, +}) + + +if not mobs.custom_spawn_livingcavesmobs then +mobs:spawn({ + name = "livingcavesmobs:moth", + nodes = {"livingcaves:mushcave_bottom"}, + min_light = 0, + interval = 60, + chance = 800, -- 15000 + active_object_count = 4, + min_height = -90, + max_height = -30, +}) +end + +mobs:register_egg("livingcavesmobs:moth", S("Moth"), "amoth.png") \ No newline at end of file diff --git a/mods/livingcavesmobs/screenshot.png b/mods/livingcavesmobs/screenshot.png new file mode 100644 index 0000000..8c85a77 Binary files /dev/null and b/mods/livingcavesmobs/screenshot.png differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_biter.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_biter.ogg new file mode 100644 index 0000000..e49122b Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_biter.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_biter2.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_biter2.ogg new file mode 100644 index 0000000..d9adfe6 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_biter2.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_biter3.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_biter3.ogg new file mode 100644 index 0000000..8022c93 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_biter3.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_chubby.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_chubby.ogg new file mode 100644 index 0000000..0d3829a Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_chubby.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_chubby2.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_chubby2.ogg new file mode 100644 index 0000000..72e1c0b Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_chubby2.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria.ogg new file mode 100644 index 0000000..ad7bde6 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria2.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria2.ogg new file mode 100644 index 0000000..fa70f79 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria2.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria3.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria3.ogg new file mode 100644 index 0000000..5b68ef8 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_explodingbacteria3.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_flesheatingbacteria.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_flesheatingbacteria.ogg new file mode 100644 index 0000000..a639b3a Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_flesheatingbacteria.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_yeti.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_yeti.ogg new file mode 100644 index 0000000..3edac53 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_yeti.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_yeti2.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_yeti2.ogg new file mode 100644 index 0000000..728474b Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_yeti2.ogg differ diff --git a/mods/livingcavesmobs/sounds/livingcavesmobs_yeti3.ogg b/mods/livingcavesmobs/sounds/livingcavesmobs_yeti3.ogg new file mode 100644 index 0000000..773de09 Binary files /dev/null and b/mods/livingcavesmobs/sounds/livingcavesmobs_yeti3.ogg differ diff --git a/mods/livingcavesmobs/textures/abiter.png b/mods/livingcavesmobs/textures/abiter.png new file mode 100644 index 0000000..609928b Binary files /dev/null and b/mods/livingcavesmobs/textures/abiter.png differ diff --git a/mods/livingcavesmobs/textures/achubby.png b/mods/livingcavesmobs/textures/achubby.png new file mode 100644 index 0000000..087d7e9 Binary files /dev/null and b/mods/livingcavesmobs/textures/achubby.png differ diff --git a/mods/livingcavesmobs/textures/aexplodingbacteria.png b/mods/livingcavesmobs/textures/aexplodingbacteria.png new file mode 100644 index 0000000..75c8ec6 Binary files /dev/null and b/mods/livingcavesmobs/textures/aexplodingbacteria.png differ diff --git a/mods/livingcavesmobs/textures/aflesheatingbacteria.png b/mods/livingcavesmobs/textures/aflesheatingbacteria.png new file mode 100644 index 0000000..16ac916 Binary files /dev/null and b/mods/livingcavesmobs/textures/aflesheatingbacteria.png differ diff --git a/mods/livingcavesmobs/textures/agrub.png b/mods/livingcavesmobs/textures/agrub.png new file mode 100644 index 0000000..e78e9ce Binary files /dev/null and b/mods/livingcavesmobs/textures/agrub.png differ diff --git a/mods/livingcavesmobs/textures/amoth.png b/mods/livingcavesmobs/textures/amoth.png new file mode 100644 index 0000000..1b9fdba Binary files /dev/null and b/mods/livingcavesmobs/textures/amoth.png differ diff --git a/mods/livingcavesmobs/textures/ayeti.png b/mods/livingcavesmobs/textures/ayeti.png new file mode 100644 index 0000000..87d407b Binary files /dev/null and b/mods/livingcavesmobs/textures/ayeti.png differ diff --git a/mods/livingcavesmobs/textures/livingcavesmobs_cocoon.png b/mods/livingcavesmobs/textures/livingcavesmobs_cocoon.png new file mode 100644 index 0000000..b4a4e69 Binary files /dev/null and b/mods/livingcavesmobs/textures/livingcavesmobs_cocoon.png differ diff --git a/mods/livingcavesmobs/textures/livingcavesmobs_iceball.png b/mods/livingcavesmobs/textures/livingcavesmobs_iceball.png new file mode 100644 index 0000000..b54c3b9 Binary files /dev/null and b/mods/livingcavesmobs/textures/livingcavesmobs_iceball.png differ diff --git a/mods/livingcavesmobs/textures/livingcavesmobs_mothegg.png b/mods/livingcavesmobs/textures/livingcavesmobs_mothegg.png new file mode 100644 index 0000000..f9e03fe Binary files /dev/null and b/mods/livingcavesmobs/textures/livingcavesmobs_mothegg.png differ diff --git a/mods/livingcavesmobs/textures/texturebiter.png b/mods/livingcavesmobs/textures/texturebiter.png new file mode 100644 index 0000000..a36ec9d Binary files /dev/null and b/mods/livingcavesmobs/textures/texturebiter.png differ diff --git a/mods/livingcavesmobs/textures/texturebiter2.png b/mods/livingcavesmobs/textures/texturebiter2.png new file mode 100644 index 0000000..fb0057b Binary files /dev/null and b/mods/livingcavesmobs/textures/texturebiter2.png differ diff --git a/mods/livingcavesmobs/textures/texturebiter3.png b/mods/livingcavesmobs/textures/texturebiter3.png new file mode 100644 index 0000000..bbe2046 Binary files /dev/null and b/mods/livingcavesmobs/textures/texturebiter3.png differ diff --git a/mods/livingcavesmobs/textures/texturechubby.png b/mods/livingcavesmobs/textures/texturechubby.png new file mode 100644 index 0000000..0dd70f2 Binary files /dev/null and b/mods/livingcavesmobs/textures/texturechubby.png differ diff --git a/mods/livingcavesmobs/textures/textureexplodingbacteria.png b/mods/livingcavesmobs/textures/textureexplodingbacteria.png new file mode 100644 index 0000000..6b53e03 Binary files /dev/null and b/mods/livingcavesmobs/textures/textureexplodingbacteria.png differ diff --git a/mods/livingcavesmobs/textures/textureflesheatingbacteria.png b/mods/livingcavesmobs/textures/textureflesheatingbacteria.png new file mode 100644 index 0000000..eeb1767 Binary files /dev/null and b/mods/livingcavesmobs/textures/textureflesheatingbacteria.png differ diff --git a/mods/livingcavesmobs/textures/texturegrub.png b/mods/livingcavesmobs/textures/texturegrub.png new file mode 100644 index 0000000..aa739b8 Binary files /dev/null and b/mods/livingcavesmobs/textures/texturegrub.png differ diff --git a/mods/livingcavesmobs/textures/texturemoth.png b/mods/livingcavesmobs/textures/texturemoth.png new file mode 100644 index 0000000..b89ffc6 Binary files /dev/null and b/mods/livingcavesmobs/textures/texturemoth.png differ diff --git a/mods/livingcavesmobs/textures/textureyeti.png b/mods/livingcavesmobs/textures/textureyeti.png new file mode 100644 index 0000000..c3c1fef Binary files /dev/null and b/mods/livingcavesmobs/textures/textureyeti.png differ diff --git a/mods/livingcavesmobs/textures/textureyeti2.png b/mods/livingcavesmobs/textures/textureyeti2.png new file mode 100644 index 0000000..04d8b06 Binary files /dev/null and b/mods/livingcavesmobs/textures/textureyeti2.png differ diff --git a/mods/livingcavesmobs/textures/textureyetibaby.png b/mods/livingcavesmobs/textures/textureyetibaby.png new file mode 100644 index 0000000..d7642de Binary files /dev/null and b/mods/livingcavesmobs/textures/textureyetibaby.png differ diff --git a/mods/livingcavesmobs/yeti.lua b/mods/livingcavesmobs/yeti.lua new file mode 100644 index 0000000..0628140 --- /dev/null +++ b/mods/livingcavesmobs/yeti.lua @@ -0,0 +1,130 @@ +local S = minetest.get_translator("livingcavesmobs") + +mobs:register_mob("livingcavesmobs:yeti", { + stepheight = 3, + type = "animal", + passive = false, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 3, -- shoot for 10 seconds + dogshoot_count2_max = 5, -- dogfight for 3 seconds + shoot_interval = 1, + arrow = "livingcavesmobs:iceball", + shoot_offset = 0.8, + group_attack = true, + owner_loyal = true, + attack_npcs = false, + attack_monsters = true, + reach = 2, + damage = 6, + hp_min = 65, + hp_max = 95, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.5, 0.4}, + visual = "mesh", + mesh = "Yeti.b3d", + visual_size = {x = 3.0, y = 3.0}, + textures = { + {"textureyeti.png"}, + {"textureyeti2.png"}, + }, + child_texture = { + {"textureyetibaby.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "livingcavesmobs_yeti2", + attack = "livingcavesmobs_yeti3", + damage = "livingcavesmobs_yeti", + + }, + walk_velocity = 2, + run_velocity = 3, + knock_back = false, + jump = true, + jump_height = 2, + pushable = true, + follow = {"default:apple", "farming:potato", "ethereal:banana_bread", "farming:carrot", "farming:seed_rice", "farming:corn", "farming:wheat", "farming:beans", "farming:barley", "farming:oat", "farming:rye", "mobs:cheese", "farming:bread", "ethereal:banana_bread", "ethereal:banana", "farming:cabbage", "farming:lettuce", "farming:melon_slice", "livingcavesmobs:termitequeen", "livingcavesmobs:locust_roasted", "livingdesert:date_palm_fruits", "livingdesert:figcactus_fruit"}, + view_range = 10, + replace_rate = 10, + replace_what = {"livingcaves:icestalagmite", "livingcaves:icestalagmiteend", "livingcaves:icestalagtite", "livingcaves:icestalagtiteend", "livingcaves:icestalagmitelarge", "livingcaves:icestalagmitelargeend", "livingcaves:icestalagtitelarge", "livingcaves:icestalagtitelargeend"}, + replace_with = "air", + drops = { + {name = "wool:white", chance = 1, min = 1, max = 3}, + {name = "wool:grey", chance = 1, min = 1, max = 3}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + fear_height = 4, + animation = { + speed_normal = 100, + stand_speed = 75, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + stand3_start = 200, + stand3_end = 300, + walk_start = 300, + walk_end = 400, + punch_start = 400, + punch_end = 500, + shoot_start = 400, + shoot_end = 500, + die_start = 400, + die_end = 500, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_livingcavesmobs then +mobs:spawn({ + name = "livingcavesmobs:yeti", + nodes = {"livingcaves:icecave_ice"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 1, + min_height = -30, + max_height = -5, +}) +end + +mobs:register_egg("livingcavesmobs:yeti", ("Yeti"), "ayeti.png") + +mobs:register_arrow("livingcavesmobs:iceball", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"livingcavesmobs_iceball.png"}, + velocity = 12, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) + + diff --git a/mods/livingdesert/LICENSE b/mods/livingdesert/LICENSE new file mode 100644 index 0000000..2477cb5 --- /dev/null +++ b/mods/livingdesert/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Liil (c) 2022 +Textures and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/livingdesert/colddesert.lua b/mods/livingdesert/colddesert.lua new file mode 100644 index 0000000..51ce6de --- /dev/null +++ b/mods/livingdesert/colddesert.lua @@ -0,0 +1,1289 @@ +local S = minetest.get_translator("livingdesert") + +local modname = "livingdesert" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + place_offset_y = -2, + flags = "force_placement", + fill_ratio = 1.0, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 300, + y_min = 0, + decoration = "default:sand" + }) + +-- ground nodes + +minetest.register_node("livingdesert:coldsteppe_ground", { + description = S("Cold Desert Ground"), + tiles = {"livingdesert_coldsteppe_ground.png", "default_sand.png", + {name = "default_sand.png^livingdesert_coldsteppe_ground_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("livingdesert:coldsteppe_ground2", { + description = S("Cold Desert Ground"), + tiles = {"livingdesert_coldsteppe_ground2.png", "default_sand.png", + {name = "default_sand.png^livingdesert_coldsteppe_ground2_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("livingdesert:coldsteppe_ground3", { + description = S("Cold Desert Ground"), + tiles = {"livingdesert_coldsteppe_ground3.png", "default_sand.png", + {name = "default_sand.png^livingdesert_coldsteppe_ground3_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("livingdesert:coldsteppe_ground4", { + description = S("Cold Desert Ground"), + tiles = {"livingdesert_coldsteppe_ground4.png", "default_sand.png", + {name = "default_sand.png^livingdesert_coldsteppe_ground4_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 5, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 15, + y_min = 2, + decoration = "livingdesert:coldsteppe_ground" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 5, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 70, + y_min = 10, + decoration = "livingdesert:coldsteppe_ground2" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 5, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 100, + y_min = 35, + decoration = "livingdesert:coldsteppe_ground3" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:silver_sand"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 5, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 300, + y_min = 48, + decoration = "livingdesert:coldsteppe_ground4" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2", "default_silver_sand"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.5, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 7, + y_min = 0, + decoration = "default:sand" + }) + + + +--- grass + + minetest.register_decoration({ + name = "livingdesert:coldsteppe_grass1", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2"}, + sidelen = 16, + fill_ratio = 0.145, + y_max = 25, + y_min = 7, + decoration = "livingdesert:coldsteppe_grass1", + }) + +minetest.register_node("livingdesert:coldsteppe_grass1", { + description = S"Coldsteppe Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_coldsteppe_grass1.png"}, + inventory_image = "livingdesert_coldsteppe_grass1.png", + wield_image = "livingdesert_coldsteppe_grass1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:coldsteppe_grass2", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground"}, + sidelen = 16, + fill_ratio = 0.145, + y_max = 80, + y_min = 20, + decoration = "livingdesert:coldsteppe_grass2", + }) + +minetest.register_node("livingdesert:coldsteppe_grass2", { + description = S"Coldsteppe Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_coldsteppe_grass2.png"}, + inventory_image = "livingdesert_coldsteppe_grass2.png", + wield_image = "livingdesert_coldsteppe_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:coldsteppe_grass3", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground3", "livingdesert:coldsteppe_ground4"}, + sidelen = 16, + fill_ratio = 0.145, + y_max = 80, + y_min = 30, + decoration = "livingdesert:coldsteppe_grass3", + }) + +minetest.register_node("livingdesert:coldsteppe_grass3", { + description = S"Coldsteppe Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_coldsteppe_grass3.png"}, + inventory_image = "livingdesert_coldsteppe_grass3.png", + wield_image = "livingdesert_coldsteppe_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:coldsteppe_grass4", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground4", "livingdesert:coldsteppe_ground3"}, + sidelen = 16, + fill_ratio = 0.145, + y_max = 250, + y_min = 65, + decoration = "livingdesert:coldsteppe_grass4", + }) + +minetest.register_node("livingdesert:coldsteppe_grass4", { + description = S"Coldsteppe Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_coldsteppe_grass4.png"}, + inventory_image = "livingdesert_coldsteppe_grass4.png", + wield_image = "livingdesert_coldsteppe_grass4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:coldsteppe_grass6", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2"}, + sidelen = 16, + fill_ratio = 0.145, + y_max = 7, + y_min = 1, + decoration = "livingdesert:coldsteppe_grass6", + }) + +minetest.register_node("livingdesert:coldsteppe_grass6", { + description = S"Coldsteppe Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_coldsteppe_grass6.png"}, + inventory_image = "livingdesert_coldsteppe_grass6.png", + wield_image = "livingdesert_coldsteppe_grass6.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:saxaul_shrub", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 300, + y_min = 15, + decoration = "livingdesert:saxaul_shrub", + param2 = 4, + }) + +minetest.register_node("livingdesert:saxaul_shrub", { + description = S"Coldsteppe Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingdesert_saxaul_shrub.png"}, + inventory_image = "livingdesert_saxaul_shrub.png", + wield_image = "livingdesert_saxaul_shrub.png", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + }, +}) + + minetest.register_decoration({ + name = "livingdesert:saxaul_shrub2", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground4", "livingdesert:coldsteppe_ground3"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 300, + y_min = 45, + decoration = "livingdesert:saxaul_shrub2", + param2 = 4, + }) + +minetest.register_node("livingdesert:saxaul_shrub2", { + description = S"Coldsteppe Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingdesert_saxaul_shrub2.png"}, + inventory_image = "livingdesert_saxaul_shrub2.png", + wield_image = "livingdesert_saxaul_shrub2.png", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + }, +}) + + +--- trees + +-- New Cold Desert Larch tree + +local function grow_new_pine_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/livingdesert_pine.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:pine_sapling", grow_new_pine_tree, "soil"}, +}) +end + + +local function grow_new_pine2_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/livingdesert_pine2.mts", "0", nil, false) + +end + + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:pine_sapling2", grow_new_pine2_tree, "soil"}, +}) +end + + +local function grow_new_pine3_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/livingdesert_pine3.mts", "0", nil, false) + +end + + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:pine_sapling3", grow_new_pine3_tree, "soil"}, +}) +end + +-- datepalm trunk +minetest.register_node("livingdesert:pine_trunk", { + description = S("Cold Desert Larch Trunk"), + tiles = { + "livingdesert_pine_trunk_top.png", + "livingdesert_pine_trunk_top.png", + "livingdesert_pine_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:pine_leaves", { + description = S("Cold Desert Larch Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_pine_leaves.png"}, + special_tiles = {"livingdesert_pine_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingdesert:pine_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:pine_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:pine_leaves2", { + description = S("Cold Desert Larch Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_pine_leaves2.png"}, + special_tiles = {"livingdesert_pine_leaves2.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingdesert:pine_sapling2'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:pine_leaves2'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:pine_leaves3", { + description = S("Cold Desert Larch Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_pine_leaves3.png"}, + special_tiles = {"livingdesert_pine_leaves3.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingdesert:pine_sapling3'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:pine_leaves3'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:pine_sapling", { + description = S("Cold Desert Larch Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_pine_sapling.png"}, + inventory_image = "livingdesert_pine_sapling.png", + wield_image = "livingdesert_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_pine_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:pine_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("livingdesert:pine_sapling2", { + description = S("Cold Desert Larch Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_pine_sapling2.png"}, + inventory_image = "livingdesert_pine_sapling2.png", + wield_image = "livingdesert_pine_sapling2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_pine2_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:pine_sapling2", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("livingdesert:pine_sapling3", { + description = S("Cold Desert Larch Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_pine_sapling3.png"}, + inventory_image = "livingdesert_pine_sapling3.png", + wield_image = "livingdesert_pine_sapling3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_pine3_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:pine_sapling3", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +-- pine wood +minetest.register_node("livingdesert:pine_wood", { + description = S("Cold Desert Larch Wood"), + tiles = {"livingdesert_pine_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingdesert:pine_wood 4", + recipe = {{"livingdesert:pine_trunk"}} +}) + + stairs.register_stair_and_slab( + "livingdesert_pine_wood", + "livingdesert:pine_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingdesert_pine_wood.png"}, + S("Cold Desert Larch Stair"), + S("Cold Desert Larch Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "livingdesert_pine_trunk", + "livingdesert:pine_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingdesert_pine_trunk_top.png", "livingdesert_pine_trunk_top.png", "livingdesert_pine_trunk.png"}, + S("Cold Desert Larch Trunk Stair"), + S("Cold Desert Larch Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "livingdesert:gate_pine_wood", + { + description = S("Cold Desert Larch Wood Fence Gate"), + texture = "livingdesert_pine_wood.png", + material = "livingdesert:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "livingdesert:fence_pine_wood", + { + description = S("Cold Desert Larch Fence"), + texture = "livingdesert_pine_fence_wood.png", + inventory_image = "default_fence_overlay.png^livingdesert_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingdesert_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingdesert:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "livingdesert:fence_rail_pine_wood", + { + description = S("Cold Desert Larch Fence Rail"), + texture = "livingdesert_pine_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^livingdesert_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingdesert_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingdesert:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + + +minetest.register_decoration({ + name = "livingdesert:pine_tree", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.012, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 75, + y_min = 25, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree11", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.012, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 75, + y_min = 25, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine11.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree111", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.012, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 75, + y_min = 25, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine111.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree2", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.012, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 100, + y_min = 50, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree22", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.012, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 100, + y_min = 50, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine22.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree222", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.012, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 100, + y_min = 50, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine222.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree3", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground4", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.032, + spread = {x = 100, y = 100, z = 100}, + seed = 099, + octaves = 3, + persist = 0.6 + }, + y_max = 200, + y_min = 45, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree33", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground4", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.032, + spread = {x = 100, y = 100, z = 100}, + seed = 099, + octaves = 3, + persist = 0.6 + }, + y_max = 200, + y_min = 45, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine33.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:pine_tree333", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground4", "livingdesert:coldsteppe_ground3"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00715, + y_max = 200, + y_min = 45, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_pine333.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- New saxaul tree + +local function grow_new_saxaul_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/livingdesert_saxaul.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:saxaul_sapling", grow_new_saxaul_tree, "soil"}, +}) +end + +-- saxaul trunk +minetest.register_node("livingdesert:saxaul_trunk", { + description = S("Saxaul Tree Trunk"), + tiles = { + "livingdesert_saxaul_trunk.png", + "livingdesert_saxaul_trunk.png", + "livingdesert_saxaul_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:saxaul_leaves", { + description = S("Saxaul Tree Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_saxaul_leaves.png"}, + special_tiles = {"livingdesert_saxaul_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingdesert:saxaul_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:saxaul_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:saxaul_sapling", { + description = S("Saxaul Tree Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_saxaul_sapling.png"}, + inventory_image = "livingdesert_saxaul_sapling.png", + wield_image = "livingdesert_saxaul_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_saxaul_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:saxaul_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +-- saxaul wood +minetest.register_node("livingdesert:saxaul_wood", { + description = S("Saxaul Tree Wood"), + tiles = {"livingdesert_saxaul_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingdesert:saxaul_wood 4", + recipe = {{"livingdesert:saxaul_trunk"}} +}) + + stairs.register_stair_and_slab( + "livingdesert_saxaul_wood", + "livingdesert:saxaul_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingdesert_saxaul_wood.png"}, + S("Saxaul Tree Stair"), + S("Saxaul Tree Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "livingdesert_saxaul_trunk", + "livingdesert:saxaul_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingdesert_saxaul_trunk.png", "livingdesert_saxaul_trunk.png", "livingdesert_saxaul_trunk.png"}, + S("Saxaul Tree Trunk Stair"), + S("Saxaul Tree Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "livingdesert:gate_saxaul_wood", + { + description = S("Saxaul Tree Wood Fence Gate"), + texture = "livingdesert_saxaul_wood.png", + material = "livingdesert:saxaul_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "livingdesert:fence_saxaul_wood", + { + description = S("Saxaul Tree Fence"), + texture = "livingdesert_saxaul_fence_wood.png", + inventory_image = "default_fence_overlay.png^livingdesert_saxaul_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingdesert_saxaul_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingdesert:saxaul_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "livingdesert:fence_rail_saxaul_wood", + { + description = S("Saxaul Tree Fence Rail"), + texture = "livingdesert_saxaul_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^livingdesert_saxaul_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingdesert_saxaul_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingdesert:saxaul_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + + +minetest.register_decoration({ + name = "livingdesert:saxaul_tree", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground3"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00315, + y_max = 45, + y_min = 3, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_saxaul.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:saxaul_tree2", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground3"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00315, + y_max = 45, + y_min = 3, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_saxaul2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:saxaul_tree3", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground3"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00315, + y_max = 45, + y_min = 3, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_saxaul3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +--- rocks + + minetest.register_decoration({ + name = "livingfloatlands:livingdesert_rockformation", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3", "livingdesert:coldsteppe_ground4"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00007, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingdesert") .. "/schematics/livingdesert_rockformation.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "livingfloatlands:livingdesert_rockformation2", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3", "livingdesert:coldsteppe_ground4"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00007, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingdesert") .. "/schematics/livingdesert_rockformation2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + minetest.register_decoration({ + name = "livingfloatlands:livingdesert_rockformation3", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3", "livingdesert:coldsteppe_ground4"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00007, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingdesert") .. "/schematics/livingdesert_rockformation3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "livingfloatlands:livingdesert_rockformation4", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground2"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00001, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingdesert") .. "/schematics/livingdesert_rockformation4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "livingfloatlands:livingdesert_rockformation5", + deco_type = "schematic", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3", "livingdesert:coldsteppe_ground4"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00007, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingdesert") .. "/schematics/livingdesert_rockformation5.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +--- additional replacers + + minetest.register_decoration({ + name = "livingdesert:deadshrub", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground", "livingdesert:coldsteppe_ground4"}, + sidelen = 16, + flags = "force_placement", + noise_params = { + offset = -0.1, + scale = 0.08, + spread = {x = 100, y = 100, z = 100}, + seed = 0934, + octaves = 6, + persist = 1, + }, + biomes = {"cold_desert_ocean", "cold_desert"}, + y_max = 300, + y_min = 0, + decoration = "livingdesert:deadshrub", + param2 = 4, + }) + +minetest.register_node("livingdesert:deadshrub", { + description = S"Dead Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingdesert_deadshrub.png"}, + inventory_image = "livingdesert_deadshrub.png", + wield_image = "livingdesert_deadshrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + +}) + +minetest.register_node("livingdesert:flower", { + description = S"Crocus Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_flower.png"}, + inventory_image = "livingdesert_flower.png", + wield_image = "livingdesert_flower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:flower", + deco_type = "simple", + place_on = {"livingdesert:coldsteppe_ground2", "livingdesert:coldsteppe_ground3"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4579, + octaves = 9, + persist = 1, + }, + biomes = {"cold_desert_ocean", "cold_desert"}, + y_max = 300, + y_min = 0, + decoration = "livingdesert:flower", + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingdesert:coldsteppe_ground", {"livingdesert:coldsteppe_grass1", "livingdesert:coldsteppe_grass2", "livingdesert:coldsteppe_grass3", "livingdesert:coldsteppe_grass4", "livingdesert:coldsteppe_grass6", "livingdesert:saxaul_shrub", "livingdesert:saxaul_shrub2", "livingdesert:flower", "livingdesert:deadshrub"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingdesert:coldsteppe_ground2", {"livingdesert:coldsteppe_grass1", "livingdesert:coldsteppe_grass2", "livingdesert:coldsteppe_grass3", "livingdesert:coldsteppe_grass4", "livingdesert:coldsteppe_grass6", "livingdesert:flower"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingdesert:coldsteppe_ground2", {"livingdesert:coldsteppe_grass1", "livingdesert:coldsteppe_grass2", "livingdesert:coldsteppe_grass3", "livingdesert:coldsteppe_grass4", "livingdesert:coldsteppe_grass6", "livingdesert:flower"}, {}} + }) +end + diff --git a/mods/livingdesert/crafting.lua b/mods/livingdesert/crafting.lua new file mode 100644 index 0000000..3572180 --- /dev/null +++ b/mods/livingdesert/crafting.lua @@ -0,0 +1,107 @@ +local S = minetest.get_translator("livingdesert") + +local modname = "livingdesert" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +doors.register_trapdoor("livingdesert:datepalm_trapdoor", { + description = S"Date Palm Trapdoor", + inventory_image = "livingdesert_datepalm_trapdoor.png", + wield_image = "livingdesert_datepalm_trapdoor.png", + tile_front = "livingdesert_datepalm_trapdoor.png", + tile_side = "livingdesert_datepalm_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "livingdesert:datepalm_trapdoor 2", + recipe = { + {"livingdesert:date_palm_wood", "livingdesert:date_palm_wood", "livingdesert:date_palm_wood"}, + {"livingdesert:date_palm_wood", "livingdesert:date_palm_trunk", "livingdesert:date_palm_wood"}, + } +}) + +doors.register("livingdesert_datepalm_door", { + tiles = {{ name = "livingdesert_datepalm_door.png", backface_culling = true }}, + description = S"Date Palm Door", + inventory_image = "livingdesert_item_datepalm_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"livingdesert:date_palm_wood", "livingdesert:date_palm_wood"}, + {"livingdesert:date_palm_trunk", "livingdesert:date_palm_trunk"}, + {"livingdesert:date_palm_wood", "livingdesert:date_palm_wood"}, + } +}) + +doors.register_trapdoor("livingdesert:saxaul_trapdoor", { + description = S"Saxaul Trapdoor", + inventory_image = "livingdesert_saxaul_trapdoor.png", + wield_image = "livingdesert_saxaul_trapdoor.png", + tile_front = "livingdesert_saxaul_trapdoor.png", + tile_side = "livingdesert_saxaul_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "livingdesert:saxaul_trapdoor 2", + recipe = { + {"livingdesert:saxaul_wood", "livingdesert:saxaul_wood", "livingdesert:saxaul_wood"}, + {"livingdesert:saxaul_wood", "livingdesert:saxaul_trunk", "livingdesert:saxaul_wood"}, + } +}) + +doors.register("livingdesert_saxaul_door", { + tiles = {{ name = "livingdesert_saxaul_door.png", backface_culling = true }}, + description = S"Saxaul Door", + inventory_image = "livingdesert_item_saxaul_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"livingdesert:saxaul_wood", "livingdesert:saxaul_wood"}, + {"livingdesert:saxaul_trunk", "livingdesert:saxaul_trunk"}, + {"livingdesert:saxaul_wood", "livingdesert:saxaul_wood"}, + } +}) + +doors.register_trapdoor("livingdesert:pine_trapdoor", { + description = S"Cold Desert Larch Trapdoor", + inventory_image = "livingdesert_pine_trapdoor.png", + wield_image = "livingdesert_pine_trapdoor.png", + tile_front = "livingdesert_pine_trapdoor.png", + tile_side = "livingdesert_pine_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "livingdesert:pine_trapdoor 2", + recipe = { + {"livingdesert:pine_wood", "livingdesert:pine_wood", "livingdesert:pine_wood"}, + {"livingdesert:pine_wood", "livingdesert:pine_trunk", "livingdesert:pine_wood"}, + } +}) + +doors.register("livingdesert_pine_door", { + tiles = {{ name = "livingdesert_pine_door.png", backface_culling = true }}, + description = S"Cold Desert Larch Door", + inventory_image = "livingdesert_item_pine_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"livingdesert:pine_wood", "livingdesert:pine_wood"}, + {"livingdesert:pine_trunk", "livingdesert:pine_trunk"}, + {"livingdesert:pine_wood", "livingdesert:pine_wood"}, + } +}) \ No newline at end of file diff --git a/mods/livingdesert/desertplants.lua b/mods/livingdesert/desertplants.lua new file mode 100644 index 0000000..ee11015 --- /dev/null +++ b/mods/livingdesert/desertplants.lua @@ -0,0 +1,1147 @@ +local S = minetest.get_translator("livingdesert") + +local modname = "livingdesert" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Tree generation +-- + +-- New date palm tree + + +local function grow_new_date_palm_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 1, y = pos.y - 0, z = pos.z - 1}, modpath.."/schematics/livingdesert_date_palm.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:date_palm_sapling", grow_new_date_palm_tree, "soil"}, +}) +end + + +-- datepalm trunk +minetest.register_node("livingdesert:date_palm_trunk", { + description = S("Date Palm Trunk"), + tiles = { + "livingdesert_date_palm_trunk_top.png", + "livingdesert_date_palm_trunk_top.png", + "livingdesert_date_palm_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:date_palm_leaves", { + description = S("Date Palm Leaves"), + drawtype = "plantlike", + waving = 1, + visual_scale = 4.0, + tiles = {"livingdesert_date_palm_leaves.png"}, + special_tiles = {"livingdesert_date_palm_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/25 chance + items = {'livingdesert:date_palm_sapling'}, + rarity = 3, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:date_palm_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:date_palm_sapling", { + description = S("Date Palm Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_date_palm_sapling.png"}, + inventory_image = "livingdesert_date_palm_sapling.png", + wield_image = "livingdesert_date_palm_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_date_palm_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:date_palm_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +-- date_palm wood +minetest.register_node("livingdesert:date_palm_wood", { + description = S("Date Palm Wood"), + tiles = {"livingdesert_date_palm_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingdesert:date_palm_wood 4", + recipe = {{"livingdesert:date_palm_trunk"}} +}) + + stairs.register_stair_and_slab( + "livingdesert_date_palm_wood", + "livingdesert:date_palm_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingdesert_date_palm_wood.png"}, + S("Date Palm Stair"), + S("Date Palm Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "livingdesert_date_palm_trunk", + "livingdesert:date_palm_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingdesert_date_palm_trunk_top.png", "livingdesert_date_palm_trunk_top.png", "livingdesert_date_palm_trunk.png"}, + S("Date Palm Trunk Stair"), + S("Date Palm Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "livingdesert:gate_date_palm_wood", + { + description = S("Date Palm Wood Fence Gate"), + texture = "livingdesert_date_palm_wood.png", + material = "livingdesert:date_palm_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "livingdesert:fence_date_palm_wood", + { + description = S("Date Palm Fence"), + texture = "livingdesert_date_palm_fence_wood.png", + inventory_image = "default_fence_overlay.png^livingdesert_date_palm_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingdesert_date_palm_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingdesert:date_palm_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "livingdesert:fence_rail_date_palm_wood", + { + description = S("Date Palm Fence Rail"), + texture = "livingdesert_date_palm_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^livingdesert_date_palm_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingdesert_date_palm_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingdesert:date_palm_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + + +minetest.register_decoration({ + name = "livingdesert:date_palm_tree", + deco_type = "schematic", + place_on = {"default:sand", "default:desert_sand"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 3, + y_min = 2, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_date_palm.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:date_palm_tree2", + deco_type = "schematic", + place_on = {"default:sand", "default:desert_sand"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 3, + y_min = 2, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_date_palm2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:date_palm_tree3", + deco_type = "schematic", + place_on = {"default:sand", "default:desert_sand"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 3, + y_min = 2, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_date_palm3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- date fruits +minetest.register_node("livingdesert:date_palm_fruits", { + description = S("Date Palm Fruits"), + drawtype = "plantlike", + tiles = {"livingdesert_date_palm_fruits.png"}, + inventory_image = "livingdesert_date_palm_fruits.png", + wield_image = "livingdesert_date_palm_fruits.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = {food = 1, flammable = 2, fleshy = 3, dig_immediate = 3, leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3}, + drop = "livingdesert:date_palm_fruits", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "livingdesert:date_palm_fruits", param2 = 1}) + end + end +}) + +-- Tree generation +-- + +-- New euphorbia tree + +local function grow_new_euphorbia_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/livingdesert_euphorbia2.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:euphorbia_sapling", grow_new_euphorbia_tree, "soil"}, +}) +end + +-- euphorbia trunk +minetest.register_node("livingdesert:euphorbia_trunk", { + description = S("Euphorbia Trunk"), + tiles = { + "livingdesert_euphorbia_trunk.png", + "livingdesert_euphorbia_trunk.png", + "livingdesert_euphorbia_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:euphorbia_leaves", { + description = S("Euphorbia Leaves"), + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingdesert_euphorbia_leaves.png"}, + special_tiles = {"livingdesert_euphorbia_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingdesert:euphorbia_sapling'}, + rarity = 2, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:euphorbia_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:euphorbia_sapling", { + description = S("Euphorbia Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_euphorbia_sapling.png"}, + inventory_image = "livingdesert_euphorbia_sapling.png", + wield_image = "livingdesert_euphorbia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_euphorbia_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:euphorbia_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + +minetest.register_decoration({ + name = "livingdesert:euphorbia_tree", + deco_type = "schematic", + place_on = {"default:sand", "default:desert_sand"}, + place_offset_y = 0, + noise_params = { + offset = 0, + scale = 0.003, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 50, + y_min = 10, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_euphorbia.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:euphorbia_tree2", + deco_type = "schematic", + place_on = {"default:sand", "default:desert_sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.003, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 50, + y_min = 10, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_euphorbia2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:euphorbia_tree3", + deco_type = "schematic", + place_on = {"default:sand", "default:desert_sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.003, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 50, + y_min = 10, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_euphorbia3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- Tree generation +-- + +-- New figcactus tree + +local function grow_new_figcactus_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 1, y = pos.y - 0, z = pos.z - 1}, modpath.."/schematics/livingdesert_figcactus7.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingdesert:figcactus_sapling", grow_new_figcactus_tree, "soil"}, +}) +end + +-- figcactus trunk +minetest.register_node("livingdesert:figcactus_trunk", { + description = S("Figcactus Trunk"), + tiles = { + "livingdesert_figcactus.png", + "livingdesert_figcactus.png", + "livingdesert_figcactus.png" + }, + groups = {tree = 1, coppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:figcactus_flower", { + description = S("Figcactus Leaves"), + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_figcactus_flower.png"}, + special_tiles = {"livingdesert_figcactus_flower.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/25 chance + items = {'livingdesert:figcactus_sapling'}, + rarity = 2, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingdesert:figcactus_flower'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingdesert:figcactus_sapling", { + description = S("Figcactus Sapling"), + drawtype = "plantlike", + tiles = {"livingdesert_figcactus_sapling.png"}, + inventory_image = "livingdesert_figcactus_sapling.png", + wield_image = "livingdesert_figcactus_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_figcactus_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingdesert:figcactus_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree2", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree3", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree4", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree5", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus5.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree6", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus6.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingdesert:figcactus_tree7", + deco_type = "schematic", + place_on = {"default:sand"}, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.015, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 60, + y_min = 7, + schematic = minetest.get_modpath("livingdesert").."/schematics/livingdesert_figcactus7.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- figcactus fruits +minetest.register_node("livingdesert:figcactus_fruit", { + description = S("Figcactus Fruit"), + drawtype = "plantlike", + tiles = {"livingdesert_figcactus_fruit.png"}, + inventory_image = "livingdesert_figcactus_fruit.png", + wield_image = "livingdesert_figcactus_fruit.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = {food = 1, flammable = 2, fleshy = 3, dig_immediate = 3, leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3}, + drop = "livingdesert:figcactus_fruit", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "livingdesert:figcactus_fruit", param2 = 1}) + end + end +}) + +minetest.register_node("livingdesert:yucca", { + description = S("Yucca palm"), + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingdesert_yucca.png"}, + inventory_image = "livingdesert_yucca.png", + wield_image = "livingdesert_yucca.png", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + }, +}) + + minetest.register_decoration({ + name = "livingdesert:yucca", + deco_type = "simple", + place_on = {"default:sand", "default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.01, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean", "cold_desert", "cold_desert_ocean"}, + y_max = 250, + y_min = 4, + decoration = "livingdesert:yucca", + param2 = 4, + }) + + minetest.register_decoration({ + name = "livingdesert:succulent", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.05, + spread = {x = 100, y = 100, z = 100}, + seed = 7238, + octaves = 7, + persist = 1, + }, + y_max = 85, + y_min = 35, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + decoration = "livingdesert:succulent", + }) + +minetest.register_node("livingdesert:succulent", { + description = "Lithops", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_succulent.png"}, + inventory_image = "livingdesert_succulent.png", + wield_image = "livingdesert_succulent.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:succulent2", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 1557, + octaves = 7, + persist = 1, + }, + y_max = 85, + y_min = 35, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + decoration = "livingdesert:succulent2", + }) + +minetest.register_node("livingdesert:succulent2", { + description = S"Succulent", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_succulent2.png"}, + inventory_image = "livingdesert_succulent2.png", + wield_image = "livingdesert_succulent2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + + minetest.register_decoration({ + name = "livingdesert:succulent3", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 9009, + octaves = 7, + persist = 1, + }, + y_max = 85, + y_min = 35, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + decoration = "livingdesert:succulent3", + }) + +minetest.register_node("livingdesert:succulent3", { + description = S"Succulent", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_succulent3.png"}, + inventory_image = "livingdesert_succulent3.png", + wield_image = "livingdesert_succulent3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:succulent4", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 7238, + octaves = 7, + persist = 1, + }, + y_max = 85, + y_min = 35, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + decoration = "livingdesert:succulent4", + }) + +minetest.register_node("livingdesert:succulent4", { + description = S"Lithops", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_succulent4.png"}, + inventory_image = "livingdesert_succulent4.png", + wield_image = "livingdesert_succulent4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:succulent5", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 7238, + octaves = 7, + persist = 1, + }, + y_max = 85, + y_min = 35, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + decoration = "livingdesert:succulent5", + }) + +minetest.register_node("livingdesert:succulent5", { + description = S"Lithops", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"livingdesert_succulent5.png"}, + inventory_image = "livingdesert_succulent5.png", + wield_image = "livingdesert_succulent5.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:cactus", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 10, y = 10, z = 10}, + seed = 329, + octaves = 3, + persist = 0.2 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 100, + y_min = 10, + decoration = "livingdesert:cactus", + param2 = 4, + }) + +minetest.register_node("livingdesert:cactus", { + description = S"Barrel Cactus", + drawtype = "plantlike", + waving = 0, + visual_scale = 2.0, + tiles = {"livingdesert_small_cactus.png"}, + inventory_image = "livingdesert_small_cactus.png", + wield_image = "livingdesert_small_cactus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:cactus2", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 10, y = 10, z = 10}, + seed = 329, + octaves = 3, + persist = 0.2 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 100, + y_min = 10, + decoration = "livingdesert:cactus2", + param2 = 4, + }) + +minetest.register_node("livingdesert:cactus2", { + description = S"Peanut Cactus", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingdesert_small_cactus2.png"}, + inventory_image = "livingdesert_small_cactus2.png", + wield_image = "livingdesert_small_cactus2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:cactus3", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 10, y = 10, z = 10}, + seed = 329, + octaves = 3, + persist = 0.2 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + y_max = 100, + y_min = 10, + decoration = "livingdesert:cactus3", + param2 = 4, + }) + +minetest.register_node("livingdesert:cactus3", { + description = S"Spider Cactus", + drawtype = "plantlike", + waving = 0, + visual_scale = 2.0, + tiles = {"livingdesert_small_cactus3.png"}, + inventory_image = "livingdesert_small_cactus3.png", + wield_image = "livingdesert_small_cactus3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = true, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingdesert:cactus4", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.009, + spread = {x = 10, y = 10, z = 10}, + seed = 329, + octaves = 3, + persist = 0.2 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + spawn_by = "livingdesert:cactus", + y_max = 100, + y_min = 10, + decoration = "livingdesert:cactus4", + param2 = 4, + }) + +minetest.register_node("livingdesert:cactus4", { + description = S"Small Barrel Cactus", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingdesert_small_cactus4.png"}, + inventory_image = "livingdesert_small_cactus4.png", + wield_image = "livingdesert_small_cactus4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + minetest.register_decoration({ + name = "livingdesert:cactus5", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.008, + spread = {x = 10, y = 10, z = 10}, + seed = 329, + octaves = 3, + persist = 0.2 + }, + biomes = {"sandstone_desert", "desert", "sandstone_desert_ocean", "desert_ocean"}, + spawn_by = "livingdesert:cactus3", + y_max = 100, + y_min = 10, + decoration = "livingdesert:cactus5", + param2 = 4, + }) + +minetest.register_node("livingdesert:cactus5", { + description = S"Small Spider Cactus", + drawtype = "plantlike", + waving = 0, + visual_scale = 1.0, + tiles = {"livingdesert_small_cactus5.png"}, + inventory_image = "livingdesert_small_cactus5.png", + wield_image = "livingdesert_small_cactus5.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"default:desert_sand", {"livingdesert:cactus5", "livingdesert:cactus4", "livingdesert:cactus3", "livingdesert:cactus2", "livingdesert:cactus", "livingdesert:succulent5", "livingdesert:succulent4", "livingdesert:succulent3", "livingdesert:succulent2", "livingdesert:succulent", "livingdesert:yucca"}, {}} + }) +end + diff --git a/mods/livingdesert/dye.lua b/mods/livingdesert/dye.lua new file mode 100644 index 0000000..4393768 --- /dev/null +++ b/mods/livingdesert/dye.lua @@ -0,0 +1,56 @@ +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"livingdesert:coldsteppe_grass1"} + }, +}) + +minetest.register_craft({ + output = "dye:green 2", + recipe = { + {"livingdesert:coldsteppe_grass2"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"livingdesert:coldsteppe_grass4"} + }, +}) + +minetest.register_craft({ + output = "dye:grey 2", + recipe = { + {"livingdesert:coldsteppe_grass6"} + }, +}) + +minetest.register_craft({ + output = "dye:yellow 2", + recipe = { + {"livingdesert:figcactus_flower"} + }, +}) + +minetest.register_craft({ + output = "dye:orange 2", + recipe = { + {"livingdesert:figcactus_fruit"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"livingdesert:flower"} + }, +}) + +minetest.register_craft({ + output = "dye:yellow 2", + recipe = { + {"livingdesert:succulent3"} + }, +}) + diff --git a/mods/livingdesert/hunger.lua b/mods/livingdesert/hunger.lua new file mode 100644 index 0000000..27ec8a9 --- /dev/null +++ b/mods/livingdesert/hunger.lua @@ -0,0 +1,9 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('livingdesert:date_palm_fruits', { + satiates = 3.0, + }) + hunger_ng.add_hunger_data('livingdesert:figcactus_fruit', { + satiates = 3.0, + }) + +end \ No newline at end of file diff --git a/mods/livingdesert/init.lua b/mods/livingdesert/init.lua new file mode 100644 index 0000000..de90142 --- /dev/null +++ b/mods/livingdesert/init.lua @@ -0,0 +1,33 @@ +--This creates the livingdesert object. +livingdesert = {} + +--This creates the livingdesert.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +livingdesert.settings = { + clear_biomes = minetest.settings:get_bool("livingdesert.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("livingdesert.clear_decos") or false, + clear_ores = minetest.settings:get_bool("livingdesert.clear_ores") or false, +} + +if livingdesert.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if livingdesert.settings.clear_decos then + minetest.clear_registered_decorations() +end +if livingdesert.settings.clear_ores then + minetest.clear_registered_ores() +end + +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + + +-- plants +dofile(path .. "desertplants.lua") -- +dofile(path .. "colddesert.lua") -- +dofile(path .. "yurts.lua") -- +dofile(path .. "dye.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "leafdecay.lua") -- +dofile(path .. "hunger.lua") -- + + diff --git a/mods/livingdesert/leafdecay.lua b/mods/livingdesert/leafdecay.lua new file mode 100644 index 0000000..037e7cf --- /dev/null +++ b/mods/livingdesert/leafdecay.lua @@ -0,0 +1,31 @@ + + +default.register_leafdecay({ + trunks = {"livingdesert:date_palm_trunk"}, + leaves = {"livingdesert:date_palm_leaves", "livingdesert:date_palm_fruits"}, + radius = 3 +}) + +default.register_leafdecay({ + trunks = {"livingdesert:euphorbia_trunk"}, + leaves = {"livingdesert:euphorbia_leaves"}, + radius = 3 +}) + +default.register_leafdecay({ + trunks = {"livingdesert:figcactus_trunk"}, + leaves = {"livingdesert:figcactus_flower", "livingdesert:figcactus_fruit"}, + radius = 3 +}) + +default.register_leafdecay({ + trunks = {"livingdesert:saxaul_trunk"}, + leaves = {"livingdesert:saxaul_leaves"}, + radius = 3 +}) + +default.register_leafdecay({ + trunks = {"livingdesert:pine_trunk"}, + leaves = {"livingdesert:pine_leaves", "livingdesert:pine_leaves2", "livingdesert:pine_leaves3"}, + radius = 3 +}) diff --git a/mods/livingdesert/locale/livingdesert.de.tr b/mods/livingdesert/locale/livingdesert.de.tr new file mode 100644 index 0000000..4fde491 --- /dev/null +++ b/mods/livingdesert/locale/livingdesert.de.tr @@ -0,0 +1,68 @@ +# textdomain: livingdesert + +Cold Desert Ground=Kaltwüstenboden +Coldsteppe Grass=Kaltsteppengras +Coldsteppe Shrub=Kaltsteppenbusch +Cold Desert Larch Trunk=Kaltwüstenlärchen Stamm +Cold Desert Larch Leaves=Kaltwüstenlärchen Blätter +Cold Desert Larch Sapling=Kaltwüstenlärchen Setzling +Cold Desert Larch Wood=Kaltwüstenlärchen Holz +Cold Desert Larch Stair=Kaltwüstenlärchen Treppe +Cold Desert Larch Slab=Kaltwüstenlärchen Holz Platte +Cold Desert Larch Trunk Stair=Kaltwüstenlärchen Stamm Treppe +Cold Desert Larch Trunk Slab=Kaltwüstenlärchen Stamm Platte +Cold Desert Larch Fence=Kaltwüstenlärchen Zaun +Cold Desert Larch Fence Rail=Kaltwüstenlärchen Geländer +Cold Desert Larch Wood Fence Gate=Kaltwüstenlärchen Zauntor +Saxaul Tree Trunk=Saxaulbaum Stamm +Saxaul Tree Leaves=Saxaulbaum Blätter +Saxaul Tree Sapling=Saxaulbaum Setzing +Saxaul Tree Wood=Saxaulbaum Holz +Saxaul Tree Stair=Saxaulbaum Treppe +Saxaul Tree Slab=Saxaulbaum Platte +Saxaul Tree Trunk Stair=Saxaulbaum Stamm Treppe +Saxaul Tree Trunk Slab=Saxaulbaum Stamm Platte +Saxaul Tree Wood Fence Gate=Saxaulbaum Holzzauntor +Saxaul Tree Fence=Saxaulbaum Zaun +Saxaul Tree Fence Rail=Saxaulbaum Geländer +Dead Shrub=Toter Busch +Crocus Flower=Krokus +Date Palm Trunk=Dattelpalmen Stamm +Date Palm Leaves=Dattenpalmenwendel +Date Palm Sapling=Dattelpalmen Setzling +Date Palm Wood=Dattelpalmen Holz +Date Palm Stair=Dattelpalmen Treppe +Date Palm Slab=Dattelpalmen Platte +Date Palm Trunk Stair=Dattelpalmen Stamm Treppe +Date Palm Trunk Slab=Dattelpalmen Stamm Platte +Date Palm Wood Fence Gate=Dattelpalmen Holzzaun Tor +Date Palm Fence=Dattelpalmen Zaun +Date Palm Fence Rail=Dattelpalmenzaun Geländer +Date Palm Fruits=Datteln +Euphorbia Trunk=Euphorbien Stamm +Euphorbia Leaves=Euphorbienblätter +Euphorbia Sapling=Euphorbien Setzling +Figcactus Trunk=Feigenkaktus Stamm +Figcactus Leaves=Feigenkaktus Blüte +Figcactus Sapling=Feigenkaktus Setzling +Figcactus Fruit=Kaktusfeige +Yucca palm=Yuccapalme +Succulent=Sukkulente +Barrel Cactus=Fasskaktus +Small Barrel Cactus=Kleiner Fasskaktus +Spider Cactus=Spinnenkaktus +Small Spider Cactus=Kleiner Spinnenkaktus +Peanut Cactus=Erdnusskaktus +Yurt lower outside part=Unteres Außenteil der Jurte +Yurt second lower outside part=Zweites unteres Außenteil der Jurte +Yurt upper outside part=Oberes Außenteil der Jurte +Yurt lower inside part=Unteres Innenteil der Jurte +Yurt upper inside part=Oberes Innenteil der Jurte +Date Palm Trapdoor=Dattelpalmen Falltür +Date Palm Door=Dattelpalmen Tür +Saxaul Trapdoor=Saxaulbaum Falltür +Saxaul Door=Saxaulbaum Tür +Cold Desert Larch Trapdoor=Kaltwüstenlärchen Falltür +Cold Desert Larch Door=Kaltwüstenlärchen Tür + + diff --git a/mods/livingdesert/mod.conf b/mods/livingdesert/mod.conf new file mode 100644 index 0000000..45faa9c --- /dev/null +++ b/mods/livingdesert/mod.conf @@ -0,0 +1,4 @@ +name = livingdesert +description = Adds plants to the default deserts of minetest game. +depends = default, stairs, doors +optional_depends = mobs, animalworld, hunger_ng, bonemeal diff --git a/mods/livingdesert/schematics/livingdesert_date_palm.mts b/mods/livingdesert/schematics/livingdesert_date_palm.mts new file mode 100644 index 0000000..79994c3 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_date_palm.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_date_palm2.mts b/mods/livingdesert/schematics/livingdesert_date_palm2.mts new file mode 100644 index 0000000..0756dfb Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_date_palm2.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_date_palm3.mts b/mods/livingdesert/schematics/livingdesert_date_palm3.mts new file mode 100644 index 0000000..ad3bff5 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_date_palm3.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_euphorbia.mts b/mods/livingdesert/schematics/livingdesert_euphorbia.mts new file mode 100644 index 0000000..6bbfc8f Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_euphorbia.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_euphorbia2.mts b/mods/livingdesert/schematics/livingdesert_euphorbia2.mts new file mode 100644 index 0000000..2f3ea65 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_euphorbia2.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_euphorbia3.mts b/mods/livingdesert/schematics/livingdesert_euphorbia3.mts new file mode 100644 index 0000000..561abeb Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_euphorbia3.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus.mts b/mods/livingdesert/schematics/livingdesert_figcactus.mts new file mode 100644 index 0000000..983e753 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus2.mts b/mods/livingdesert/schematics/livingdesert_figcactus2.mts new file mode 100644 index 0000000..1780e6e Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus2.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus3.mts b/mods/livingdesert/schematics/livingdesert_figcactus3.mts new file mode 100644 index 0000000..b28d695 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus3.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus4.mts b/mods/livingdesert/schematics/livingdesert_figcactus4.mts new file mode 100644 index 0000000..78985a8 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus4.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus5.mts b/mods/livingdesert/schematics/livingdesert_figcactus5.mts new file mode 100644 index 0000000..a676202 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus5.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus6.mts b/mods/livingdesert/schematics/livingdesert_figcactus6.mts new file mode 100644 index 0000000..648949c Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus6.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_figcactus7.mts b/mods/livingdesert/schematics/livingdesert_figcactus7.mts new file mode 100644 index 0000000..fc645c9 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_figcactus7.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine.mts b/mods/livingdesert/schematics/livingdesert_pine.mts new file mode 100644 index 0000000..4b12e1c Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine11.mts b/mods/livingdesert/schematics/livingdesert_pine11.mts new file mode 100644 index 0000000..7a998b6 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine11.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine111.mts b/mods/livingdesert/schematics/livingdesert_pine111.mts new file mode 100644 index 0000000..1c53042 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine111.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine2.mts b/mods/livingdesert/schematics/livingdesert_pine2.mts new file mode 100644 index 0000000..f97dd4e Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine2.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine22.mts b/mods/livingdesert/schematics/livingdesert_pine22.mts new file mode 100644 index 0000000..68c218c Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine22.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine222.mts b/mods/livingdesert/schematics/livingdesert_pine222.mts new file mode 100644 index 0000000..73699b0 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine222.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine3.mts b/mods/livingdesert/schematics/livingdesert_pine3.mts new file mode 100644 index 0000000..6863584 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine3.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine33.mts b/mods/livingdesert/schematics/livingdesert_pine33.mts new file mode 100644 index 0000000..2a2e615 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine33.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_pine333.mts b/mods/livingdesert/schematics/livingdesert_pine333.mts new file mode 100644 index 0000000..8ecb3f8 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_pine333.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_rockformation.mts b/mods/livingdesert/schematics/livingdesert_rockformation.mts new file mode 100644 index 0000000..8603281 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_rockformation.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_rockformation2.mts b/mods/livingdesert/schematics/livingdesert_rockformation2.mts new file mode 100644 index 0000000..a04363e Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_rockformation2.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_rockformation3.mts b/mods/livingdesert/schematics/livingdesert_rockformation3.mts new file mode 100644 index 0000000..f7c0e7d Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_rockformation3.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_rockformation4.mts b/mods/livingdesert/schematics/livingdesert_rockformation4.mts new file mode 100644 index 0000000..c8efc88 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_rockformation4.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_rockformation5.mts b/mods/livingdesert/schematics/livingdesert_rockformation5.mts new file mode 100644 index 0000000..73836f9 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_rockformation5.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_saxaul.mts b/mods/livingdesert/schematics/livingdesert_saxaul.mts new file mode 100644 index 0000000..a592e54 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_saxaul.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_saxaul2.mts b/mods/livingdesert/schematics/livingdesert_saxaul2.mts new file mode 100644 index 0000000..5cc54e1 Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_saxaul2.mts differ diff --git a/mods/livingdesert/schematics/livingdesert_saxaul3.mts b/mods/livingdesert/schematics/livingdesert_saxaul3.mts new file mode 100644 index 0000000..92f06dc Binary files /dev/null and b/mods/livingdesert/schematics/livingdesert_saxaul3.mts differ diff --git a/mods/livingdesert/screenshot.png b/mods/livingdesert/screenshot.png new file mode 100644 index 0000000..762a974 Binary files /dev/null and b/mods/livingdesert/screenshot.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_grass1.png b/mods/livingdesert/textures/livingdesert_coldsteppe_grass1.png new file mode 100644 index 0000000..0b93f51 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_grass1.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_grass2.png b/mods/livingdesert/textures/livingdesert_coldsteppe_grass2.png new file mode 100644 index 0000000..36fa8a1 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_grass2.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_grass3.png b/mods/livingdesert/textures/livingdesert_coldsteppe_grass3.png new file mode 100644 index 0000000..a207fc6 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_grass3.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_grass4.png b/mods/livingdesert/textures/livingdesert_coldsteppe_grass4.png new file mode 100644 index 0000000..89668a6 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_grass4.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_grass5.png b/mods/livingdesert/textures/livingdesert_coldsteppe_grass5.png new file mode 100644 index 0000000..c095f59 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_grass5.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_grass6.png b/mods/livingdesert/textures/livingdesert_coldsteppe_grass6.png new file mode 100644 index 0000000..3bff364 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_grass6.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground.png new file mode 100644 index 0000000..46e228b Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground2.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground2.png new file mode 100644 index 0000000..be9d5a4 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground2.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground2_side.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground2_side.png new file mode 100644 index 0000000..8a2a5aa Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground2_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground3.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground3.png new file mode 100644 index 0000000..fc3faa1 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground3.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground3_side.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground3_side.png new file mode 100644 index 0000000..04789ec Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground3_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground4.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground4.png new file mode 100644 index 0000000..8a6c1c6 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground4.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground4_side.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground4_side.png new file mode 100644 index 0000000..3a5f8b0 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground4_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_coldsteppe_ground_side.png b/mods/livingdesert/textures/livingdesert_coldsteppe_ground_side.png new file mode 100644 index 0000000..d165e21 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_coldsteppe_ground_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_fence_wood.png b/mods/livingdesert/textures/livingdesert_date_palm_fence_wood.png new file mode 100644 index 0000000..8eaa36c Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_fence_wood.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_fruits.png b/mods/livingdesert/textures/livingdesert_date_palm_fruits.png new file mode 100644 index 0000000..e1f5bf5 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_fruits.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_leaves.png b/mods/livingdesert/textures/livingdesert_date_palm_leaves.png new file mode 100644 index 0000000..4e586ef Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_leaves.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_sapling.png b/mods/livingdesert/textures/livingdesert_date_palm_sapling.png new file mode 100644 index 0000000..9852fe4 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_sapling.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_trunk.png b/mods/livingdesert/textures/livingdesert_date_palm_trunk.png new file mode 100644 index 0000000..f91cd83 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_trunk.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_trunk_top.png b/mods/livingdesert/textures/livingdesert_date_palm_trunk_top.png new file mode 100644 index 0000000..9a663c6 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_trunk_top.png differ diff --git a/mods/livingdesert/textures/livingdesert_date_palm_wood.png b/mods/livingdesert/textures/livingdesert_date_palm_wood.png new file mode 100644 index 0000000..c184d0f Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_date_palm_wood.png differ diff --git a/mods/livingdesert/textures/livingdesert_datepalm_door.png b/mods/livingdesert/textures/livingdesert_datepalm_door.png new file mode 100644 index 0000000..2619a5c Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_datepalm_door.png differ diff --git a/mods/livingdesert/textures/livingdesert_datepalm_trapdoor.png b/mods/livingdesert/textures/livingdesert_datepalm_trapdoor.png new file mode 100644 index 0000000..9c16949 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_datepalm_trapdoor.png differ diff --git a/mods/livingdesert/textures/livingdesert_datepalm_trapdoor_side.png b/mods/livingdesert/textures/livingdesert_datepalm_trapdoor_side.png new file mode 100644 index 0000000..ff19eb6 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_datepalm_trapdoor_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_deadshrub.png b/mods/livingdesert/textures/livingdesert_deadshrub.png new file mode 100644 index 0000000..49745d8 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_deadshrub.png differ diff --git a/mods/livingdesert/textures/livingdesert_euphorbia_leaves.png b/mods/livingdesert/textures/livingdesert_euphorbia_leaves.png new file mode 100644 index 0000000..ebefa1a Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_euphorbia_leaves.png differ diff --git a/mods/livingdesert/textures/livingdesert_euphorbia_sapling.png b/mods/livingdesert/textures/livingdesert_euphorbia_sapling.png new file mode 100644 index 0000000..213ae90 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_euphorbia_sapling.png differ diff --git a/mods/livingdesert/textures/livingdesert_euphorbia_trunk.png b/mods/livingdesert/textures/livingdesert_euphorbia_trunk.png new file mode 100644 index 0000000..d6a3d95 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_euphorbia_trunk.png differ diff --git a/mods/livingdesert/textures/livingdesert_figcactus.png b/mods/livingdesert/textures/livingdesert_figcactus.png new file mode 100644 index 0000000..cd5ab15 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_figcactus.png differ diff --git a/mods/livingdesert/textures/livingdesert_figcactus_flower.png b/mods/livingdesert/textures/livingdesert_figcactus_flower.png new file mode 100644 index 0000000..7add55e Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_figcactus_flower.png differ diff --git a/mods/livingdesert/textures/livingdesert_figcactus_fruit.png b/mods/livingdesert/textures/livingdesert_figcactus_fruit.png new file mode 100644 index 0000000..17a8d38 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_figcactus_fruit.png differ diff --git a/mods/livingdesert/textures/livingdesert_figcactus_sapling.png b/mods/livingdesert/textures/livingdesert_figcactus_sapling.png new file mode 100644 index 0000000..eb8c7fe Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_figcactus_sapling.png differ diff --git a/mods/livingdesert/textures/livingdesert_flower.png b/mods/livingdesert/textures/livingdesert_flower.png new file mode 100644 index 0000000..9d60053 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_flower.png differ diff --git a/mods/livingdesert/textures/livingdesert_item_datepalm_door.png b/mods/livingdesert/textures/livingdesert_item_datepalm_door.png new file mode 100644 index 0000000..1fdaf4c Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_item_datepalm_door.png differ diff --git a/mods/livingdesert/textures/livingdesert_item_pine_door.png b/mods/livingdesert/textures/livingdesert_item_pine_door.png new file mode 100644 index 0000000..4cd81e8 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_item_pine_door.png differ diff --git a/mods/livingdesert/textures/livingdesert_item_saxaul_door.png b/mods/livingdesert/textures/livingdesert_item_saxaul_door.png new file mode 100644 index 0000000..1bf766e Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_item_saxaul_door.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_door.png b/mods/livingdesert/textures/livingdesert_pine_door.png new file mode 100644 index 0000000..93201b3 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_door.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_fence_wood.png b/mods/livingdesert/textures/livingdesert_pine_fence_wood.png new file mode 100644 index 0000000..1243a2c Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_fence_wood.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_leaves.png b/mods/livingdesert/textures/livingdesert_pine_leaves.png new file mode 100644 index 0000000..2acf5f3 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_leaves.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_leaves2.png b/mods/livingdesert/textures/livingdesert_pine_leaves2.png new file mode 100644 index 0000000..38122f0 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_leaves2.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_leaves3.png b/mods/livingdesert/textures/livingdesert_pine_leaves3.png new file mode 100644 index 0000000..f2093da Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_leaves3.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_sapling.png b/mods/livingdesert/textures/livingdesert_pine_sapling.png new file mode 100644 index 0000000..adee067 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_sapling.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_sapling2.png b/mods/livingdesert/textures/livingdesert_pine_sapling2.png new file mode 100644 index 0000000..13cc6d6 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_sapling2.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_sapling3.png b/mods/livingdesert/textures/livingdesert_pine_sapling3.png new file mode 100644 index 0000000..6db54c0 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_sapling3.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_trapdoor.png b/mods/livingdesert/textures/livingdesert_pine_trapdoor.png new file mode 100644 index 0000000..8a2e5f2 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_trapdoor.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_trapdoor_side.png b/mods/livingdesert/textures/livingdesert_pine_trapdoor_side.png new file mode 100644 index 0000000..4a82fb8 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_trapdoor_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_trunk.png b/mods/livingdesert/textures/livingdesert_pine_trunk.png new file mode 100644 index 0000000..fbf884a Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_trunk.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_trunk_top.png b/mods/livingdesert/textures/livingdesert_pine_trunk_top.png new file mode 100644 index 0000000..8636090 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_trunk_top.png differ diff --git a/mods/livingdesert/textures/livingdesert_pine_wood.png b/mods/livingdesert/textures/livingdesert_pine_wood.png new file mode 100644 index 0000000..1b62d8e Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_pine_wood.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_door.png b/mods/livingdesert/textures/livingdesert_saxaul_door.png new file mode 100644 index 0000000..03f4337 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_door.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_fence_wood.png b/mods/livingdesert/textures/livingdesert_saxaul_fence_wood.png new file mode 100644 index 0000000..38a1100 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_fence_wood.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_leaves.png b/mods/livingdesert/textures/livingdesert_saxaul_leaves.png new file mode 100644 index 0000000..6e0e27a Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_leaves.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_sapling.png b/mods/livingdesert/textures/livingdesert_saxaul_sapling.png new file mode 100644 index 0000000..2e9c736 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_sapling.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_shrub.png b/mods/livingdesert/textures/livingdesert_saxaul_shrub.png new file mode 100644 index 0000000..b78c21f Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_shrub.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_shrub2.png b/mods/livingdesert/textures/livingdesert_saxaul_shrub2.png new file mode 100644 index 0000000..b822e16 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_shrub2.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_trapdoor.png b/mods/livingdesert/textures/livingdesert_saxaul_trapdoor.png new file mode 100644 index 0000000..0e9b69b Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_trapdoor.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_trapdoor_side.png b/mods/livingdesert/textures/livingdesert_saxaul_trapdoor_side.png new file mode 100644 index 0000000..a47b359 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_trapdoor_side.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_trunk.png b/mods/livingdesert/textures/livingdesert_saxaul_trunk.png new file mode 100644 index 0000000..fa0ffd4 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_trunk.png differ diff --git a/mods/livingdesert/textures/livingdesert_saxaul_wood.png b/mods/livingdesert/textures/livingdesert_saxaul_wood.png new file mode 100644 index 0000000..1b6ee9d Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_saxaul_wood.png differ diff --git a/mods/livingdesert/textures/livingdesert_small_cactus.png b/mods/livingdesert/textures/livingdesert_small_cactus.png new file mode 100644 index 0000000..3729eee Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_small_cactus.png differ diff --git a/mods/livingdesert/textures/livingdesert_small_cactus2.png b/mods/livingdesert/textures/livingdesert_small_cactus2.png new file mode 100644 index 0000000..cbe9d83 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_small_cactus2.png differ diff --git a/mods/livingdesert/textures/livingdesert_small_cactus3.png b/mods/livingdesert/textures/livingdesert_small_cactus3.png new file mode 100644 index 0000000..f5b0571 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_small_cactus3.png differ diff --git a/mods/livingdesert/textures/livingdesert_small_cactus4.png b/mods/livingdesert/textures/livingdesert_small_cactus4.png new file mode 100644 index 0000000..6b4d8a9 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_small_cactus4.png differ diff --git a/mods/livingdesert/textures/livingdesert_small_cactus5.png b/mods/livingdesert/textures/livingdesert_small_cactus5.png new file mode 100644 index 0000000..3ea2045 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_small_cactus5.png differ diff --git a/mods/livingdesert/textures/livingdesert_succulent.png b/mods/livingdesert/textures/livingdesert_succulent.png new file mode 100644 index 0000000..297db19 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_succulent.png differ diff --git a/mods/livingdesert/textures/livingdesert_succulent2.png b/mods/livingdesert/textures/livingdesert_succulent2.png new file mode 100644 index 0000000..d38d4fa Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_succulent2.png differ diff --git a/mods/livingdesert/textures/livingdesert_succulent3.png b/mods/livingdesert/textures/livingdesert_succulent3.png new file mode 100644 index 0000000..9630927 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_succulent3.png differ diff --git a/mods/livingdesert/textures/livingdesert_succulent4.png b/mods/livingdesert/textures/livingdesert_succulent4.png new file mode 100644 index 0000000..f1e772a Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_succulent4.png differ diff --git a/mods/livingdesert/textures/livingdesert_succulent5.png b/mods/livingdesert/textures/livingdesert_succulent5.png new file mode 100644 index 0000000..5f355c9 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_succulent5.png differ diff --git a/mods/livingdesert/textures/livingdesert_yucca.png b/mods/livingdesert/textures/livingdesert_yucca.png new file mode 100644 index 0000000..446954c Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yucca.png differ diff --git a/mods/livingdesert/textures/livingdesert_yurt_inside.png b/mods/livingdesert/textures/livingdesert_yurt_inside.png new file mode 100644 index 0000000..3d512c8 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yurt_inside.png differ diff --git a/mods/livingdesert/textures/livingdesert_yurt_inside2.png b/mods/livingdesert/textures/livingdesert_yurt_inside2.png new file mode 100644 index 0000000..0860b6b Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yurt_inside2.png differ diff --git a/mods/livingdesert/textures/livingdesert_yurt_outside.png b/mods/livingdesert/textures/livingdesert_yurt_outside.png new file mode 100644 index 0000000..b447908 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yurt_outside.png differ diff --git a/mods/livingdesert/textures/livingdesert_yurt_outside2.png b/mods/livingdesert/textures/livingdesert_yurt_outside2.png new file mode 100644 index 0000000..5cf2a85 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yurt_outside2.png differ diff --git a/mods/livingdesert/textures/livingdesert_yurt_outside2_top.png b/mods/livingdesert/textures/livingdesert_yurt_outside2_top.png new file mode 100644 index 0000000..2e38952 Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yurt_outside2_top.png differ diff --git a/mods/livingdesert/textures/livingdesert_yurt_outside_top.png b/mods/livingdesert/textures/livingdesert_yurt_outside_top.png new file mode 100644 index 0000000..570954f Binary files /dev/null and b/mods/livingdesert/textures/livingdesert_yurt_outside_top.png differ diff --git a/mods/livingdesert/yurts.lua b/mods/livingdesert/yurts.lua new file mode 100644 index 0000000..d37cea9 --- /dev/null +++ b/mods/livingdesert/yurts.lua @@ -0,0 +1,86 @@ +local S = minetest.get_translator("livingdesert") + +-- Yurt Building Parts + +minetest.register_node("livingdesert:yurt_outside", { + description = S("Yurt lower outside part"), + tiles = { + "livingdesert_yurt_outside.png", + "livingdesert_yurt_outside.png", + "livingdesert_yurt_outside_top.png" + }, +groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1}, + sounds = default.node_sound_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:yurt_outsidesecond", { + description = S("Yurt second lower outside part"), + tiles = { + "livingdesert_yurt_outside_top.png", + "livingdesert_yurt_outside_top.png", + "livingdesert_yurt_outside.png" + }, +groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1}, + sounds = default.node_sound_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:yurt_outside2", { + description = S("Yurt upper outside part"), + tiles = { + "livingdesert_yurt_outside2_top.png", + "livingdesert_yurt_outside2_top.png", + "livingdesert_yurt_outside2.png" + }, +groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1}, + sounds = default.node_sound_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingdesert:yurt_inside", { + description = S("Yurt lower inside part"), + tiles = {"livingdesert_yurt_inside.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("livingdesert:yurt_inside2", { + description = S("Yurt upper inside part"), + tiles = {"livingdesert_yurt_inside2.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingdesert:yurt_outside 4", + recipe = {{"default:stick", "livingdesert:pine_trunk", "default:stone", "livingdesert:pine_wood"}} +}) + +minetest.register_craft({ + output = "livingdesert:yurt_outside2 4", + recipe = {{"default:stick", "wool:white", "livingdesert:pine_wood", "default:stone"}} +}) + +minetest.register_craft({ + output = "livingdesert:yurt_outsidesecond 4", + recipe = {{"default:stick", "wool:white", "livingdesert:pine_wood"}} +}) + +minetest.register_craft({ + output = "livingdesert:yurt_inside 4", + recipe = {{"default:stick", "livingdesert:pine_wood"}} +}) + +minetest.register_craft({ + output = "livingdesert:yurt_inside2 4", + recipe = {{"default:stick", "wool:white"}} +}) diff --git a/mods/livingjungle/LICENSE b/mods/livingjungle/LICENSE new file mode 100644 index 0000000..2477cb5 --- /dev/null +++ b/mods/livingjungle/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Liil (c) 2022 +Textures and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/livingjungle/crafting.lua b/mods/livingjungle/crafting.lua new file mode 100644 index 0000000..36a8a8b --- /dev/null +++ b/mods/livingjungle/crafting.lua @@ -0,0 +1,40 @@ +local S = minetest.get_translator("livingjungle") + +local modname = "livingjungle" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + + +doors.register_trapdoor("livingjungle:samauma_trapdoor", { + description = S"Samauma Trapdoor", + inventory_image = "livingjungle_samauma_trapdoor.png", + wield_image = "livingjungle_samauma_trapdoor.png", + tile_front = "livingjungle_samauma_trapdoor.png", + tile_side = "livingjungle_samauma_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "livingjungle:samauma_trapdoor 2", + recipe = { + {"livingjungle:samauma_wood", "livingjungle:samauma_wood", "livingjungle:samauma_wood"}, + {"livingjungle:samauma_wood", "livingjungle:samauma_trunk", "livingjungle:samauma_wood"}, + } +}) + +doors.register("livingjungle_samauma_door", { + tiles = {{ name = "livingjungle_samauma_door.png", backface_culling = true }}, + description = S"Samauma Door", + inventory_image = "livingjungle_item_samauma_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"livingjungle:samauma_wood", "livingjungle:samauma_wood"}, + {"livingjungle:samauma_trunk", "livingjungle:samauma_trunk"}, + {"livingjungle:samauma_wood", "livingjungle:samauma_wood"}, + } +}) \ No newline at end of file diff --git a/mods/livingjungle/init.lua b/mods/livingjungle/init.lua new file mode 100644 index 0000000..625cc28 --- /dev/null +++ b/mods/livingjungle/init.lua @@ -0,0 +1,29 @@ +--This creates the livingjungle object. +livingjungle = {} + +--This creates the livingjungle.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +livingjungle.settings = { + clear_biomes = minetest.settings:get_bool("livingjungle.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("livingjungle.clear_decos") or false, + clear_ores = minetest.settings:get_bool("livingjungle.clear_ores") or false, +} + +if livingjungle.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if livingjungle.settings.clear_decos then + minetest.clear_registered_decorations() +end +if livingjungle.settings.clear_ores then + minetest.clear_registered_ores() +end + +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +-- plants +dofile(path .. "junglenodes.lua") -- +dofile(path .. "jungleplants.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "leafdecay.lua") -- + + diff --git a/mods/livingjungle/junglenodes.lua b/mods/livingjungle/junglenodes.lua new file mode 100644 index 0000000..c56d7bb --- /dev/null +++ b/mods/livingjungle/junglenodes.lua @@ -0,0 +1,277 @@ +local S = minetest.get_translator("livingjungle") + +local modname = "livingjungle" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + + +minetest.register_biome({ + name = "livingjungle:jungle", + node_top = "livingjungle:jungleground", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 6, + node_riverbed = "default:sand", + depth_riverbed = 3, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 0, + heat_point = 92, + humidity_point = 72, +}) + +-- ground nodes + +minetest.register_node("livingjungle:jungleground", { + description = S("Green Jungle Ground"), + tiles = {"livingjungle_jungleground.png", "default_dirt.png", + {name = "default_dirt.png^livingjungle_jungleground_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("livingjungle:leafyjungleground", { + description = S("Leafy Jungle Ground"), + tiles = {"livingjungle_rainforest_litter.png", "default_dirt.png", + {name = "default_dirt.png^livingjungle_rainforest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"livingjungle:jungleground"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.9, + biomes = {"default:cold_desert", "default:cold_desert_ocean"}, + y_max = 31000, + y_min = 0, + decoration = "livingjungle:leafyjungleground" + }) + +--- rocks + +minetest.register_node("livingjungle:mossstone", { + description = S("Mossy Stone"), + tiles = {"livingjungle_mossstone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingjungle:mossstone", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingjungle:mossstone2", { + description = S("Mossy Stone"), + tiles = {"livingjungle_mossstone2.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingjungle:mossstone2", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("livingjungle:mossstone3", { + description = S("Mossy Stone"), + tiles = {"livingjungle_mossstone3.png"}, + groups = {cracky = 3, stone = 1}, + drop = "livingjungle:mossstone3", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "livingjungle:mossstone", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle") .. "/schematics/livingjungle_mossyrock.mts", + flags = "place_center_x, place_center_z", + spawn_by = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + rotation = "random", + }) + +minetest.register_decoration({ + name = "livingjungle:mossstone2", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle") .. "/schematics/livingjungle_mossyrock2.mts", + flags = "place_center_x, place_center_z", + spawn_by = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + rotation = "random", + }) + +minetest.register_decoration({ + name = "livingjungle:mossstone3", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle") .. "/schematics/livingjungle_mossyrock3.mts", + flags = "place_center_x, place_center_z", + spawn_by = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + rotation = "random", + }) + +--- crafting + +walls.register(":livingjungle:mossstonebrick_wall", S"Jungle Brick Wall", "livingjungle_stonebricks.png", + "livingjungle:mossstonebrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingjungle_stonebricks", + "livingjungle:mossstonebrick", + {cracky = 1, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingjungle_stonebricks.png"}, + S("Jungle Brick Stair"), + S("Jungle Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("livingjungle:mossstonebrick", { + description = S("Jungle Brick"), + tiles = {"livingjungle_stonebricks.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick", + type = "shapeless", + recipe = + {"livingjungle:mossstone"} + + +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick_wall", + type = "shapeless", + recipe = + {"livingjungle:mossstonebrick"} + + +}) + +walls.register(":livingjungle:mossstonebrick_wall2", S"Jungle Brick Wall", "livingjungle_stonebricks2.png", + "livingjungle:mossstonebrick_wall2", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingjungle_stonebricks2", + "livingjungle:mossstonebrick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingjungle_stonebricks2.png"}, + S("Jungle Brick Stair"), + S("Jungle Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("livingjungle:mossstonebrick2", { + description = S("Jungle Brick"), + tiles = {"livingjungle_stonebricks2.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick2", + type = "shapeless", + recipe = + {"livingjungle:mossstone2"} + + +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick_wall2", + type = "shapeless", + recipe = + {"livingjungle:mossstonebrick2"} + + +}) + +walls.register(":livingjungle:mossstonebrick_wall3", S"Jungle Brick Wall", "livingjungle_stonebricks3.png", + "livingjungle:mossstonebrick_wall3", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "livingjungle_stonebricks3", + "livingjungle:mossstonebrick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"livingjungle_stonebricks3.png"}, + S("Jungle Brick Stair"), + S("Jungle Brick Slab"), + default.node_sound_wood_defaults() + ) + +minetest.register_node("livingjungle:mossstonebrick3", { + description = S("Jungle Brick"), + tiles = {"livingjungle_stonebricks3.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick3", + type = "shapeless", + recipe = + {"livingjungle:mossstone3"} + + +}) + +minetest.register_craft({ + output = "livingjungle:mossstonebrick_wall3", + type = "shapeless", + recipe = + {"livingjungle:mossstonebrick3"} + + +}) + diff --git a/mods/livingjungle/jungleplants.lua b/mods/livingjungle/jungleplants.lua new file mode 100644 index 0000000..6831526 --- /dev/null +++ b/mods/livingjungle/jungleplants.lua @@ -0,0 +1,727 @@ +local S = minetest.get_translator("livingjungle") + +local modname = "livingjungle" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- grass + + minetest.register_decoration({ + name = "livingjungle:grass1", + deco_type = "simple", + place_on = {"livingjungle:jungleground"}, + sidelen = 16, + fill_ratio = 0.115, + y_max = 31000, + y_min = 2, + decoration = "livingjungle:grass1", + }) + +minetest.register_node("livingjungle:grass1", { + description = S"Jungle Bushplant", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_junglegrass.png"}, + inventory_image = "livingjungle_junglegrass.png", + wield_image = "livingjungle_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingjungle:grass2", + deco_type = "simple", + place_on = {"livingjungle:jungleground"}, + sidelen = 16, + fill_ratio = 0.115, + y_max = 31000, + y_min = 2, + decoration = "livingjungle:grass2", + }) + +minetest.register_node("livingjungle:grass2", { + description = S"Jungle Fern", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_junglefern.png"}, + inventory_image = "livingjungle_junglefern.png", + wield_image = "livingjungle_junglefern.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +--- decor plants + +minetest.register_node("livingjungle:alocasia", { + description = S"Alocasia Bush", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_alocasia.png"}, + inventory_image = "livingjungle_alocasia.png", + wield_image = "livingjungle_alocasia.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingjungle:livingjungle:alocasia", + deco_type = "simple", + place_on = {"livingjungle:leafyjungleground"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.08, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 0.9, + }, + y_max = 31000, + y_min = 1, + decoration = "livingjungle:alocasia", + }) + +minetest.register_node("livingjungle:flamingoflower", { + description = S"Flamingo Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"livingjungle_flamingoflower.png"}, + inventory_image = "livingjungle_flamingoflower.png", + wield_image = "livingjungle_flamingoflower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "livingjungle:flamingoflower", + deco_type = "simple", + place_on = {"livingjungle:leafyjungleground"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.08, + spread = {x = 100, y = 100, z = 100}, + seed = 722, + octaves = 7, + persist = 0.9, + }, + y_max = 31000, + y_min = 1, + decoration = "livingjungle:flamingoflower", + }) + + +minetest.register_node("livingjungle:stinkflower_core", { + description = S("Stinkflower"), + tiles = { + "livingjungle_stinkflower_middle.png", + "livingjungle_stinkflower_middle.png", + "livingjungle_stinkflower_middle.png" + }, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingjungle:stinkflower_leaf", { + description = S("Stinkflower Leaf"), + tiles = { + "livingjungle_stinkflower_side.png", + "livingjungle_stinkflower_side.png", + "livingjungle_stinkflower_side.png" + }, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"livingjungle:jungleground"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 111, + octaves = 3, + persist = 0.8, + }, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/stinkflower.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + +--- trees + +-- New giantforest paleo samauma tree + +local function grow_new_samauma_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 13, y = pos.y - 0, z = pos.z - 13}, modpath.."/schematics/samauma_tree.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"livingjungle:samauma_sapling", grow_new_samauma_tree, "soil"}, +}) +end + +-- samauma trunk +minetest.register_node("livingjungle:samauma_trunk", { + description = S("Samauma Trunk"), + tiles = { + "livingjungle_samauma_trunk_top.png", + "livingjungle_samauma_trunk_top.png", + "livingjungle_samauma_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- paleo samauma wood +minetest.register_node("livingjungle:samauma_wood", { + description = S("Samauma Wood"), + tiles = {"livingjungle_samauma_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "livingjungle:samauma_wood 4", + recipe = {{"livingjungle:samauma_trunk"}} +}) + +minetest.register_node("livingjungle:samauma_leaves", { + description = S("Samauma Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingjungle_samauma_leaves.png"}, + special_tiles = {"livingjungle_samauma_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'livingjungle:samauma_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'livingjungle:samauma_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("livingjungle:samauma_sapling", { + description = S("Samauma Sapling"), + drawtype = "plantlike", + tiles = {"livingjungle_samauma_sapling.png"}, + inventory_image = "livingjungle_samauma_sapling.png", + wield_image = "livingjungle_samauma_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_samauma_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "livingjungle:samauma_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "livingjungle_samauma_wood", + "livingjungle:samauma_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingjungle_samauma_wood.png"}, + S("Samauma Stair"), + S("Samauma Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "livingjungle_samauma_trunk", + "livingjungle:samauma_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"livingjungle_samauma_trunk_top.png", "livingjungle_samauma_trunk_top.png", "livingjungle_samauma_trunk.png"}, + S("Samauma Trunk Stair"), + S("Samauma Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "livingjungle:gate_samauma_wood", + { + description = S("Samauma Wood Fence Gate"), + texture = "livingjungle_samauma_wood.png", + material = "livingjungle:samauma_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "livingjungle:fence_samauma_wood", + { + description = S("Samauma Fence"), + texture = "livingjungle_samauma_fencewood.png", + inventory_image = "default_fence_overlay.png^livingjungle_samauma_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^livingjungle_samauma_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "livingjungle:samauma_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "livingjungle:fence_rail_samauma_wood", + { + description = S("Samauma Fence Rail"), + texture = "livingjungle_samauma_fencewood.png", + inventory_image = "default_fence_rail_overlay.png^livingjungle_samauma_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^livingjungle_samauma_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "livingjungle:samauma_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree2", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree3", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00935, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree11", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree11.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree22", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00095, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree22.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:samauma_tree33", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00935, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("livingjungle").."/schematics/samauma_tree33.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + +minetest.register_node("livingjungle:lianabranch", { + description = S("Liana Branch"), + drawtype = "plantlike", + waving = 1, + tiles = {"livingjungle_liana_branch.png"}, + inventory_image = "livingjungle_liana_branch.png", + wield_image = "livingjungle_liana_branch.png", + paramtype = "light", + sunlight_propagates = true, + climbable = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2, winleafdecay = 3}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingjungle:lianabranch3", { + description = S("Liana Branch"), + drawtype = "raillike", + waving = 1, + tiles = {"livingjungle_liana_branch3.png"}, + inventory_image = "livingjungle_liana_branch3.png", + wield_image = "livingjungle_liana_branch3.png", + paramtype = "light", + sunlight_propagates = true, + climbable = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2, winleafdecay = 3}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingjungle:lianaleaves", { + description = S("Liana Leaves"), + drawtype = "plantlike", + waving = 1, + tiles = {"livingjungle_liana_leaves.png"}, + inventory_image = "livingjungle_liana_leaves.png", + wield_image = "livingjungle_liana_leaves.png", + paramtype = "light", + sunlight_propagates = true, + climbable = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2, winleafdecay = 3}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + + + +minetest.register_node("livingjungle:liana_stem", { + description = S("Liana Stem"), + tiles = { + "livingjungle_liana_stem.png", + "livingjungle_liana_stem.png", + "livingjungle_liana_stem.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +--- mangroves + +minetest.register_node("livingjungle:mangrove_root", { + description = S("Mangrove Root"), + drawtype = "plantlike_rooted", + waving = 0, + paramtype = "light", + tiles = {"default_sand.png"}, + special_tiles = {{name = "livingjungle_mangrove_root.png", tileable_vertical = true}}, + inventory_image = "livingjungle_mangrove_root.png", + wield_image = "livingjungle_mangrove_root.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end, +}) + +minetest.register_node("livingjungle:mangrove_root2", { + description = S("Mangrove Air Roots"), + drawtype = "plantlike", + waving = 0, + tiles = {"livingjungle_mangrove_root.png"}, + inventory_image = "livingjungle_mangrove_root.png", + wield_image = "livingjungle_mangrove_root.png", + paramtype = "light", + sunlight_propagates = true, + + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("livingjungle:mangrove_stem", { + description = S("Mangrove Stem"), + tiles = { + "livingjungle_mangrove_stem.png", + "livingjungle_mangrove_stem.png", + "livingjungle_mangrove_stem.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_node("livingjungle:mangrove_leaves", { + description = S("Mangrove Leaves"), + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"livingjungle_mangrove_leaves.png"}, + special_tiles = {"livingjungle_mangrove_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.010, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"default:rainforest_ocean", "livingjungle:jungle"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree2", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground", "default:dirt"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"default:rainforest_ocean", "livingjungle:jungle"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree2.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree2", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground", "default:dirt"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"default:rainforest_ocean", "livingjungle:jungle"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree2.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "livingjungle:mangrovetree3", + deco_type = "schematic", + place_on = {"livingjungle:leafyjungleground", "livingjungle:jungleground", "default:dirt"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.0, + scale = 0.019, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 0, + y_min = 0, + biomes = {"default:rainforest_ocean", "livingjungle:jungle"}, + schematic = minetest.get_modpath("livingjungle").."/schematics/livingjungle_mangrovetree3.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", +}) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingjungle:jungleground", {"livingjungle:grass1", "livingjungle:grass2", "livingjungle:alocasia", "livingjungle:flamingoflower"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"livingjungle:leafyjungleground", {"livingjungle:grass1", "livingjungle:grass2", "livingjungle:alocasia", "livingjungle:flamingoflower"}, {}} + }) +end + diff --git a/mods/livingjungle/leafdecay.lua b/mods/livingjungle/leafdecay.lua new file mode 100644 index 0000000..d2ca944 --- /dev/null +++ b/mods/livingjungle/leafdecay.lua @@ -0,0 +1,18 @@ + +default.register_leafdecay({ + trunks = {"livingjungle:samauma_trunk"}, + leaves = {"livingjungle:samauma_leaves", "livingjungle:lianaleaves", "livingjungle:lianabranch", "livingjungle:lianabranch3"}, + radius = 9 +}) + +default.register_leafdecay({ + trunks = {"livingjungle:liana_stem"}, + leaves = {"livingjungle:lianaleaves", "livingjungle:lianabranch", "livingjungle:lianabranch3"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"livingjungle:mangrove_root2", "livingjungle:mangrove_stem"}, + leaves = {"livingjungle:mangrove_leaves"}, + radius = 5 +}) \ No newline at end of file diff --git a/mods/livingjungle/locale/livingjungle.de.tr b/mods/livingjungle/locale/livingjungle.de.tr new file mode 100644 index 0000000..18d7e2d --- /dev/null +++ b/mods/livingjungle/locale/livingjungle.de.tr @@ -0,0 +1,35 @@ +# textdomain: livingjungle + +Green Jungle Ground=Grüner Dschungelboden +Leafy Jungle Ground=Dschungelboden mit Laub +Mossy Stone=Moosiger Stein +Jungle Brick Wall=Dschungelziegel Mauer +Jungle Brick Stair=Dschungelziegel Treppe +Jungle Brick Slab=Dschungelziegel Platte +Jungle Brick=Dschungelziegel +Jungle Bushplant=Dschungel Buschpflanze +Jungle Fern=Dschungelfarn +Alocasia Bush=Alokasie +Flamingo Flower=Flamingoblume +Stinkflower=Rafflesie +Stinkflower Leaf=Rafflesienblatt +Samauma Trunk=Samauma Stamm +Samauma Wood=Samauma Holz +Samauma Leaves=Samauma Blätter +Samauma Sapling=Samauma Setzling +Samauma Stair=Samauma Holztreppe +Samauma Slab=Samauma Holzplatte +Samauma Trunk Stair=Samauma Stamm Treppe +Samauma Trunk Slab=Samauma Stamm Platte +Samauma Wood Fence Gate=Samauma Holzzauntor +Samauma Fence=Samauma Zaun +Samauma Fence Rail=Samauma Geländer +Liana Branch=Liane +Liana Leaves=Lianenblätter +Liana Stem=Lianen Stamm +Mangrove Root=Mangrovenwurzeln +Mangrove Air Roots=Mangroven Luftwurzeln +Mangrove Stem=Mangrovenstamm +Mangrove Leaves=Mangrovenblätter +Samauma Trapdoor=Samauma Falltür +Samauma Door=Samauma Tür \ No newline at end of file diff --git a/mods/livingjungle/mod.conf b/mods/livingjungle/mod.conf new file mode 100644 index 0000000..2de7483 --- /dev/null +++ b/mods/livingjungle/mod.conf @@ -0,0 +1,4 @@ +name = livingjungle +depends = default, stairs, doors +optional_depends = bonemeal +description = adds a new type of jungle biome to minetest game. \ No newline at end of file diff --git a/mods/livingjungle/schematics/livingjungle_mangrovetree.mts b/mods/livingjungle/schematics/livingjungle_mangrovetree.mts new file mode 100644 index 0000000..84881c7 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mangrovetree.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mangrovetree2.mts b/mods/livingjungle/schematics/livingjungle_mangrovetree2.mts new file mode 100644 index 0000000..0fad85d Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mangrovetree2.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mangrovetree3.mts b/mods/livingjungle/schematics/livingjungle_mangrovetree3.mts new file mode 100644 index 0000000..c107071 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mangrovetree3.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mossyrock.mts b/mods/livingjungle/schematics/livingjungle_mossyrock.mts new file mode 100644 index 0000000..048ef19 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mossyrock.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mossyrock2.mts b/mods/livingjungle/schematics/livingjungle_mossyrock2.mts new file mode 100644 index 0000000..77ec1f6 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mossyrock2.mts differ diff --git a/mods/livingjungle/schematics/livingjungle_mossyrock3.mts b/mods/livingjungle/schematics/livingjungle_mossyrock3.mts new file mode 100644 index 0000000..6093c70 Binary files /dev/null and b/mods/livingjungle/schematics/livingjungle_mossyrock3.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree.lua b/mods/livingjungle/schematics/samauma_tree.lua new file mode 100644 index 0000000..b3b80c0 --- /dev/null +++ b/mods/livingjungle/schematics/samauma_tree.lua @@ -0,0 +1,23025 @@ +schematic = { + size = {x=26, y=34, z=26}, + yslice_prob = { + {ypos=0, prob=254}, + {ypos=1, prob=254}, + {ypos=2, prob=254}, + {ypos=3, prob=254}, + {ypos=4, prob=254}, + {ypos=5, prob=254}, + {ypos=6, prob=254}, + {ypos=7, prob=254}, + {ypos=8, prob=254}, + {ypos=9, prob=254}, + {ypos=10, prob=254}, + {ypos=11, prob=254}, + {ypos=12, prob=254}, + {ypos=13, prob=254}, + {ypos=14, prob=254}, + {ypos=15, prob=254}, + {ypos=16, prob=254}, + {ypos=17, prob=254}, + {ypos=18, prob=254}, + {ypos=19, prob=254}, + {ypos=20, prob=254}, + {ypos=21, prob=254}, + {ypos=22, prob=254}, + {ypos=23, prob=254}, + {ypos=24, prob=254}, + {ypos=25, prob=254}, + {ypos=26, prob=254}, + {ypos=27, prob=254}, + {ypos=28, prob=254}, + {ypos=29, prob=254}, + {ypos=30, prob=254}, + {ypos=31, prob=254}, + {ypos=32, prob=254}, + {ypos=33, prob=254}, + }, + data = { + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=9}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=18}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_trunk", prob=254, param2=12}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=3}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_trunk", prob=254, param2=2}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_trunk", prob=254, param2=7}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="livingjungle:samauma_leaves", prob=254, param2=1}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + {name="air", prob=0, param2=0}, + }, +} diff --git a/mods/livingjungle/schematics/samauma_tree.mts b/mods/livingjungle/schematics/samauma_tree.mts new file mode 100644 index 0000000..6591ba8 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree11.mts b/mods/livingjungle/schematics/samauma_tree11.mts new file mode 100644 index 0000000..19255e0 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree11.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree2.mts b/mods/livingjungle/schematics/samauma_tree2.mts new file mode 100644 index 0000000..1153889 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree2.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree22.mts b/mods/livingjungle/schematics/samauma_tree22.mts new file mode 100644 index 0000000..963c2a0 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree22.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree3.mts b/mods/livingjungle/schematics/samauma_tree3.mts new file mode 100644 index 0000000..8ea71f4 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree3.mts differ diff --git a/mods/livingjungle/schematics/samauma_tree33.mts b/mods/livingjungle/schematics/samauma_tree33.mts new file mode 100644 index 0000000..6074557 Binary files /dev/null and b/mods/livingjungle/schematics/samauma_tree33.mts differ diff --git a/mods/livingjungle/schematics/stinkflower.mts b/mods/livingjungle/schematics/stinkflower.mts new file mode 100644 index 0000000..f35667d Binary files /dev/null and b/mods/livingjungle/schematics/stinkflower.mts differ diff --git a/mods/livingjungle/screenshot.png b/mods/livingjungle/screenshot.png new file mode 100644 index 0000000..da774ae Binary files /dev/null and b/mods/livingjungle/screenshot.png differ diff --git a/mods/livingjungle/textures/livingjungle_alocasia.png b/mods/livingjungle/textures/livingjungle_alocasia.png new file mode 100644 index 0000000..990ca48 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_alocasia.png differ diff --git a/mods/livingjungle/textures/livingjungle_bromeliad.png b/mods/livingjungle/textures/livingjungle_bromeliad.png new file mode 100644 index 0000000..2fb606e Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_bromeliad.png differ diff --git a/mods/livingjungle/textures/livingjungle_bromeliad2.png b/mods/livingjungle/textures/livingjungle_bromeliad2.png new file mode 100644 index 0000000..8f74825 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_bromeliad2.png differ diff --git a/mods/livingjungle/textures/livingjungle_bromeliad3.png b/mods/livingjungle/textures/livingjungle_bromeliad3.png new file mode 100644 index 0000000..9e4f076 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_bromeliad3.png differ diff --git a/mods/livingjungle/textures/livingjungle_flamingoflower.png b/mods/livingjungle/textures/livingjungle_flamingoflower.png new file mode 100644 index 0000000..0b492e4 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_flamingoflower.png differ diff --git a/mods/livingjungle/textures/livingjungle_item_samauma_door.png b/mods/livingjungle/textures/livingjungle_item_samauma_door.png new file mode 100644 index 0000000..e0054fa Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_item_samauma_door.png differ diff --git a/mods/livingjungle/textures/livingjungle_junglefern.png b/mods/livingjungle/textures/livingjungle_junglefern.png new file mode 100644 index 0000000..45ddce9 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_junglefern.png differ diff --git a/mods/livingjungle/textures/livingjungle_junglegrass.png b/mods/livingjungle/textures/livingjungle_junglegrass.png new file mode 100644 index 0000000..38be525 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_junglegrass.png differ diff --git a/mods/livingjungle/textures/livingjungle_jungleground.png b/mods/livingjungle/textures/livingjungle_jungleground.png new file mode 100644 index 0000000..604fac1 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_jungleground.png differ diff --git a/mods/livingjungle/textures/livingjungle_jungleground_side.png b/mods/livingjungle/textures/livingjungle_jungleground_side.png new file mode 100644 index 0000000..2407b71 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_jungleground_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_branch.png b/mods/livingjungle/textures/livingjungle_liana_branch.png new file mode 100644 index 0000000..ec33235 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_branch.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_branch3.png b/mods/livingjungle/textures/livingjungle_liana_branch3.png new file mode 100644 index 0000000..ca5893a Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_branch3.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_leaves.png b/mods/livingjungle/textures/livingjungle_liana_leaves.png new file mode 100644 index 0000000..c483718 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_leaves.png differ diff --git a/mods/livingjungle/textures/livingjungle_liana_stem.png b/mods/livingjungle/textures/livingjungle_liana_stem.png new file mode 100644 index 0000000..20dd63a Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_liana_stem.png differ diff --git a/mods/livingjungle/textures/livingjungle_mangrove_leaves.png b/mods/livingjungle/textures/livingjungle_mangrove_leaves.png new file mode 100644 index 0000000..615ac83 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mangrove_leaves.png differ diff --git a/mods/livingjungle/textures/livingjungle_mangrove_root.png b/mods/livingjungle/textures/livingjungle_mangrove_root.png new file mode 100644 index 0000000..b68eace Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mangrove_root.png differ diff --git a/mods/livingjungle/textures/livingjungle_mangrove_stem.png b/mods/livingjungle/textures/livingjungle_mangrove_stem.png new file mode 100644 index 0000000..49205f4 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mangrove_stem.png differ diff --git a/mods/livingjungle/textures/livingjungle_mossstone.png b/mods/livingjungle/textures/livingjungle_mossstone.png new file mode 100644 index 0000000..4c58eaf Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mossstone.png differ diff --git a/mods/livingjungle/textures/livingjungle_mossstone2.png b/mods/livingjungle/textures/livingjungle_mossstone2.png new file mode 100644 index 0000000..12ce949 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mossstone2.png differ diff --git a/mods/livingjungle/textures/livingjungle_mossstone3.png b/mods/livingjungle/textures/livingjungle_mossstone3.png new file mode 100644 index 0000000..067739a Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_mossstone3.png differ diff --git a/mods/livingjungle/textures/livingjungle_rainforest_litter.png b/mods/livingjungle/textures/livingjungle_rainforest_litter.png new file mode 100644 index 0000000..cc6a946 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_rainforest_litter.png differ diff --git a/mods/livingjungle/textures/livingjungle_rainforest_litter_side.png b/mods/livingjungle/textures/livingjungle_rainforest_litter_side.png new file mode 100644 index 0000000..ae4f615 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_rainforest_litter_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_door.png b/mods/livingjungle/textures/livingjungle_samauma_door.png new file mode 100644 index 0000000..13e4ddc Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_door.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_fencewood.png b/mods/livingjungle/textures/livingjungle_samauma_fencewood.png new file mode 100644 index 0000000..e480c6f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_fencewood.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_leaves.png b/mods/livingjungle/textures/livingjungle_samauma_leaves.png new file mode 100644 index 0000000..898884d Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_leaves.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_sapling.png b/mods/livingjungle/textures/livingjungle_samauma_sapling.png new file mode 100644 index 0000000..6bb9cb9 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_sapling.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_trapdoor.png b/mods/livingjungle/textures/livingjungle_samauma_trapdoor.png new file mode 100644 index 0000000..ede8a29 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_trapdoor.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_trapdoor_side.png b/mods/livingjungle/textures/livingjungle_samauma_trapdoor_side.png new file mode 100644 index 0000000..67f0343 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_trapdoor_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_trunk.png b/mods/livingjungle/textures/livingjungle_samauma_trunk.png new file mode 100644 index 0000000..a8ee45e Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_trunk.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_trunk_top.png b/mods/livingjungle/textures/livingjungle_samauma_trunk_top.png new file mode 100644 index 0000000..17da4cb Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_trunk_top.png differ diff --git a/mods/livingjungle/textures/livingjungle_samauma_wood.png b/mods/livingjungle/textures/livingjungle_samauma_wood.png new file mode 100644 index 0000000..6593b80 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_samauma_wood.png differ diff --git a/mods/livingjungle/textures/livingjungle_stinkflower_middle.png b/mods/livingjungle/textures/livingjungle_stinkflower_middle.png new file mode 100644 index 0000000..590353f Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stinkflower_middle.png differ diff --git a/mods/livingjungle/textures/livingjungle_stinkflower_side.png b/mods/livingjungle/textures/livingjungle_stinkflower_side.png new file mode 100644 index 0000000..4ac5a14 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stinkflower_side.png differ diff --git a/mods/livingjungle/textures/livingjungle_stonebricks.png b/mods/livingjungle/textures/livingjungle_stonebricks.png new file mode 100644 index 0000000..c614d41 Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stonebricks.png differ diff --git a/mods/livingjungle/textures/livingjungle_stonebricks2.png b/mods/livingjungle/textures/livingjungle_stonebricks2.png new file mode 100644 index 0000000..c47017b Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stonebricks2.png differ diff --git a/mods/livingjungle/textures/livingjungle_stonebricks3.png b/mods/livingjungle/textures/livingjungle_stonebricks3.png new file mode 100644 index 0000000..36d98ab Binary files /dev/null and b/mods/livingjungle/textures/livingjungle_stonebricks3.png differ diff --git a/mods/lumpblocks/.gitignore b/mods/lumpblocks/.gitignore new file mode 100644 index 0000000..7f983c9 --- /dev/null +++ b/mods/lumpblocks/.gitignore @@ -0,0 +1,2 @@ +*.zip +doc/ diff --git a/mods/lumpblocks/CHANGELOG.md b/mods/lumpblocks/CHANGELOG.md new file mode 100644 index 0000000..89b618d --- /dev/null +++ b/mods/lumpblocks/CHANGELOG.md @@ -0,0 +1,41 @@ +Raw Ore Blocks Changelog +======================== + +0.3.0 (2026-01-07) +------------------ + +- Added Silver support. +- Added Elepower support (requested by Opons). +- Added Terumet support (requested by Opons). +- Fixed an issue with using the API from other mods. +- Fixed sounds being copied from groups (contributed by programmerjake). +- Added supported games to mod.conf. +- Changed the registration API from `lumpblocks.register_lump_block{name, ...options}` to `lumpblocks.register_lump_block(name, {...options})`. + The old version is still available but deprecated. +- The `def` field can now override fields defined by Raw Ore Blocks. + + +0.2.0 (2022-11-16) +------------------ + +- Added Repixture support. +- Added Techage support. +- Added sounds. + + +0.1.0 (2022-11-04) +------------------ + +- Improved textures. +- Redesigned colouring system. +- Various code improvements. +- Added Glooptest support. +- Added Nether support. +- Improved item descriptions. +- Uranium is now radioactive. + + +0.0.0 (2022-10-30) +------------------ + +- Added everything. diff --git a/mods/lumpblocks/LICENCE.md b/mods/lumpblocks/LICENCE.md new file mode 100644 index 0000000..82c1e16 --- /dev/null +++ b/mods/lumpblocks/LICENCE.md @@ -0,0 +1,49 @@ +Raw Ore Blocks Licence +====================== + +Licence of Code +--------------- + +- `init.lua` +- `api.lua` +- `definitions.lua` + - Copyright © 2022-2026, [Silver Sandstone] <@SilverSandstone@craftodon.social> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + +Licence of Assets +----------------- + +- `lumpblocks_lump_block.png` +- `lumpblocks_lump_block_mask.png` +- `lumpblocks_lump_block_mask.xcf` + - Based on `moreblocks_iron_stone.png` from [RPG16] by [Hugues Alexandre Ross], + licensed under the [Creative Commons Attribution-ShareAlike 4.0 International Licence][CC BY-SA 4.0]. + - Modifications: + - Blurred. + - Converted to greyscale/alpha. + + +[Silver Sandstone]: https://content.luanti.org/users/SilverSandstone/ "Silver Sandstone on Luanti ContentDB" +[Hugues Alexandre Ross]: https://huguesross.net "Hugues Alexandre Ross" + +[RPG16]: https://content.luanti.org/packages/Hugues%20Ross/rpg16/ "RPG16 on Luanti ContentDB" + +[CC BY-SA 4.0]: https://creativecommons.org/licenses/by-sa/4.0/ "Creative Commons Attribution-ShareAlike 4.0 International" diff --git a/mods/lumpblocks/README.md b/mods/lumpblocks/README.md new file mode 100644 index 0000000..e09f68c --- /dev/null +++ b/mods/lumpblocks/README.md @@ -0,0 +1,40 @@ +Raw Ore Blocks +============== + +[ContentDB](https://content.luanti.org/packages/SilverSandstone/lumpblocks/) · +[Codeberg](https://codeberg.org/SilverSandstone/lumpblocks) + + +Raw Ore Blocks adds compressed block forms of metal lumps. +These blocks can be used for efficient storage of raw ores, or decoration. + +Nine lumps can be crafted into a block, and a block can be crafted back into nine lumps. + + +Compatibility +------------- + +Supported games: + +- Dreambuilder +- Mesecraft +- Minetest +- Repixture + +Supported mods: + +- Elepower +- Glooptest +- More Ores +- Nether +- Techage +- Technic +- Terumet + + +Licence +------- + +Raw Ore Blocks is licensed under the MIT licence, with assets under CC BY-SA 4.0. + +See `LICENCE.md` for more information. diff --git a/mods/lumpblocks/api.lua b/mods/lumpblocks/api.lua new file mode 100644 index 0000000..6e23da4 --- /dev/null +++ b/mods/lumpblocks/api.lua @@ -0,0 +1,202 @@ +--[[ + Raw Ore Blocks — adds block forms of metal lumps to Luanti + Copyright © 2022-2026, Silver Sandstone <@SilverSandstone@craftodon.social> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +]] + + +--- Public API functions. +-- @module api + + +local S = core.get_translator('lumpblocks'); + + +local get_sounds; +if core.get_modpath('default') then + get_sounds = default.node_sound_metal_defaults or default.node_sound_stone_defaults; +elseif core.get_modpath('mcl_sounds') then + get_sounds = mcl_sounds.node_sounds_metal_defaults; +elseif core.get_modpath('rp_sounds') then + get_sounds = rp_sounds.node_sound_defaults; +end; + +if not get_sounds then + function get_sounds(sounds) + return sounds or {}; + end; +end; + + +local function update(dest, ...) + for index = 1, select('#', ...) do + local src = select(index, ...); + if src then + for key, value in pairs(src) do + dest[key] = value; + end; + end; + end; + return dest; +end; + + +--- Registers a raw ore block. +-- @param name [string] The name of the raw ore block to register. +-- @param options [table] A table of options. +-- @param options.lump [string] The name of the lump item. +-- @param options.texture [string] Overrides the node's texture. +-- @param options.light_colour [ColourSpec] The lighter colour of the texture. +-- @param options.dark_colour [ColourSpec] The darker (or only) colour of the texture. +-- @param options.colour [ColourSpec] Alias for `dark_colour`. +-- @param options.colours [ColourSpec[2]] A table of {dark_colour, light_colour}. +-- @param options.description [string] Overrides the node's description. +-- @param options.groups [{string: integer}] Overrides the node's groups. +-- @param options.def [NodeDef] Overrides arbitrary properties of the node's definition. +-- @return [string|nil] The name of the registered node, or nil on failure. +function lumpblocks.register_lump_block(name, options) + if type(name) == 'table' then + options = name; + name = nil; + end; + + local lump_name; + local texture; + local dark_colour; + local light_colour; + local description; + local override; + local groups = {}; + for key, value in pairs(options) do + if key == 'base_name' or key == 1 then + name = ('lumpblocks:%s_block'):format(value); + elseif key == 'lump' or key == 2 then + lump_name = value; + elseif key == 'name' then + name = value; + elseif key == 'texture' then + texture = value; + elseif key == 'dark_colour' or key == 'colour' then + dark_colour = value; + elseif key == 'light_colour' then + light_colour = value; + elseif key == 'colours' then + dark_colour, light_colour = unpack(value); + elseif key == 'description' then + description = value; + elseif key == 'def' then + override = value; + elseif key == 'groups' then + groups = value; + else + core.log('error', ('Invalid key [%q] in lumpblocks.register_lump_block().'):format(key)); + end; + end; + + assert(name, 'No block name specified!'); + assert(lump_name, 'No lump name specified!'); + assert(texture or dark_colour, 'No texture or colour specified!'); + + local lump_def = core.registered_items[lump_name]; + if not lump_def then + return nil; + end; + + local def = {}; + def.description = description or S('@1 Block', lump_def.description); + def.groups = update({cracky = 3, lump_block = 1}, groups); + def.tiles = {texture or lumpblocks.generate_lumpblock_texture(dark_colour, light_colour)}; + def.sounds = update(get_sounds(), options.sounds); + def._doc_items_longdesc = S('A compressed block form of @1 for decoration or efficient storage.', lump_def.description); + + update(def, override); + + core.register_node(':' .. name, def); + + -- Crafting recipes: + core.register_craft( + { + output = name; + recipe = + { + {lump_name, lump_name, lump_name}, + {lump_name, lump_name, lump_name}, + {lump_name, lump_name, lump_name}, + }; + }); + + core.register_craft( + { + type = 'shapeless'; + output = lump_name .. ' 9'; + recipe = {name}; + }); + + if core.get_modpath('rp_crafting') then + crafting.register_craft( + { + output = name; + items = {lump_name .. ' 9'}; + }); + + crafting.register_craft( + { + output = lump_name .. ' 9'; + items = {name}; + }); + end; + + return name; +end; + + +-- Generates a raw ore block texture in the specified colours. +-- @param dark_colour [ColourSpec] The darker (or only) colour. +-- @param light_colour [ColourSpec|nil] The lighter colour. +-- @return [string] A texture string. +function lumpblocks.generate_lumpblock_texture(dark_colour, light_colour) + assert(dark_colour, 'No colour specified!'); + if light_colour then + -- Gradient-based colouring system: + dark_colour = core.colorspec_to_colorstring(dark_colour); + light_colour = core.colorspec_to_colorstring(light_colour); + local mask = 'lumpblocks_lump_block_mask.png'; + return ('(%s^[multiply:#00000000^[invert:a^[colorize:%s:255)^(%s^[multiply:%s)'):format(mask, dark_colour, mask, light_colour); + else + -- Multiplication-based colouring system: + local colour = core.colorspec_to_colorstring(dark_colour); + local inverted = lumpblocks.invert_colour(colour); + local base = 'lumpblocks_lump_block.png'; + return ('((%s^[invert:rgb)^[multiply:%s^[invert:rgb)^(%s^[multiply:%s^[opacity:127)'):format(base, inverted, base, colour); + end; +end; + + +--- Inverts a colour in RGB space. +-- @param colour [ColourSpec] The colour to invert. +-- @return [ColourString] The inverted colour. +function lumpblocks.invert_colour(colour) + local bytes = core.colorspec_to_bytes(colour); + local values = {nil, nil, nil, bytes:byte(4)}; + for index = 1, 3 do + values[index] = 255 - bytes:byte(index); + end; + return ('#%02X%02X%02X%02X'):format(unpack(values)); +end; diff --git a/mods/lumpblocks/definitions.lua b/mods/lumpblocks/definitions.lua new file mode 100644 index 0000000..fb0251d --- /dev/null +++ b/mods/lumpblocks/definitions.lua @@ -0,0 +1,252 @@ +--[[ + Raw Ore Blocks — adds block forms of metal lumps to Luanti + Copyright © 2022-2026, Silver Sandstone <@SilverSandstone@craftodon.social> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +]] + + +--- Block definitions. +-- @module definitions + + +local S = core.get_translator('lumpblocks'); + + +-- Minetest: +lumpblocks.register_lump_block('lumpblocks:copper_block', +{ + lump = 'default:copper_lump'; + description = S'Raw Copper Block'; + colours = {'#973F23', '#F4D352'}; +}); + +lumpblocks.register_lump_block('lumpblocks:gold_block', +{ + lump = 'default:gold_lump'; + description = S'Raw Gold Block'; + colours = {'#BD4B00', '#FFF444'}; +}); + +lumpblocks.register_lump_block('lumpblocks:iron_block', +{ + lump = 'default:iron_lump'; + description = S'Raw Iron Block'; + colours = {'#7F3E24', '#D47F4E'}; +}); + +lumpblocks.register_lump_block('lumpblocks:tin_block', +{ + lump = 'default:tin_lump'; + description = S'Raw Tin Block'; + colours = {'#878787', '#C3C3C3'}; +}); + +-- Repixture: +lumpblocks.register_lump_block('lumpblocks:bronze_block', +{ + lump = 'rp_default:lump_bronze'; + description = S'Raw Bronze Block'; + colours = {'#B13F07', '#FBA24F'}; +}); + +lumpblocks.register_lump_block('lumpblocks:copper_block', +{ + lump = 'rp_default:lump_copper'; + description = S'Raw Copper Block'; + colours = {'#973F23', '#F4D352'}; +}); + +lumpblocks.register_lump_block('lumpblocks:iron_block', +{ + lump = 'rp_default:lump_iron'; + description = S'Raw Iron Block'; + colours = {'#7F3E24', '#D47F4E'}; +}); + +lumpblocks.register_lump_block('lumpblocks:tin_block', +{ + lump = 'rp_default:lump_tin'; + description = S'Raw Tin Block'; + colours = {'#878787', '#C3C3C3'}; +}); + +lumpblocks.register_lump_block('lumpblocks:gold_block', +{ + lump = 'rp_gold:lump_gold'; + description = S'Raw Gold Block'; + colours = {'#BD4B00', '#FFF444'}; +}); + +-- More Ores: +lumpblocks.register_lump_block('lumpblocks:mithril_block', +{ + lump = 'moreores:mithril_lump'; + description = S'Raw Mithril Block'; + colours = {'#1C2D7E', '#806DD5'}; +}); + +lumpblocks.register_lump_block('lumpblocks:silver_block', +{ + lump = 'moreores:silver_lump'; + description = S'Raw Silver Block'; + colours = {'#7488AA', '#F4F8FD'}; +}); + +-- Technic: +lumpblocks.register_lump_block('lumpblocks:chromium_block', +{ + lump = 'technic:chromium_lump'; + description = S'Raw Chromium Block'; + colours = {'#8AB0B0', '#F5F8F8'}; +}); + +lumpblocks.register_lump_block('lumpblocks:lead_block', +{ + lump = 'technic:lead_lump'; + description = S'Raw Lead Block'; + colours = {'#454545', '#EBEBEB'}; +}); + +lumpblocks.register_lump_block('lumpblocks:sulfur_block', +{ + lump = 'technic:sulfur_lump'; + description = S'Raw Sulphur Block'; + colours = {'#B69A00', '#FFE400'}; +}); + +lumpblocks.register_lump_block('lumpblocks:uranium_block', +{ + lump = 'technic:uranium_lump'; + description = S'Raw Uranium Block'; + colours = {'#00592A', '#99ED1A'}; + groups = {radioactive = 1}; +}); + +lumpblocks.register_lump_block('lumpblocks:zinc_block', +{ + lump = 'technic:zinc_lump'; + description = S'Raw Zinc Block'; + colours = {'#6CB5C9', '#DCF2F8'}; +}); + +-- Nether: +lumpblocks.register_lump_block('lumpblocks:nether_block', +{ + lump = 'nether:nether_lump'; + description = S'Raw Nether Block'; + colours = {'#586628', '#AEBF72'}; +}); + +-- Glooptest: +lumpblocks.register_lump_block('lumpblocks:akalin_block', +{ + lump = 'glooptest:akalin_lump'; + description = S'Raw Akalin Block'; + colours = {'#8A84C6', '#A5B4EB'}; +}); + +lumpblocks.register_lump_block('lumpblocks:alatro_block', +{ + lump = 'glooptest:alatro_lump'; + description = S'Raw Alatro Block'; + colours = {'#4B1778', '#C290EC'}; +}); + +lumpblocks.register_lump_block('lumpblocks:arol_block', +{ + lump = 'glooptest:arol_lump'; + description = S'Raw Arol Block'; + colours = {'#197115', '#84D97D'}; +}); + +lumpblocks.register_lump_block('lumpblocks:kalite_block', +{ + lump = 'glooptest:kalite_lump'; + description = S'Raw Kalite Block'; + colours = {'#700000', '#B90000'}; +}); + +lumpblocks.register_lump_block('lumpblocks:talinite_block', +{ + lump = 'glooptest:talinite_lump'; + description = S'Raw Talinite Block'; + colours = {'#259496', '#42D5D7'}; + def = {light_source = 6}; +}); + +-- Techage: +lumpblocks.register_lump_block('lumpblocks:baborium_block', +{ + lump = 'techage:baborium_lump'; + description = S'Raw Baborium Block'; + colours = {'#6D1414', '#D4691A'}; +}); + +-- Silver: +lumpblocks.register_lump_block('lumpblocks:silver_block', +{ + lump = 'silver:silver_lump'; + description = S'Raw Silver Block'; + colours = {'#746E6E', '#DDDDDD'}; +}); + +-- Elepower: +lumpblocks.register_lump_block('lumpblocks:lead_block', +{ + lump = 'elepower_dynamics:lead_lump'; + description = S'Raw Lead Block'; + colours = {'#283240', '#3E4E66'}, +}); + +lumpblocks.register_lump_block('lumpblocks:nickel_block', +{ + lump = 'elepower_dynamics:nickel_lump'; + description = S'Raw Nickel Block'; + colours = {'#7A7659', '#959275'}; +}); + +lumpblocks.register_lump_block('lumpblocks:viridisium_block', +{ + lump = 'elepower_dynamics:viridisium_lump'; + description = S'Raw Viridisium Block'; + colours = {'#46783E', '#65B151'}; +}); + +lumpblocks.register_lump_block('lumpblocks:zinc_block', +{ + lump = 'elepower_dynamics:zinc_lump'; + description = S'Raw Zinc Block'; + colours = {'#5E8DA1', '#82A7B9'}; +}); + +lumpblocks.register_lump_block('lumpblocks:uranium_block', +{ + lump = 'elepower_nuclear:uranium_lump'; + description = S'Raw Uranium Lump'; + colours = {'#036403', '#038F03'}; +}); + +-- Terumet: +lumpblocks.register_lump_block('lumpblocks:terumet_block', +{ + lump = 'terumet:lump_raw'; + description = S'Raw Terumet Lump'; + colours = {'#411117', '#CA767A'}; +}); diff --git a/mods/lumpblocks/init.lua b/mods/lumpblocks/init.lua new file mode 100644 index 0000000..5dc41ae --- /dev/null +++ b/mods/lumpblocks/init.lua @@ -0,0 +1,34 @@ +--[[ + Raw Ore Blocks — adds block forms of metal lumps to Luanti + Copyright © 2022-2026, Silver Sandstone <@SilverSandstone@craftodon.social> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +]] + + +--- Mod entry point. +-- @module init + + +lumpblocks = {}; + + +local modpath = core.get_modpath(core.get_current_modname()); +dofile(modpath .. '/api.lua'); +dofile(modpath .. '/definitions.lua'); diff --git a/mods/lumpblocks/locale/converted/messages.pot b/mods/lumpblocks/locale/converted/messages.pot new file mode 100644 index 0000000..28cd9a2 --- /dev/null +++ b/mods/lumpblocks/locale/converted/messages.pot @@ -0,0 +1,104 @@ +msgid "" +msgstr "" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: MTTranslate\n" + +#: api.lua:119 +msgid "@1 Block" +msgstr "" + +#: api.lua:123 +msgid "A compressed block form of @1 for decoration or efficient storage." +msgstr "" + +#: definitions.lua:33 +#: definitions.lua:40 +msgid "Raw Copper Block" +msgstr "" + +#: definitions.lua:34 +#: definitions.lua:43 +msgid "Raw Gold Block" +msgstr "" + +#: definitions.lua:35 +#: definitions.lua:41 +msgid "Raw Iron Block" +msgstr "" + +#: definitions.lua:36 +#: definitions.lua:42 +msgid "Raw Tin Block" +msgstr "" + +#: definitions.lua:39 +msgid "Raw Bronze Block" +msgstr "" + +#: definitions.lua:46 +msgid "Raw Mithril Block" +msgstr "" + +#: definitions.lua:47 +#: definitions.lua:70 +msgid "Raw Silver Block" +msgstr "" + +#: definitions.lua:50 +msgid "Raw Chromium Block" +msgstr "" + +#: definitions.lua:51 +msgid "Raw Lead Block" +msgstr "" + +#: definitions.lua:52 +msgid "Raw Sulphur Block" +msgstr "" + +#: definitions.lua:53 +msgid "Raw Uranium Block" +msgstr "" + +#: definitions.lua:54 +msgid "Raw Zinc Block" +msgstr "" + +#: definitions.lua:57 +msgid "Raw Nether Block" +msgstr "" + +#: definitions.lua:60 +msgid "Raw Akalin Block" +msgstr "" + +#: definitions.lua:61 +msgid "Raw Alatro Block" +msgstr "" + +#: definitions.lua:62 +msgid "Raw Arol Block" +msgstr "" + +#: definitions.lua:63 +msgid "Raw Kalite Block" +msgstr "" + +#: definitions.lua:64 +msgid "Raw Talinite Block" +msgstr "" + +#: definitions.lua:67 +msgid "Raw Baborium Block" +msgstr "" + +#: mod.conf:2 +msgid "Raw Ore Blocks" +msgstr "" + +#: mod.conf:3 +msgid "Adds block forms of metal lumps." +msgstr "" diff --git a/mods/lumpblocks/mod.conf b/mods/lumpblocks/mod.conf new file mode 100644 index 0000000..8c0d2d8 --- /dev/null +++ b/mods/lumpblocks/mod.conf @@ -0,0 +1,21 @@ +name = lumpblocks +title = Raw Ore Blocks +description = Adds block forms of metal lumps. +author = SilverSandstone +optional_depends = """ + default, + elepower_dynamics, + elepower_nuclear, + glooptest, + moreores, + mcl_sounds, + nether, + rp_crafting, + rp_default, + rp_sounds, + techage, + technic_worldgen, + terumet +""" +supported_games = asuna, dreambuilder, mesecraft, minetest_game, repixture, survivetest, voxelgarden +min_minetest_version = 5.0.0 diff --git a/mods/lumpblocks/screenshot.png b/mods/lumpblocks/screenshot.png new file mode 100644 index 0000000..c45a81d Binary files /dev/null and b/mods/lumpblocks/screenshot.png differ diff --git a/mods/lumpblocks/textures/lumpblocks_lump_block.png b/mods/lumpblocks/textures/lumpblocks_lump_block.png new file mode 100644 index 0000000..8ccd11b Binary files /dev/null and b/mods/lumpblocks/textures/lumpblocks_lump_block.png differ diff --git a/mods/lumpblocks/textures/lumpblocks_lump_block_mask.png b/mods/lumpblocks/textures/lumpblocks_lump_block_mask.png new file mode 100644 index 0000000..7f506ab Binary files /dev/null and b/mods/lumpblocks/textures/lumpblocks_lump_block_mask.png differ diff --git a/mods/lumpblocks/textures/lumpblocks_lump_block_mask.xcf b/mods/lumpblocks/textures/lumpblocks_lump_block_mask.xcf new file mode 100644 index 0000000..eb9ccda Binary files /dev/null and b/mods/lumpblocks/textures/lumpblocks_lump_block_mask.xcf differ diff --git a/mods/marinara/LICENSE b/mods/marinara/LICENSE new file mode 100644 index 0000000..e810afb --- /dev/null +++ b/mods/marinara/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2022 +Textures and Schematics by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/marinara/coralnodes.lua b/mods/marinara/coralnodes.lua new file mode 100644 index 0000000..27cef4f --- /dev/null +++ b/mods/marinara/coralnodes.lua @@ -0,0 +1,108 @@ +local S = minetest.get_translator("marinara") + +minetest.register_node("marinara:hardcoral_brown", { + description = S("Brown Hard Coral"), + tiles = {"marinara_hardcoral_brown.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral_brown", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral", { + description = S("Hard Coral"), + tiles = {"marinara_hardcoral.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_blue", { + description = S("Blue Hard Coral"), + tiles = {"marinara_hardcoral_blue.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:hardcoral_blue", + light_source = 2, + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_green", { + description = S("Green Hard Coral"), + tiles = {"marinara_hardcoral_green.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral_green", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_pink", { + description = S("Pink Hard Coral"), + tiles = {"marinara_hardcoral_pink.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral_pink", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_red", { + description = S("Red Hard Coral"), + tiles = {"marinara_hardcoral_red.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral_red", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_violet", { + description = S("Violet Hard Coral"), + tiles = {"marinara_hardcoral_violet.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral_violet", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:hardcoral_yellow", { + description = S("Yellow Hard Coral"), + tiles = {"marinara_hardcoral_yellow.png"}, + groups = {cracky = 3, stone = 1}, + light_source = 2, + drop = "marinara:hardcoral_yellow", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:coastrock", { + description = S("Coastal Rock"), + tiles = {"marinara_coastrock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:coastrock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:coastrock_alage", { + description = S("Coastal Rock with Alage"), + tiles = {"marinara_coastrock_alage.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:coastrock_alage", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("marinara:seapocks", { + description = S("Sea Pocks"), + tiles = {"marinara_seapocks.png"}, + groups = {cracky = 3, stone = 1}, + drop = "marinara:seapocks", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) \ No newline at end of file diff --git a/mods/marinara/crafting.lua b/mods/marinara/crafting.lua new file mode 100644 index 0000000..2dabe79 --- /dev/null +++ b/mods/marinara/crafting.lua @@ -0,0 +1,719 @@ +local S = minetest.get_translator("marinara") + + stairs.register_stair_and_slab( + "marinara_reed_node", + "marinara:reed_bundle", + {snappy = 3, oddly_breakable_by_hand = 0, flammable = 0}, + {"marinara_reed_node_top.png", "marinara_reed_node.png", "marinara_reed_node_top.png"}, + S("Reed Node Stair"), + S("Reed Node Slab"), + default.node_sound_leaves_defaults() + ) + +minetest.register_node("marinara:reed_bundle", { + description = S("Reed Node"), + tiles = { + "marinara_reed_node.png", + "marinara_reed_node.png", + "marinara_reed_node_top.png" + }, + is_ground_content = false, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_craft({ + output = "marinara:reed_bundle", + type = "shapeless", + recipe = + {"marinara:reed", "marinara:reed"} + +}) + +minetest.register_craft({ + output = "marinara:reed_bundle", + type = "shapeless", + recipe = + {"marinara:reed_root", "marinara:reed_root"} + +}) + +minetest.register_node("marinara:bountychest", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:steel_ingot 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest2", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "tnt:gunpowder 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest3", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:axe_bronze 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest4", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "farming:seed_wheat 10", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest5", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:sword_steel 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest6", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:gold_ingot 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest7", { + description = ("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "farming:string 6", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest8", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:book 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest9", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:mese_crystal_fragment 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest10", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:pick_bronze 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest11", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "default:obsidian_shard 1", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:bountychest12", { + description = S("Bounty Chest"), +tiles = { + "marinara_bootynode_top.png", + "marinara_bootynode_bottom.png", + "marinara_bootynode_right.png", + "marinara_bootynode_left.png", + "marinara_bootynode_back.png", + "marinara_bootynode_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + drop = "farming:seed_cotton 10", + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("marinara:sand_with_seashells", { + description = S("Sand with Seashells"), + tiles = {"default_sand.png^marinara_seashells.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile", + type = "shapeless", + recipe = + {"marinara:seashells", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells", { + description = S("Seashells"), + inventory_image = "marinara_seashells.png", +}) + +minetest.register_node("marinara:seashellmobile", { + description = S("Seashell Mobile"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile.png"}, + inventory_image = "marinara_seashellmobile.png", + wield_image = "marinara_seashellmobile.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +walls.register(":marinara:coastbrick_wall", S"Coast Brick Wall", "marinara_coastbrick.png", + "marinara:coastbrick_wall", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "marinara_coastbrick", + "marinara:coastbricks", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"marinara_coastbrick.png"}, + S("Coast Rock Brick Stair"), + S("Coast Rock Brick Slab"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("marinara:coastbricks", { + description = S("Coast Bricks"), + tiles = {"marinara_coastbrick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "marinara:coastbricks", + type = "shapeless", + recipe = + {"marinara:coastrock", "marinara:coastrock"} + + +}) + +minetest.register_craft({ + output = "marinara:coastbrick_wall", + type = "shapeless", + recipe = + {"marinara:coastbricks"} + + +}) + +walls.register(":marinara:coastbrick_wall_alage", S"Coast Brick Wall with Alage", "marinara_coastbrick_alage.png", + "marinara:coastbrick_wall_alage", default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab( + "marinara_coastbrick_alage", + "marinara:coastbricks_alage", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"marinara_coastbrick_alage.png"}, + S("Coast Rock Brick Stair with Alage"), + S("Coast Rock Brick Slab with Alage"), + default.node_sound_stone_defaults() + ) + +minetest.register_node("marinara:coastbricks_alage", { + description = S("Coast Bricks with Alage"), + tiles = {"marinara_coastbrick_alage.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "marinara:coastbricks_alage", + type = "shapeless", + recipe = + {"marinara:coastrock_alage", "marinara:coastrock_alage"} + + +}) + +minetest.register_craft({ + output = "marinara:coastbrick_wall_alage", + type = "shapeless", + recipe = + {"marinara:coastbricks_alage"} + + +}) + +minetest.register_node("marinara:sand_with_seashells_orange", { + description = S("Sand with Seashells Orange"), + tiles = {"default_sand.png^marinara_seashells_orange.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_orange", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_orange", + type = "shapeless", + recipe = + {"marinara:seashells_orange", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_orange", { + description = S("Seashells Orange"), + inventory_image = "marinara_seashells_orange.png", +}) + +minetest.register_node("marinara:seashellmobile_orange", { + description = S("Seashell Mobile Orange"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_orange.png"}, + inventory_image = "marinara_seashellmobile_orange.png", + wield_image = "marinara_seashellmobile_orange.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_broken", { + description = S("Sand with Seashells Broken"), + tiles = {"default_sand.png^marinara_seashells_broken.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_broken", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_broken", + type = "shapeless", + recipe = + {"marinara:seashells_broken", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_broken", { + description = S("Seashells Broken"), + inventory_image = "marinara_seashells_broken.png", +}) + +minetest.register_node("marinara:seashellmobile_broken", { + description = S("Seashell Mobile Broken"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_broken.png"}, + inventory_image = "marinara_seashellmobile_broken.png", + wield_image = "marinara_seashellmobile_broken.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_pink", { + description = S("Sand with Seashells Pink"), + tiles = {"default_sand.png^marinara_seashells_pink.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_pink", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_pink", + type = "shapeless", + recipe = + {"marinara:seashells_pink", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_pink", { + description = S("Seashells Pink"), + inventory_image = "marinara_seashells_pink.png", +}) + +minetest.register_node("marinara:seashellmobile_pink", { + description = S("Seashell Mobile Pink"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_pink.png"}, + inventory_image = "marinara_seashellmobile_pink.png", + wield_image = "marinara_seashellmobile_pink.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_brown", { + description = S("Sand with Seashells Brown"), + tiles = {"default_sand.png^marinara_seashells_brown.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_brown", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_brown", + type = "shapeless", + recipe = + {"marinara:seashells_brown", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_brown", { + description = S("Seashells Brown"), + inventory_image = "marinara_seashells_brown.png", +}) + +minetest.register_node("marinara:seashellmobile_brown", { + description = S("Seashell Mobile Brown"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_brown.png"}, + inventory_image = "marinara_seashellmobile_brown.png", + wield_image = "marinara_seashellmobile_brown.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_yellow", { + description = S("Sand with Seashells Yellow"), + tiles = {"default_sand.png^marinara_seashells_yellow.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_yellow", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_yellow", + type = "shapeless", + recipe = + {"marinara:seashells_yellow", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_yellow", { + description = S("Seashells Yellow"), + inventory_image = "marinara_seashells_yellow.png", +}) + +minetest.register_node("marinara:seashellmobile_yellow", { + description = S("Seashell Mobile Yellow"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_yellow.png"}, + inventory_image = "marinara_seashellmobile_yellow.png", + wield_image = "marinara_seashellmobile_yellow.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_seashells_white", { + description = S("Sand with Seashells White"), + tiles = {"default_sand.png^marinara_seashells_white.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + drop = "marinara:seashells_white", + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_craft({ + output = "marinara:seashellmobile_white", + type = "shapeless", + recipe = + {"marinara:seashells_white", "farming:string"} + +}) + +minetest.register_craftitem("marinara:seashells_white", { + description = S("Seashells White"), + inventory_image = "marinara_seashells_white.png", +}) + +minetest.register_node("marinara:seashellmobile_white", { + description = S("Seashell Mobile White"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinara_seashellmobile_white.png"}, + inventory_image = "marinara_seashellmobile_white.png", + wield_image = "marinara_seashellmobile_white.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +doors.register_trapdoor("marinara:metal_trapdoor", { + description = S"Metal Ship Trapdoor", + inventory_image = "marinara_metal_trapdoor.png", + wield_image = "marinara_metal_trapdoor.png", + tile_front = "marinara_metal_trapdoor.png", + tile_side = "marinara_metal_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + sounds = default.node_sound_metal_defaults( ), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + groups = {cracky = 3, stone = 2, door = 1}, +}) + + +minetest.register_craft({ + output = "marinara:metal_trapdoor 2", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"marinara:seapocks", "xpanes:pane_flat", "default:steel_ingot"}, + } +}) + +doors.register("marinara:metal_door", { + tiles = {{ name = "marinara_metal_door.png", backface_culling = true }}, + description = S"Metal Ship Door", + inventory_image = "marinara_item_metal_door.png", + gain_open = 0.06, + gain_close = 0.13, + sounds = default.node_sound_metal_defaults( ), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + groups = {cracky = 3, stone = 2, door = 1}, + +}) + +minetest.register_craft({ + output = "marinara:metal_door", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"xpanes:pane_flat", "xpanes:pane_flat"}, + {"marinara:seapocks", "default:steel_ingot"}, + } +}) + +doors.register_trapdoor("marinara:nautic_trapdoor", { + description = S"Nautic Trapdoor", + inventory_image = "marinara_nautic_trapdoor.png", + wield_image = "marinara_nautic_trapdoor.png", + tile_front = "marinara_nautic_trapdoor.png", + tile_side = "marinara_nautic_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "marinara:nautic_trapdoor 2", + recipe = { + {"group:wood", "group:wood", "default:gold_ingot"}, + {"marinara:seapocks", "xpanes:pane_flat", "group:wood"}, + } +}) + +doors.register("marinara_nautic_door", { + tiles = {{ name = "marinara_nautic_door.png", backface_culling = true }}, + description = S"Nautic Door", + inventory_image = "marinara_item_nautic_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"group:wood", "group:wood"}, + {"xpanes:pane_flat", "default:gold_ingot"}, + {"marinara:seapocks", "group:wood"}, + } +}) + +doors.register_trapdoor("marinara:wooden_trapdoor", { + description = S"Wooden Trapdoor", + inventory_image = "marinara_wooden_trapdoor.png", + wield_image = "marinara_wooden_trapdoor.png", + tile_front = "marinara_wooden_trapdoor.png", + tile_side = "marinara_wooden_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "marinara:wooden_trapdoor 2", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"marinara:seapocks", "xpanes:pane_flat", "group:wood"}, + } +}) + + +doors.register("marinara_wooden_door", { + tiles = {{ name = "marinara_wooden_door.png", backface_culling = true }}, + description = S"Wooden Door", + inventory_image = "marinara_item_wooden_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"group:wood", "group:wood"}, + {"xpanes:pane_flat", "group:wood"}, + {"marinara:seapocks", "group:wood"}, + } +}) \ No newline at end of file diff --git a/mods/marinara/hunger.lua b/mods/marinara/hunger.lua new file mode 100644 index 0000000..5a66bd3 --- /dev/null +++ b/mods/marinara/hunger.lua @@ -0,0 +1,8 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('marinara:raw_oisters', { + satiates = 2.0, + }) + hunger_ng.add_hunger_data('marinara:mussels_cooked', { + satiates = 5.0, +}) +end \ No newline at end of file diff --git a/mods/marinara/init.lua b/mods/marinara/init.lua new file mode 100644 index 0000000..fa10801 --- /dev/null +++ b/mods/marinara/init.lua @@ -0,0 +1,33 @@ +--This creates the marinara object. +marinara = {} + +--This creates the marinara.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +marinara.settings = { + clear_biomes = minetest.settings:get_bool("marinara.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("marinara.clear_decos") or false, + clear_ores = minetest.settings:get_bool("marinara.clear_ores") or false, +} + +if marinara.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if marinara.settings.clear_decos then + minetest.clear_registered_decorations() +end +if marinara.settings.clear_ores then + minetest.clear_registered_ores() +end + +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +-- plants +dofile(path .. "coralnodes.lua") -- +dofile(path .. "plants.lua") -- +dofile(path .. "reefstuff.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "spawn.lua") -- +dofile(path .. "hunger.lua") -- + + + + diff --git a/mods/marinara/locale/marinara.de.tr b/mods/marinara/locale/marinara.de.tr new file mode 100644 index 0000000..733b12f --- /dev/null +++ b/mods/marinara/locale/marinara.de.tr @@ -0,0 +1,93 @@ +# textdomain: marinara + +### coralnodes.lua ### +Brown Hard Coral=Braune Steinkoralle +Hard Coral=Steinkoralle +Blue Hard Coral=Blaue Steinkoralle +Green Hard Coral=Grüne Steinkoralle +Pink Hard Coral=Pinke Steinkoralle +Red Hard Coral=Rote Steinkoralle +Violet Hard Coral=Violette Steinkoralle +Yellow Hard Coral=Gelbe Steinkoralle +Coastal Rock=Küstenfels +Coastal Rock with Alage=Algiger Küstenfels +Sea Pocks=Seepocken + +### crafting.lua ### +Reed Node=Schilfblock +Reed Node Stair=Schilftreppe +Reed Node Slab=Schilfplatte +Bounty Chest=Beutetruhe +Sand with Seashells=Sand mit Muscheln +Seashells=Muscheln +Seashell Mobile=Muschel Mobile +Coast Bricks=Küstenziegel +Coast Brick Wall=Küstenziegelmauer +Coast Rock Brick Stair=Küstenziegel Treppe +Coast Rock Brick Slab=Küstenziegel Platte +Coast Brick Wall with Alage=Algige Küstenziegelmauer +Coast Rock Brick Stair with Alage=Algige Küstenziegel Treppe +Coast Bricks with Alage=Algige Küstenziegel +Sand with Seashells Orange=Sand mit orangen Muscheln +Seashell Mobile=Muschel Mobile +Seashells Orange=Orange Muscheln +Seashell Mobile Orange=Muschel Mobile Orange +Sand with Seashells Broken=Sand mit zerbrochenen Muscheln +Seashells Broken=Zerbrochene Muscheln +Seashell Mobile Broken=Muschel Mobile mit Bruchstücken +Sand with Seashells Pink=Sand mit pinken Muscheln +Seashells Pink=Pinke Muscheln +Seashell Mobile Pink=Muschel Mobile Pink +Sand with Seashells Brown=Sand mit braunen Muscheln +Seashells Brown=Braune Muscheln +Seashell Mobile Brown=Muschel Mobile Braun +Sand with Seashells Yellow=Sand mit gelben Muscheln +Seashells Yellow=Gelbe Muscheln +Seashell Mobile Yellow=Muschel Mobile Gelb +Sand with Seashells White=Sand mit weißen Muscheln +Seashells White=Weiße Muscheln +Seashell Mobile White=Muschel Mobile Weiß +Metal Ship Trapdoor=Metallische Schiffsfalltür +Metal Ship Door=Metallische Schiffstür +Nautic Trapdoor=Nautische Falltür +Nautic Door=Nautische Tür +Wooden Trapdoor=Hölzerne Falltür +Wooden Door=Hölzerne Tür + +### plants.lua ### +Reed Root=Schilf mit Wurzeln +Reed=Schilf +Long Seagrass=Langes Seegras +Seagrass=Seegras +Alage=Alge +Brown Alage=Braunalge + +### reefstuff.lua ### +Yellow Soft Coral=Gelbe Weichkoralle +White Soft Coral=Weiße Weichkoralle +Red Soft Coral=Rote Weichkoralle +Green Soft Coral=Grüne Weichkoralle +Soft Coral=Weichkoralle +Brown Soft Coral=Braune Weichkoralle +Sea Anemone=Seeanemone +Sea Worm=Fächerwurm +Mussel Node=Muschelblock +Cooked Mussels=Gekochte Muscheln +Oister Bank=Austernbank +Raw Oisters=Rohe Austern + + + + + + + + + + + + + + + + diff --git a/mods/marinara/mod.conf b/mods/marinara/mod.conf new file mode 100644 index 0000000..33a79bc --- /dev/null +++ b/mods/marinara/mod.conf @@ -0,0 +1,3 @@ +name = marinara +description = adds water structures and coral reefs to your minetest game world +depends = default, stairs, tnt, farming, doors, xpanes \ No newline at end of file diff --git a/mods/marinara/plants.lua b/mods/marinara/plants.lua new file mode 100644 index 0000000..afd1302 --- /dev/null +++ b/mods/marinara/plants.lua @@ -0,0 +1,415 @@ +local S = minetest.get_translator("marinara") + +minetest.register_node("marinara:reed_root", { + description = S("Reed Root"), + drawtype = "plantlike_rooted", + visual_scale = 3.5, + waving = 1, + paramtype = "light", + tiles = {"default_dirt.png"}, + special_tiles = {{name = "marinara_reed_root.png", tileable_vertical = true}}, + inventory_image = "marinara_reed_root.png", + wield_image = "marinara_reed_root.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:dirt", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:dirt"}) + end, +}) + +minetest.register_node("marinara:reed", { + description = S("Reed"), + drawtype = "plantlike", + waving = 1, + visual_scale = 3.5, + tiles = {"marinara_reed.png"}, + inventory_image = "marinara_reed.png", + wield_image = "marinara_reed.png", + paramtype = "light", + sunlight_propagates = true, + + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("marinara:sand_with_kelp", { + description = ("Kelp"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_kelp.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_kelp_inv.png", + visual_scale = 2.0, + wield_image = "marinara_kelp_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(4, 12) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_kelp", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:sand_with_seagrass2", { + description = S("Long Seagrass"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_seagrass.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_seagrass_inv.png", + visual_scale = 2.0, + wield_image = "marinara_seagrass_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(2, 2) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_seagrass2", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:sand_with_seagrass", { + description = S("Seagrass"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_seagrass.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_seagrass_inv.png", + visual_scale = 2.0, + wield_image = "marinara_seagrass_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(1, 1) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_seagrass", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:sand_with_alage", { + description = S("Alage"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "marinara_alage.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_alage_inv.png", + visual_scale = 1.0, + wield_image = "marinara_alage_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(1, 1) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:sand_with_alage", + param2 = height * 16}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + +minetest.register_node("marinara:coastrock_with_brownalage", { + description = S("Brown Alage"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"marinara_coastrock.png"}, + special_tiles = {{name = "marinara_brownalage.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_brownalage_inv.png", + visual_scale = 2.0, + wield_image = "marinara_brownalage_inv.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 1, 2/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and placer and + not placer:get_player_control().sneak then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(2, 2) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "marinara:coastrock_with_brownalage", + param2 = height * 8}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end +}) diff --git a/mods/marinara/reefstuff.lua b/mods/marinara/reefstuff.lua new file mode 100644 index 0000000..7bff2ed --- /dev/null +++ b/mods/marinara/reefstuff.lua @@ -0,0 +1,497 @@ +local S = minetest.get_translator("marinara") + +-- soft corals + +minetest.register_node("marinara:softcoral_yellow", { + description = S("Yellow Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_yellow.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_softcoral_yellow_inv.png", + wield_image = "marinara_softcoral_yellow_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_white", { + description = S("White Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_white.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_softcoral_white_inv.png", + wield_image = "marinara_softcoral_white_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_red", { + description = S("Red Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_red.png", tileable_vertical = true, waving = 1}}, + inventory_image = "marinara_softcoral_red.png", + wield_image = "marinara_softcoral_red.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_green", { + description = S("Green Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_green.png", tileable_vertical = true, waving = 1}}, + inventory_image = "marinara_softcoral_green.png", + wield_image = "marinara_softcoral_green.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral", { + description = S("Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral.png", tileable_vertical = true, waving = 1}}, + inventory_image = "marinara_softcoral.png", + wield_image = "marinara_softcoral_green.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +minetest.register_node("marinara:softcoral_brown", { + description = S("Brown Soft Coral"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_hardcoral.png"}, +special_tiles = {{name = "marinara_softcoral_brown.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 2}}}, + inventory_image = "marinara_softcoral_brown_inv.png", + wield_image = "marinara_softcoral_brown_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:hardcoral", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:hardcoral"}) + end, +}) + +--- sea anemones + +minetest.register_node("marinara:seaanemone_tentacle", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle_inv.png", + wield_image = "marinara_seaanemone_tentacle_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +minetest.register_node("marinara:seaanemone_tentacle2", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle2.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle2_inv.png", + wield_image = "marinara_seaanemone_tentacle2_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +minetest.register_node("marinara:seaanemone_tentacle3", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle3.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle3_inv.png", + wield_image = "marinara_seaanemone_tentacle3_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +minetest.register_node("marinara:seaanemone_tentacle4", { + description = S("Sea Anemone"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_coastrock.png"}, +special_tiles = {{name = "marinara_seaanemone_tentacle4.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaanemone_tentacle4_inv.png", + wield_image = "marinara_seaanemone_tentacle4_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:coastrock", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:coastrock"}) + end, +}) + +--- fan worms + +minetest.register_node("marinara:seaworm", { + description = S("Sea Worm"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_seaworm.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaworm_inv.png", + wield_image = "marinara_seaworm_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:seapocks"}) + end, +}) + +minetest.register_node("marinara:seaworm2", { + description = S("Sea Worm"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 1.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_seaworm2.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 3}}}, + inventory_image = "marinara_seaworm2_inv.png", + wield_image = "marinara_seaworm2_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:seapocks"}) + end, +}) + +minetest.register_node("marinara:seaworm3", { + description = S("Sea Worm"), + drawtype = "plantlike_rooted", + waving = 1, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_seaworm3.png", tileable_vertical = true, waving = 1, animation = {type="vertical_frames", length = 12}}}, + inventory_image = "marinara_seaworm3_inv.png", + wield_image = "marinara_seaworm3_inv.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:seapocks"}) + end, +}) + +-- mussels and oisters + +minetest.register_node("marinara:mussels", { + description = S("Mussel Node"), +tiles = { + { + name = "marinara_mussles.png", + animation = {type="vertical_frames", length = 4} + } + }, +inventory_image = "marinara_mussles_inv.png", + wield_image = "marinara_mussles_inv.png", + groups = {cracky = 2}, + drop = "marinara:mussels", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + type = "cooking", + output = "marinara:mussels_cooked", + recipe = "marinara:mussels", + cooktime = 5 +}) + +minetest.register_craftitem("marinara:mussels_cooked", { + description = S("Cooked Mussels"), + inventory_image = "marinara_mussles_cooked.png", + on_use = minetest.item_eat(8), + groups = {food_meat = 1, flammable = 2} +}) + +minetest.register_node("marinara:oisterbank", { + description = S("Oister Bank"), + drawtype = "plantlike_rooted", + waving = 0, + visual_scale = 2.0, + paramtype = "light", + tiles = {"marinara_seapocks.png"}, +special_tiles = {{name = "marinara_oisterbank.png", tileable_vertical = true}}, + inventory_image = "marinara_oisterbank.png", + wield_image = "marinara_oisterbank.png", + groups = {cracky = 2}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "marinara:seapocks", + node_placement_prediction = "", + drop = "marinara:raw_oisters", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_choppy", gain = 0.2}, + dug = {name = "default_dig_choppy", gain = 0.25}, + }), + + + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = "marinara:raw_oisters"}) + end, +}) + +minetest.register_node("marinara:raw_oisters", { + description = S("Raw Oisters"), + drawtype = "plantlike", + tiles = {"marinara_rawoisters.png"}, + inventory_image = "marinara_rawoisters.png", + wield_image = "marinara_rawoisters.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = {food = 1, flammable = 2, fleshy = 3, dig_immediate = 3}, + drop = "marinara:raw_oisters", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "marinara:raw_oisters", param2 = 1}) + end + end +}) \ No newline at end of file diff --git a/mods/marinara/schematics/marinara_alage.mts b/mods/marinara/schematics/marinara_alage.mts new file mode 100644 index 0000000..1b12c3b Binary files /dev/null and b/mods/marinara/schematics/marinara_alage.mts differ diff --git a/mods/marinara/schematics/marinara_brownalage.mts b/mods/marinara/schematics/marinara_brownalage.mts new file mode 100644 index 0000000..bb5806e Binary files /dev/null and b/mods/marinara/schematics/marinara_brownalage.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock.mts b/mods/marinara/schematics/marinara_coast_rock.mts new file mode 100644 index 0000000..1828623 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock2.mts b/mods/marinara/schematics/marinara_coast_rock2.mts new file mode 100644 index 0000000..b659fa4 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock2.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock3.mts b/mods/marinara/schematics/marinara_coast_rock3.mts new file mode 100644 index 0000000..b33a539 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock3.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock4.mts b/mods/marinara/schematics/marinara_coast_rock4.mts new file mode 100644 index 0000000..0daef3e Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock4.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock5.mts b/mods/marinara/schematics/marinara_coast_rock5.mts new file mode 100644 index 0000000..c87f9be Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock5.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock6.mts b/mods/marinara/schematics/marinara_coast_rock6.mts new file mode 100644 index 0000000..88571f9 Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock6.mts differ diff --git a/mods/marinara/schematics/marinara_coast_rock7.mts b/mods/marinara/schematics/marinara_coast_rock7.mts new file mode 100644 index 0000000..41bd6ae Binary files /dev/null and b/mods/marinara/schematics/marinara_coast_rock7.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef.mts b/mods/marinara/schematics/marinara_coldreef.mts new file mode 100644 index 0000000..00c6044 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef2.mts b/mods/marinara/schematics/marinara_coldreef2.mts new file mode 100644 index 0000000..1eb1103 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef2.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef3.mts b/mods/marinara/schematics/marinara_coldreef3.mts new file mode 100644 index 0000000..2016d93 Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef3.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef4.mts b/mods/marinara/schematics/marinara_coldreef4.mts new file mode 100644 index 0000000..6b4c02f Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef4.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef5.mts b/mods/marinara/schematics/marinara_coldreef5.mts new file mode 100644 index 0000000..38009ac Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef5.mts differ diff --git a/mods/marinara/schematics/marinara_coldreef6.mts b/mods/marinara/schematics/marinara_coldreef6.mts new file mode 100644 index 0000000..755d08f Binary files /dev/null and b/mods/marinara/schematics/marinara_coldreef6.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef.mts b/mods/marinara/schematics/marinara_coralreef.mts new file mode 100644 index 0000000..d8c562a Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef2.mts b/mods/marinara/schematics/marinara_coralreef2.mts new file mode 100644 index 0000000..fccd625 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef3.mts b/mods/marinara/schematics/marinara_coralreef3.mts new file mode 100644 index 0000000..29dac28 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_blue.mts b/mods/marinara/schematics/marinara_coralreef_blue.mts new file mode 100644 index 0000000..b79280d Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_blue.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_blue2.mts b/mods/marinara/schematics/marinara_coralreef_blue2.mts new file mode 100644 index 0000000..ec393b2 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_blue2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_blue3.mts b/mods/marinara/schematics/marinara_coralreef_blue3.mts new file mode 100644 index 0000000..0fce4fb Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_blue3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_brown.mts b/mods/marinara/schematics/marinara_coralreef_brown.mts new file mode 100644 index 0000000..97f12cc Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_brown.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_brown2.mts b/mods/marinara/schematics/marinara_coralreef_brown2.mts new file mode 100644 index 0000000..e313db4 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_brown2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_brown3.mts b/mods/marinara/schematics/marinara_coralreef_brown3.mts new file mode 100644 index 0000000..97d7c13 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_brown3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_green.mts b/mods/marinara/schematics/marinara_coralreef_green.mts new file mode 100644 index 0000000..b9f1f4a Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_green.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_green2.mts b/mods/marinara/schematics/marinara_coralreef_green2.mts new file mode 100644 index 0000000..1c396a1 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_green2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_green3.mts b/mods/marinara/schematics/marinara_coralreef_green3.mts new file mode 100644 index 0000000..8f8c8e9 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_green3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_pink.mts b/mods/marinara/schematics/marinara_coralreef_pink.mts new file mode 100644 index 0000000..a211c3d Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_pink.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_pink2.mts b/mods/marinara/schematics/marinara_coralreef_pink2.mts new file mode 100644 index 0000000..4575e36 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_pink2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_pink3.mts b/mods/marinara/schematics/marinara_coralreef_pink3.mts new file mode 100644 index 0000000..0f12f03 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_pink3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_red.mts b/mods/marinara/schematics/marinara_coralreef_red.mts new file mode 100644 index 0000000..9bb8782 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_red.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_red2.mts b/mods/marinara/schematics/marinara_coralreef_red2.mts new file mode 100644 index 0000000..9152ec9 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_red2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_red3.mts b/mods/marinara/schematics/marinara_coralreef_red3.mts new file mode 100644 index 0000000..e92d040 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_red3.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_yellow.mts b/mods/marinara/schematics/marinara_coralreef_yellow.mts new file mode 100644 index 0000000..f192fed Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_yellow.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_yellow2.mts b/mods/marinara/schematics/marinara_coralreef_yellow2.mts new file mode 100644 index 0000000..d5168bb Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_yellow2.mts differ diff --git a/mods/marinara/schematics/marinara_coralreef_yellow3.mts b/mods/marinara/schematics/marinara_coralreef_yellow3.mts new file mode 100644 index 0000000..7751186 Binary files /dev/null and b/mods/marinara/schematics/marinara_coralreef_yellow3.mts differ diff --git a/mods/marinara/schematics/marinara_musslebank.mts b/mods/marinara/schematics/marinara_musslebank.mts new file mode 100644 index 0000000..5560d3b Binary files /dev/null and b/mods/marinara/schematics/marinara_musslebank.mts differ diff --git a/mods/marinara/schematics/marinara_musslebank2.mts b/mods/marinara/schematics/marinara_musslebank2.mts new file mode 100644 index 0000000..37ce8ca Binary files /dev/null and b/mods/marinara/schematics/marinara_musslebank2.mts differ diff --git a/mods/marinara/schematics/marinara_musslebank3.mts b/mods/marinara/schematics/marinara_musslebank3.mts new file mode 100644 index 0000000..fc2ca02 Binary files /dev/null and b/mods/marinara/schematics/marinara_musslebank3.mts differ diff --git a/mods/marinara/schematics/marinara_oister_bank.mts b/mods/marinara/schematics/marinara_oister_bank.mts new file mode 100644 index 0000000..c08f479 Binary files /dev/null and b/mods/marinara/schematics/marinara_oister_bank.mts differ diff --git a/mods/marinara/schematics/marinara_oister_bank2.mts b/mods/marinara/schematics/marinara_oister_bank2.mts new file mode 100644 index 0000000..9f96151 Binary files /dev/null and b/mods/marinara/schematics/marinara_oister_bank2.mts differ diff --git a/mods/marinara/schematics/marinara_oister_bank3.mts b/mods/marinara/schematics/marinara_oister_bank3.mts new file mode 100644 index 0000000..e445408 Binary files /dev/null and b/mods/marinara/schematics/marinara_oister_bank3.mts differ diff --git a/mods/marinara/schematics/marinara_reed.mts b/mods/marinara/schematics/marinara_reed.mts new file mode 100644 index 0000000..179c433 Binary files /dev/null and b/mods/marinara/schematics/marinara_reed.mts differ diff --git a/mods/marinara/schematics/marinara_reed2.mts b/mods/marinara/schematics/marinara_reed2.mts new file mode 100644 index 0000000..6980045 Binary files /dev/null and b/mods/marinara/schematics/marinara_reed2.mts differ diff --git a/mods/marinara/schematics/marinara_seagrass.mts b/mods/marinara/schematics/marinara_seagrass.mts new file mode 100644 index 0000000..0449b03 Binary files /dev/null and b/mods/marinara/schematics/marinara_seagrass.mts differ diff --git a/mods/marinara/schematics/marinara_seagrass_long.mts b/mods/marinara/schematics/marinara_seagrass_long.mts new file mode 100644 index 0000000..abaf4f5 Binary files /dev/null and b/mods/marinara/schematics/marinara_seagrass_long.mts differ diff --git a/mods/marinara/schematics/marinara_wreck.mts b/mods/marinara/schematics/marinara_wreck.mts new file mode 100644 index 0000000..f4d9849 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreck.mts differ diff --git a/mods/marinara/schematics/marinara_wreck2.mts b/mods/marinara/schematics/marinara_wreck2.mts new file mode 100644 index 0000000..d3f105d Binary files /dev/null and b/mods/marinara/schematics/marinara_wreck2.mts differ diff --git a/mods/marinara/schematics/marinara_wreck3.mts b/mods/marinara/schematics/marinara_wreck3.mts new file mode 100644 index 0000000..915530f Binary files /dev/null and b/mods/marinara/schematics/marinara_wreck3.mts differ diff --git a/mods/marinara/schematics/marinara_wreckbounty.mts b/mods/marinara/schematics/marinara_wreckbounty.mts new file mode 100644 index 0000000..7533fc7 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreckbounty.mts differ diff --git a/mods/marinara/schematics/marinara_wreckbounty2.mts b/mods/marinara/schematics/marinara_wreckbounty2.mts new file mode 100644 index 0000000..55dea51 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreckbounty2.mts differ diff --git a/mods/marinara/schematics/marinara_wreckbounty3.mts b/mods/marinara/schematics/marinara_wreckbounty3.mts new file mode 100644 index 0000000..a741d45 Binary files /dev/null and b/mods/marinara/schematics/marinara_wreckbounty3.mts differ diff --git a/mods/marinara/screenshot.png b/mods/marinara/screenshot.png new file mode 100644 index 0000000..3ec2c42 Binary files /dev/null and b/mods/marinara/screenshot.png differ diff --git a/mods/marinara/settingtypes.txt b/mods/marinara/settingtypes.txt new file mode 100644 index 0000000..84bb350 --- /dev/null +++ b/mods/marinara/settingtypes.txt @@ -0,0 +1,10 @@ +#marinara settings + +#If enabled, will clear all registered biomes. +marinara.clear_biomes (Enable to clear registered biomes. true / false) bool true + +#If enabled, will clear all registered decorations. +marinara.clear_decos (Enable to clear registered decorations. true / false) bool true + +#If enabled, will clear all registered ores. +marinara.clear_ores (Enable to clear registered ores. true / false) bool false diff --git a/mods/marinara/spawn.lua b/mods/marinara/spawn.lua new file mode 100644 index 0000000..98eb36b --- /dev/null +++ b/mods/marinara/spawn.lua @@ -0,0 +1,948 @@ +--- seashells + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells_broken" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells_white" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells_yellow" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells_brown" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells_pink" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 3789, + octaves = 4, + persist = 0.8, + }, + place_offset_y=-1, + flags = "place_center_x,place_center_z,force_placement", + biomes = {"savanna_shore", "savanna_ocean", "coniferous_forest_ocean", "sandstone_desert_ocean", "grassland_ocean",}, + y_max = 2, + y_min = 0, + decoration = "marinara:sand_with_seashells_orange" + }) + + +--- wrecks + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.00001, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -20, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreck.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.00001, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -20, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreck2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.00001, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -20, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreck3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.00001, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -20, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreckbounty.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.00001, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -20, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreckbounty2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.00001, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -10, + y_min = -20, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_wreckbounty3.mts", + rotation = "random", +}) + +--- cold oceans + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock4.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock5.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -4, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock6.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0009, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -3, + y_min = -5, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coast_rock7.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_oister_bank.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_oister_bank2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"cold_desert_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_oister_bank3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_musslebank.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_musslebank2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -2, + y_min = -3, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_musslebank3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef4.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef5.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0007, + biomes = {"snowy_grassland_ocean", "coniferous_forest_ocean", "grassland_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -5, + y_min = -10, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coldreef6.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 300, y = 300, z = 300}, + seed = 87112, + octaves = 5, + persist = 0.9 + }, + biomes = { + "taiga_ocean", + "snowy_grassland_ocean", + "grassland_ocean", + "coniferous_forest_ocean", + "deciduous_forest_ocean", + "sandstone_desert_ocean", + "cold_desert_ocean"}, + y_max = -11, + y_min = -16, + flags = "force_placement", + decoration = "marinara:sand_with_kelp", + param2 = 48, + param2_max = 96, + }) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand", "naturalbiomes:palmbeach_sand"}, + sidelen = 16, +noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 7, + persist = 0.9 + }, + biomes = {"coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "snowy_grassland_ocean", "naturalbiomes:palmbeach",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -3, + y_min = -8, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_seagrass.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand", "naturalbiomes:palmbeach_sand"}, + sidelen = 16, +noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 7, + persist = 0.9 + }, + biomes = {"coniferous_forest_ocean", "deciduous_forest_ocean", "grassland_ocean", "sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean", "tundra_ocean", "snowy_grassland_ocean", "naturalbiomes:palmbeach",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -4, + y_min = -8, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_seagrass_long.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand", "naturalbiomes:palmbeach_sand"}, + sidelen = 16, +noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 7, + persist = 0.9 + }, + biomes = {"deciduous_forest_ocean", "grassland_ocean", "coniferous_forest_ocean", "naturalbiomes:palmbeach",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -0, + y_min = -3, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_alage.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, +noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 7, + persist = 0.9 + }, + biomes = {"cold_desert_ocean", "coniferous_forest_ocean", "grassland_ocean", "tundra_ocean", "icesheet_ocean", "snowy_grassland_ocean",}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -1, + y_min = -5, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_brownalage.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, +noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 7, + persist = 0.9 + }, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore"}, + spawn_by = "default:water_source", + flags = "place_center_x,place_center_z,force_placement", + y_max = 1, + y_min = 0, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_reed.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, +noise_params = { + offset = -0.04, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = 87112, + octaves = 7, + persist = 0.9 + }, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -0, + y_min = -0, + place_offset_y=0, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_reed2.mts", + rotation = "random", +}) + +--- tropical oceans + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_blue.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_blue2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_blue3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_brown.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_brown2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_brown3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_green.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_green2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_green3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_pink.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_pink2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_pink3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_red.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_red2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_red3.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_yellow.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_yellow2.mts", + rotation = "random", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.0003, + biomes = {"sandstone_desert_ocean", "savanna_ocean", "rainforest_ocean"}, + flags = "place_center_x,place_center_z,force_placement", + y_max = -6, + y_min = -12, + place_offset_y=-1, + schematic = minetest.get_modpath("marinara").."/schematics/marinara_coralreef_yellow3.mts", + rotation = "random", +}) diff --git a/mods/marinara/textures/marinara_alage.png b/mods/marinara/textures/marinara_alage.png new file mode 100644 index 0000000..5f27fe9 Binary files /dev/null and b/mods/marinara/textures/marinara_alage.png differ diff --git a/mods/marinara/textures/marinara_alage_inv.png b/mods/marinara/textures/marinara_alage_inv.png new file mode 100644 index 0000000..3bcd3ea Binary files /dev/null and b/mods/marinara/textures/marinara_alage_inv.png differ diff --git a/mods/marinara/textures/marinara_bootynode_back.png b/mods/marinara/textures/marinara_bootynode_back.png new file mode 100644 index 0000000..8d9e672 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_back.png differ diff --git a/mods/marinara/textures/marinara_bootynode_bottom.png b/mods/marinara/textures/marinara_bootynode_bottom.png new file mode 100644 index 0000000..b71b3c0 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_bottom.png differ diff --git a/mods/marinara/textures/marinara_bootynode_front.png b/mods/marinara/textures/marinara_bootynode_front.png new file mode 100644 index 0000000..3a4e987 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_front.png differ diff --git a/mods/marinara/textures/marinara_bootynode_left.png b/mods/marinara/textures/marinara_bootynode_left.png new file mode 100644 index 0000000..7db4243 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_left.png differ diff --git a/mods/marinara/textures/marinara_bootynode_right.png b/mods/marinara/textures/marinara_bootynode_right.png new file mode 100644 index 0000000..222d028 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_right.png differ diff --git a/mods/marinara/textures/marinara_bootynode_top.png b/mods/marinara/textures/marinara_bootynode_top.png new file mode 100644 index 0000000..5687a86 Binary files /dev/null and b/mods/marinara/textures/marinara_bootynode_top.png differ diff --git a/mods/marinara/textures/marinara_brownalage.png b/mods/marinara/textures/marinara_brownalage.png new file mode 100644 index 0000000..2a59847 Binary files /dev/null and b/mods/marinara/textures/marinara_brownalage.png differ diff --git a/mods/marinara/textures/marinara_brownalage_inv.png b/mods/marinara/textures/marinara_brownalage_inv.png new file mode 100644 index 0000000..0e62467 Binary files /dev/null and b/mods/marinara/textures/marinara_brownalage_inv.png differ diff --git a/mods/marinara/textures/marinara_coastbrick.png b/mods/marinara/textures/marinara_coastbrick.png new file mode 100644 index 0000000..4c7141c Binary files /dev/null and b/mods/marinara/textures/marinara_coastbrick.png differ diff --git a/mods/marinara/textures/marinara_coastbrick_alage.png b/mods/marinara/textures/marinara_coastbrick_alage.png new file mode 100644 index 0000000..fccd2e7 Binary files /dev/null and b/mods/marinara/textures/marinara_coastbrick_alage.png differ diff --git a/mods/marinara/textures/marinara_coastrock.png b/mods/marinara/textures/marinara_coastrock.png new file mode 100644 index 0000000..517e2f6 Binary files /dev/null and b/mods/marinara/textures/marinara_coastrock.png differ diff --git a/mods/marinara/textures/marinara_coastrock_alage.png b/mods/marinara/textures/marinara_coastrock_alage.png new file mode 100644 index 0000000..3d74c39 Binary files /dev/null and b/mods/marinara/textures/marinara_coastrock_alage.png differ diff --git a/mods/marinara/textures/marinara_hardcoral.png b/mods/marinara/textures/marinara_hardcoral.png new file mode 100644 index 0000000..b49ac1f Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_blue.png b/mods/marinara/textures/marinara_hardcoral_blue.png new file mode 100644 index 0000000..0055bfd Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_blue.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_brown.png b/mods/marinara/textures/marinara_hardcoral_brown.png new file mode 100644 index 0000000..1f2d034 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_brown.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_green.png b/mods/marinara/textures/marinara_hardcoral_green.png new file mode 100644 index 0000000..93c77aa Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_green.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_pink.png b/mods/marinara/textures/marinara_hardcoral_pink.png new file mode 100644 index 0000000..8fdfc9d Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_pink.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_red.png b/mods/marinara/textures/marinara_hardcoral_red.png new file mode 100644 index 0000000..4d82563 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_red.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_violet.png b/mods/marinara/textures/marinara_hardcoral_violet.png new file mode 100644 index 0000000..8b9e56a Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_violet.png differ diff --git a/mods/marinara/textures/marinara_hardcoral_yellow.png b/mods/marinara/textures/marinara_hardcoral_yellow.png new file mode 100644 index 0000000..3a81a24 Binary files /dev/null and b/mods/marinara/textures/marinara_hardcoral_yellow.png differ diff --git a/mods/marinara/textures/marinara_item_metal_door.png b/mods/marinara/textures/marinara_item_metal_door.png new file mode 100644 index 0000000..3080feb Binary files /dev/null and b/mods/marinara/textures/marinara_item_metal_door.png differ diff --git a/mods/marinara/textures/marinara_item_nautic_door.png b/mods/marinara/textures/marinara_item_nautic_door.png new file mode 100644 index 0000000..9d28066 Binary files /dev/null and b/mods/marinara/textures/marinara_item_nautic_door.png differ diff --git a/mods/marinara/textures/marinara_item_wooden_door.png b/mods/marinara/textures/marinara_item_wooden_door.png new file mode 100644 index 0000000..845f2d5 Binary files /dev/null and b/mods/marinara/textures/marinara_item_wooden_door.png differ diff --git a/mods/marinara/textures/marinara_kelp.png b/mods/marinara/textures/marinara_kelp.png new file mode 100644 index 0000000..d2e4037 Binary files /dev/null and b/mods/marinara/textures/marinara_kelp.png differ diff --git a/mods/marinara/textures/marinara_kelp_inv.png b/mods/marinara/textures/marinara_kelp_inv.png new file mode 100644 index 0000000..1b0f70b Binary files /dev/null and b/mods/marinara/textures/marinara_kelp_inv.png differ diff --git a/mods/marinara/textures/marinara_metal_door.png b/mods/marinara/textures/marinara_metal_door.png new file mode 100644 index 0000000..2ae0d56 Binary files /dev/null and b/mods/marinara/textures/marinara_metal_door.png differ diff --git a/mods/marinara/textures/marinara_metal_trapdoor.png b/mods/marinara/textures/marinara_metal_trapdoor.png new file mode 100644 index 0000000..db53a70 Binary files /dev/null and b/mods/marinara/textures/marinara_metal_trapdoor.png differ diff --git a/mods/marinara/textures/marinara_metal_trapdoor_side.png b/mods/marinara/textures/marinara_metal_trapdoor_side.png new file mode 100644 index 0000000..f03dcfe Binary files /dev/null and b/mods/marinara/textures/marinara_metal_trapdoor_side.png differ diff --git a/mods/marinara/textures/marinara_mussles.png b/mods/marinara/textures/marinara_mussles.png new file mode 100644 index 0000000..fdb1ae5 Binary files /dev/null and b/mods/marinara/textures/marinara_mussles.png differ diff --git a/mods/marinara/textures/marinara_mussles_cooked.png b/mods/marinara/textures/marinara_mussles_cooked.png new file mode 100644 index 0000000..f36ce6c Binary files /dev/null and b/mods/marinara/textures/marinara_mussles_cooked.png differ diff --git a/mods/marinara/textures/marinara_mussles_inv.png b/mods/marinara/textures/marinara_mussles_inv.png new file mode 100644 index 0000000..190743d Binary files /dev/null and b/mods/marinara/textures/marinara_mussles_inv.png differ diff --git a/mods/marinara/textures/marinara_nautic_door.png b/mods/marinara/textures/marinara_nautic_door.png new file mode 100644 index 0000000..15f91ac Binary files /dev/null and b/mods/marinara/textures/marinara_nautic_door.png differ diff --git a/mods/marinara/textures/marinara_nautic_trapdoor.png b/mods/marinara/textures/marinara_nautic_trapdoor.png new file mode 100644 index 0000000..2e18431 Binary files /dev/null and b/mods/marinara/textures/marinara_nautic_trapdoor.png differ diff --git a/mods/marinara/textures/marinara_nautic_trapdoor_side.png b/mods/marinara/textures/marinara_nautic_trapdoor_side.png new file mode 100644 index 0000000..359ac15 Binary files /dev/null and b/mods/marinara/textures/marinara_nautic_trapdoor_side.png differ diff --git a/mods/marinara/textures/marinara_oisterbank.png b/mods/marinara/textures/marinara_oisterbank.png new file mode 100644 index 0000000..73aff30 Binary files /dev/null and b/mods/marinara/textures/marinara_oisterbank.png differ diff --git a/mods/marinara/textures/marinara_rawoisters.png b/mods/marinara/textures/marinara_rawoisters.png new file mode 100644 index 0000000..4c9aca3 Binary files /dev/null and b/mods/marinara/textures/marinara_rawoisters.png differ diff --git a/mods/marinara/textures/marinara_reed.png b/mods/marinara/textures/marinara_reed.png new file mode 100644 index 0000000..cb45a87 Binary files /dev/null and b/mods/marinara/textures/marinara_reed.png differ diff --git a/mods/marinara/textures/marinara_reed_node.png b/mods/marinara/textures/marinara_reed_node.png new file mode 100644 index 0000000..e0c52b5 Binary files /dev/null and b/mods/marinara/textures/marinara_reed_node.png differ diff --git a/mods/marinara/textures/marinara_reed_node_top.png b/mods/marinara/textures/marinara_reed_node_top.png new file mode 100644 index 0000000..442ae9d Binary files /dev/null and b/mods/marinara/textures/marinara_reed_node_top.png differ diff --git a/mods/marinara/textures/marinara_reed_root.png b/mods/marinara/textures/marinara_reed_root.png new file mode 100644 index 0000000..43de22f Binary files /dev/null and b/mods/marinara/textures/marinara_reed_root.png differ diff --git a/mods/marinara/textures/marinara_sea worm.png b/mods/marinara/textures/marinara_sea worm.png new file mode 100644 index 0000000..76b0a0c Binary files /dev/null and b/mods/marinara/textures/marinara_sea worm.png differ diff --git a/mods/marinara/textures/marinara_sea worm2.png b/mods/marinara/textures/marinara_sea worm2.png new file mode 100644 index 0000000..60fab8b Binary files /dev/null and b/mods/marinara/textures/marinara_sea worm2.png differ diff --git a/mods/marinara/textures/marinara_sea worm3.png b/mods/marinara/textures/marinara_sea worm3.png new file mode 100644 index 0000000..20917bc Binary files /dev/null and b/mods/marinara/textures/marinara_sea worm3.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle.png b/mods/marinara/textures/marinara_seaanemone_tentacle.png new file mode 100644 index 0000000..9ee5ee5 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle2.png b/mods/marinara/textures/marinara_seaanemone_tentacle2.png new file mode 100644 index 0000000..ebaa1fe Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle2.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle2_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle2_inv.png new file mode 100644 index 0000000..1c11f75 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle2_inv.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle3.png b/mods/marinara/textures/marinara_seaanemone_tentacle3.png new file mode 100644 index 0000000..95bc013 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle3.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle3_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle3_inv.png new file mode 100644 index 0000000..10edde9 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle3_inv.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle4.png b/mods/marinara/textures/marinara_seaanemone_tentacle4.png new file mode 100644 index 0000000..9f50cfa Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle4.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle4_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle4_inv.png new file mode 100644 index 0000000..6ed4cbb Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle4_inv.png differ diff --git a/mods/marinara/textures/marinara_seaanemone_tentacle_inv.png b/mods/marinara/textures/marinara_seaanemone_tentacle_inv.png new file mode 100644 index 0000000..54a9d02 Binary files /dev/null and b/mods/marinara/textures/marinara_seaanemone_tentacle_inv.png differ diff --git a/mods/marinara/textures/marinara_seagrass.png b/mods/marinara/textures/marinara_seagrass.png new file mode 100644 index 0000000..bca7214 Binary files /dev/null and b/mods/marinara/textures/marinara_seagrass.png differ diff --git a/mods/marinara/textures/marinara_seagrass_inv.png b/mods/marinara/textures/marinara_seagrass_inv.png new file mode 100644 index 0000000..fd7a5d1 Binary files /dev/null and b/mods/marinara/textures/marinara_seagrass_inv.png differ diff --git a/mods/marinara/textures/marinara_seagrass_top.png b/mods/marinara/textures/marinara_seagrass_top.png new file mode 100644 index 0000000..f5a7331 Binary files /dev/null and b/mods/marinara/textures/marinara_seagrass_top.png differ diff --git a/mods/marinara/textures/marinara_seapocks.png b/mods/marinara/textures/marinara_seapocks.png new file mode 100644 index 0000000..00bd058 Binary files /dev/null and b/mods/marinara/textures/marinara_seapocks.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile.png b/mods/marinara/textures/marinara_seashellmobile.png new file mode 100644 index 0000000..f9fb883 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_broken.png b/mods/marinara/textures/marinara_seashellmobile_broken.png new file mode 100644 index 0000000..c707703 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_broken.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_brown.png b/mods/marinara/textures/marinara_seashellmobile_brown.png new file mode 100644 index 0000000..6946716 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_brown.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_orange.png b/mods/marinara/textures/marinara_seashellmobile_orange.png new file mode 100644 index 0000000..eb3145c Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_orange.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_pink.png b/mods/marinara/textures/marinara_seashellmobile_pink.png new file mode 100644 index 0000000..6d50ca3 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_pink.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_white.png b/mods/marinara/textures/marinara_seashellmobile_white.png new file mode 100644 index 0000000..73d44d6 Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_white.png differ diff --git a/mods/marinara/textures/marinara_seashellmobile_yellow.png b/mods/marinara/textures/marinara_seashellmobile_yellow.png new file mode 100644 index 0000000..32193ad Binary files /dev/null and b/mods/marinara/textures/marinara_seashellmobile_yellow.png differ diff --git a/mods/marinara/textures/marinara_seashells.png b/mods/marinara/textures/marinara_seashells.png new file mode 100644 index 0000000..4583289 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells.png differ diff --git a/mods/marinara/textures/marinara_seashells_broken.png b/mods/marinara/textures/marinara_seashells_broken.png new file mode 100644 index 0000000..3ce5cc4 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_broken.png differ diff --git a/mods/marinara/textures/marinara_seashells_brown.png b/mods/marinara/textures/marinara_seashells_brown.png new file mode 100644 index 0000000..200cfd5 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_brown.png differ diff --git a/mods/marinara/textures/marinara_seashells_orange.png b/mods/marinara/textures/marinara_seashells_orange.png new file mode 100644 index 0000000..6242018 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_orange.png differ diff --git a/mods/marinara/textures/marinara_seashells_pink.png b/mods/marinara/textures/marinara_seashells_pink.png new file mode 100644 index 0000000..8f96200 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_pink.png differ diff --git a/mods/marinara/textures/marinara_seashells_white.png b/mods/marinara/textures/marinara_seashells_white.png new file mode 100644 index 0000000..5098989 Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_white.png differ diff --git a/mods/marinara/textures/marinara_seashells_yellow.png b/mods/marinara/textures/marinara_seashells_yellow.png new file mode 100644 index 0000000..aa9828f Binary files /dev/null and b/mods/marinara/textures/marinara_seashells_yellow.png differ diff --git a/mods/marinara/textures/marinara_seaworm.png b/mods/marinara/textures/marinara_seaworm.png new file mode 100644 index 0000000..d6420e2 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm.png differ diff --git a/mods/marinara/textures/marinara_seaworm2.png b/mods/marinara/textures/marinara_seaworm2.png new file mode 100644 index 0000000..e053455 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm2.png differ diff --git a/mods/marinara/textures/marinara_seaworm2_inv.png b/mods/marinara/textures/marinara_seaworm2_inv.png new file mode 100644 index 0000000..dc28fd9 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm2_inv.png differ diff --git a/mods/marinara/textures/marinara_seaworm3.png b/mods/marinara/textures/marinara_seaworm3.png new file mode 100644 index 0000000..cda45f1 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm3.png differ diff --git a/mods/marinara/textures/marinara_seaworm3_inv.png b/mods/marinara/textures/marinara_seaworm3_inv.png new file mode 100644 index 0000000..820514a Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm3_inv.png differ diff --git a/mods/marinara/textures/marinara_seaworm_inv.png b/mods/marinara/textures/marinara_seaworm_inv.png new file mode 100644 index 0000000..f4bfbe2 Binary files /dev/null and b/mods/marinara/textures/marinara_seaworm_inv.png differ diff --git a/mods/marinara/textures/marinara_softcoral.png b/mods/marinara/textures/marinara_softcoral.png new file mode 100644 index 0000000..0119b3b Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral.png differ diff --git a/mods/marinara/textures/marinara_softcoral_brown.png b/mods/marinara/textures/marinara_softcoral_brown.png new file mode 100644 index 0000000..cae94ae Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_brown.png differ diff --git a/mods/marinara/textures/marinara_softcoral_brown_inv.png b/mods/marinara/textures/marinara_softcoral_brown_inv.png new file mode 100644 index 0000000..00dad84 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_brown_inv.png differ diff --git a/mods/marinara/textures/marinara_softcoral_green.png b/mods/marinara/textures/marinara_softcoral_green.png new file mode 100644 index 0000000..d59ceae Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_green.png differ diff --git a/mods/marinara/textures/marinara_softcoral_red.png b/mods/marinara/textures/marinara_softcoral_red.png new file mode 100644 index 0000000..d266423 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_red.png differ diff --git a/mods/marinara/textures/marinara_softcoral_white.png b/mods/marinara/textures/marinara_softcoral_white.png new file mode 100644 index 0000000..65ff9d3 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_white.png differ diff --git a/mods/marinara/textures/marinara_softcoral_white_inv.png b/mods/marinara/textures/marinara_softcoral_white_inv.png new file mode 100644 index 0000000..63bce81 Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_white_inv.png differ diff --git a/mods/marinara/textures/marinara_softcoral_yellow.png b/mods/marinara/textures/marinara_softcoral_yellow.png new file mode 100644 index 0000000..d82685f Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_yellow.png differ diff --git a/mods/marinara/textures/marinara_softcoral_yellow_inv.png b/mods/marinara/textures/marinara_softcoral_yellow_inv.png new file mode 100644 index 0000000..c2a215c Binary files /dev/null and b/mods/marinara/textures/marinara_softcoral_yellow_inv.png differ diff --git a/mods/marinara/textures/marinara_wooden_door.png b/mods/marinara/textures/marinara_wooden_door.png new file mode 100644 index 0000000..8307f7f Binary files /dev/null and b/mods/marinara/textures/marinara_wooden_door.png differ diff --git a/mods/marinara/textures/marinara_wooden_trapdoor.png b/mods/marinara/textures/marinara_wooden_trapdoor.png new file mode 100644 index 0000000..d5e481c Binary files /dev/null and b/mods/marinara/textures/marinara_wooden_trapdoor.png differ diff --git a/mods/marinara/textures/marinara_wooden_trapdoor_side.png b/mods/marinara/textures/marinara_wooden_trapdoor_side.png new file mode 100644 index 0000000..fe9a681 Binary files /dev/null and b/mods/marinara/textures/marinara_wooden_trapdoor_side.png differ diff --git a/mods/marinaramobs/LICENSE b/mods/marinaramobs/LICENSE new file mode 100644 index 0000000..7e51ea5 --- /dev/null +++ b/mods/marinaramobs/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +The dolphin sounds are from freesound.org under Creative Commons License. Thanks to forpus, geraldfiebig and abrez. + + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2022 +Textures and Models by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2022 diff --git a/mods/marinaramobs/depends.txt b/mods/marinaramobs/depends.txt new file mode 100644 index 0000000..f2cff1e --- /dev/null +++ b/mods/marinaramobs/depends.txt @@ -0,0 +1,3 @@ +default +marinara +mobs \ No newline at end of file diff --git a/mods/marinaramobs/description.txt b/mods/marinaramobs/description.txt new file mode 100644 index 0000000..af74d6a --- /dev/null +++ b/mods/marinaramobs/description.txt @@ -0,0 +1 @@ +adds mobs to the marinara mod \ No newline at end of file diff --git a/mods/marinaramobs/dolphin.lua b/mods/marinaramobs/dolphin.lua new file mode 100644 index 0000000..7a8dcac --- /dev/null +++ b/mods/marinaramobs/dolphin.lua @@ -0,0 +1,127 @@ +local S = minetest.get_translator("marinaramobs") +local random = math.random + +mobs:register_mob("marinaramobs:dolphin", { +stepheight = 0.0, + type = "animal", + passive = true, + attack_type = "dogfight", + attack_animals = false, + attack_npcs = false, + attack_monsters = true, + owner_loyal = true, + reach = 1, + damage = 4, + hp_min = 65, + hp_max = 145, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + visual = "mesh", + mesh = "Dolphin.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturedolphin.png"}, + }, + sounds = { + random = "marinaramobs_dolphin", + attack = "marinaramobs_dolphin2", + damage = "marinaramobs_dolphin3", + death = "marinaramobs_dolphin4", + }, + makes_footstep_sound = false, + walk_velocity = 3, + run_velocity = 4, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = false, + stepheight = 0.0, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 5}, + stay_near = {{"marinara:bountychest", "marinara:bountychest2", "marinara:bountychest3", "marinara:bountychest4", "marinara:bountychest5", "marinara:bountychest6", "marinara:bountychest7", "marinara:bountychest8", "marinara:bountychest9", "marinara:bountychest10", "marinara:bountychest11", "marinara:bountychest12"}, 6}, + drops = { + {name = "mobs:meat", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + air_damage = 1, + lava_damage = 4, + light_damage = 0, + view_range = 10, + animation = { + speed_normal = 50, + stand_speed = 25, + stand_start = 0, + stand_end = 100, + fly_start = 200, + fly_end = 300, + fly2_start = 300, + fly2_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"}, + floats = 0, + follow = { + "animalworld:rawmollusk", "marinaramobs:octopus_raw", "marinara:raw_oisters", "marinara:raw_athropod", "animalworld:rawfish", "fishing:fish_raw", "fishing:pike_raw", "marinaramobs:raw_exotic_fish", "nativevillages:catfish_raw", "xocean:fish_edible", "ethereal:fish_raw", "mobs:clownfish_raw", "fishing:bluewhite_raw", "fishing:exoticfish_raw", "fishing:fish_raw", "fishing:carp_raw", "fishing:perch_raw", "water_life:meat_raw", "fishing:shark_raw", "fishing:pike_raw" + }, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 15, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:dolphin", + nodes = {"default:water_source"}, + neighbors = {"marinara:hardcoral_pink", "marinara:hardcoral_yellow"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 4, + min_height = -30, + max_height = 0, + day_toggle = true, + + on_spawn = function(self, pos) + + local nods = minetest.find_nodes_in_area_under_air( + {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, + {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, + {"default:water_source"}) + + if nods and #nods > 0 then + + -- min herd of 4 + local iter = math.min(#nods, 3) + +-- print("--- dolphin at", minetest.pos_to_string(pos), iter) + + for n = 1, iter do + + local pos2 = nods[random(#nods)] + local kid = random(4) == 1 and true or nil + + pos2.y = pos2.y + 2 + + if minetest.get_node(pos2).name == "air" then + + mobs:add_mob(pos2, { + name = "marinaramobs:dolphin", child = kid}) + end + end + end + end + }) +end + +mobs:register_egg("marinaramobs:dolphin", S("Dolphin"), "adolphin.png") diff --git a/mods/marinaramobs/hunger.lua b/mods/marinaramobs/hunger.lua new file mode 100644 index 0000000..60e1cc5 --- /dev/null +++ b/mods/marinaramobs/hunger.lua @@ -0,0 +1,17 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('marinaramobs:octopus_cooked', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('marinaramobs:octopus_raw', { + satiates = 3.0, +}) + hunger_ng.add_hunger_data('marinaramobs:raw_exotic_fish', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('marinaramobs:cooked_exotic_fish', { + satiates = 4.0, +}) + hunger_ng.add_hunger_data('marinaramobs:seaurchin_cooked', { + satiates = 1.0, + }) +end \ No newline at end of file diff --git a/mods/marinaramobs/init.lua b/mods/marinaramobs/init.lua new file mode 100644 index 0000000..2e926f9 --- /dev/null +++ b/mods/marinaramobs/init.lua @@ -0,0 +1,50 @@ +--This creates the livingcavesmobs object. +livingcavesmobs = {} + +--This creates the livingcavesmobs.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +livingcavesmobs.settings = { + clear_biomes = minetest.settings:get_bool("livingcavesmobs.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("livingcavesmobs.clear_decos") or false, + clear_ores = minetest.settings:get_bool("livingcavesmobs.clear_ores") or false, +} + +if livingcavesmobs.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if livingcavesmobs.settings.clear_decos then + minetest.clear_registered_decorations() +end +if livingcavesmobs.settings.clear_ores then + minetest.clear_registered_ores() +end + +local modname = "livingcavesmobs" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("livingcavesmobs") or + dofile(path .. "intllib.lua") + + + +-- plants +dofile(path .. "parrotfish.lua") -- +dofile(path .. "jellyfish.lua") -- +dofile(path .. "nautilus.lua") -- +dofile(path .. "octopus.lua") -- +dofile(path .. "seamouse.lua") -- +dofile(path .. "seaslug.lua") -- +dofile(path .. "seaurchin.lua") -- +dofile(path .. "starfish.lua") -- +dofile(path .. "dolphin.lua") -- +dofile(path .. "hunger.lua") -- + + + + + + +print (S("[MOD] Caves loaded")) diff --git a/mods/marinaramobs/intllib.lua b/mods/marinaramobs/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/marinaramobs/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/marinaramobs/jellyfish.lua b/mods/marinaramobs/jellyfish.lua new file mode 100644 index 0000000..08d1fd4 --- /dev/null +++ b/mods/marinaramobs/jellyfish.lua @@ -0,0 +1,83 @@ +local S = minetest.get_translator("marinaramobs") + +mobs:register_mob("marinaramobs:jellyfish", { +stepheight = 0.0, + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 4, + hp_min = 30, + hp_max = 95, + armor = 100, + collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.95, 0.3}, + visual = "mesh", + mesh = "Jellyfish.b3d", + visual_size = {x = 4.0, y = 4.0}, + textures = { + {"texturejellyfish.png"}, + }, + sounds = {}, + makes_footstep_sound = false, + sounds = { + }, + walk_velocity = 0.5, + run_velocity = 0.8, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + runaway = false, + jump = false, + stepheight = 0.0, + drops = { + }, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 2}, + water_damage = 0, + air_damage = 1, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 25, + stand_start = 0, + stand_end = 100, + fly_start = 100, + fly_end = 200, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing"}, + floats = 0, + follow = { + "mobs:meat_raw", "xocean:fish_edible", "ethereal:fish_raw", "mobs:clownfish_raw", "mobs:bluefish_raw", "fishing:bait_worm", "fishing:clownfish_raw", "fishing:bluewhite_raw", "fishing:exoticfish_raw", "fishing:fish_raw", "fishing:carp_raw", "fishing:perch_raw", "water_life:meat_raw", "fishing:jellyfish_raw", "fishing:pike_raw", "marinaramobs:octopus_raw", "marinaramobs:raw_exotic_fish", "fishing:fish_cooked", "marinaramobs:cooked_exotic_fish", "animalworld:cookedfish", "marinara:mussels", "nativevillages:catfish_cooked", "fishing:pike_cooked", "animalworld:cooked_athropod", + }, + view_range = 1, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:jellyfish", + nodes = {"default:water_source"}, + neighbors = {"marinara:sand_with_kelp", "default:sand_with_kelp"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + min_height = -30, + max_height = 0, +}) +end + +mobs:register_egg("marinaramobs:jellyfish", S("Jellyfish"), "ajellyfish.png") diff --git a/mods/marinaramobs/locale/marinaramobs.de.tr b/mods/marinaramobs/locale/marinaramobs.de.tr new file mode 100644 index 0000000..4c25b58 --- /dev/null +++ b/mods/marinaramobs/locale/marinaramobs.de.tr @@ -0,0 +1,34 @@ +# textdomain: marinaramobs + +### jellyfish.lua ### +Jellyfish=Qualle + +### nautilus.lua ### +Nautilusshell=Nautilus Schale + +### octopus.lua ### +Octopus=Oktopus +Raw Octopus=Roher Oktopus +Cooked Octopus=Gekochter Oktopus + +### parrotfish.lua ### +Parrotfish=Papageifisch +Raw Exotic Fish=Roher Exotischer Fisch +Cooked Exotic Fish=Gekochter Exotischer Fisch + +### seamouse.lua ### +Seamouse=Seemaus + +### seaslug.lua ### +Seaslug=Meeresschnecke + +### seaurchin.lua ### +Seaurchin=Seeigel +Cooked Seaurchin=Gekochter Seeigel + +### starfish.lua ### +Starfish=Seestern +Starfish Mobile=Seestern Mobile + +### dolphin.lua ### +Dolphin=Delfin \ No newline at end of file diff --git a/mods/marinaramobs/mod.conf b/mods/marinaramobs/mod.conf new file mode 100644 index 0000000..6e45a11 --- /dev/null +++ b/mods/marinaramobs/mod.conf @@ -0,0 +1,2 @@ +name = marinaramobs + diff --git a/mods/marinaramobs/models/Dolphin.b3d b/mods/marinaramobs/models/Dolphin.b3d new file mode 100644 index 0000000..5efe238 Binary files /dev/null and b/mods/marinaramobs/models/Dolphin.b3d differ diff --git a/mods/marinaramobs/models/Jellyfish.b3d b/mods/marinaramobs/models/Jellyfish.b3d new file mode 100644 index 0000000..c3bc2bc Binary files /dev/null and b/mods/marinaramobs/models/Jellyfish.b3d differ diff --git a/mods/marinaramobs/models/Nautilus.b3d b/mods/marinaramobs/models/Nautilus.b3d new file mode 100644 index 0000000..2ebb3df Binary files /dev/null and b/mods/marinaramobs/models/Nautilus.b3d differ diff --git a/mods/marinaramobs/models/Nautilusshell.b3d b/mods/marinaramobs/models/Nautilusshell.b3d new file mode 100644 index 0000000..9eaf482 Binary files /dev/null and b/mods/marinaramobs/models/Nautilusshell.b3d differ diff --git a/mods/marinaramobs/models/Octopus.b3d b/mods/marinaramobs/models/Octopus.b3d new file mode 100644 index 0000000..70a1377 Binary files /dev/null and b/mods/marinaramobs/models/Octopus.b3d differ diff --git a/mods/marinaramobs/models/Parrotfish.b3d b/mods/marinaramobs/models/Parrotfish.b3d new file mode 100644 index 0000000..b9e5559 Binary files /dev/null and b/mods/marinaramobs/models/Parrotfish.b3d differ diff --git a/mods/marinaramobs/models/Seamouse.b3d b/mods/marinaramobs/models/Seamouse.b3d new file mode 100644 index 0000000..d15a940 Binary files /dev/null and b/mods/marinaramobs/models/Seamouse.b3d differ diff --git a/mods/marinaramobs/models/Seasnail.b3d b/mods/marinaramobs/models/Seasnail.b3d new file mode 100644 index 0000000..fe4c5c5 Binary files /dev/null and b/mods/marinaramobs/models/Seasnail.b3d differ diff --git a/mods/marinaramobs/models/Seaurchin.b3d b/mods/marinaramobs/models/Seaurchin.b3d new file mode 100644 index 0000000..41f7eea Binary files /dev/null and b/mods/marinaramobs/models/Seaurchin.b3d differ diff --git a/mods/marinaramobs/models/Starfish.b3d b/mods/marinaramobs/models/Starfish.b3d new file mode 100644 index 0000000..b864c30 Binary files /dev/null and b/mods/marinaramobs/models/Starfish.b3d differ diff --git a/mods/marinaramobs/nautilus.lua b/mods/marinaramobs/nautilus.lua new file mode 100644 index 0000000..faac893 --- /dev/null +++ b/mods/marinaramobs/nautilus.lua @@ -0,0 +1,142 @@ +local S = minetest.get_translator("marinaramobs") +local random = math.random + +mobs:register_mob("marinaramobs:nautilus", { +stepheight = 0.0, + type = "animal", + passive = true, + attack_type = "dogfight", + attack_animals = false, + reach = 1, + damage = 1, + hp_min = 5, + hp_max = 25, + armor = 100, + collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.5, 0.2}, + visual = "mesh", + visual_size = {x = 2.0, y = 2.0}, + mesh = "Nautilus.b3d", + textures = { + {"texturenautilus.png"}, + }, + sounds = {}, + makes_footstep_sound = false, + walk_velocity = 1, + run_velocity = 1, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "player", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = false, + stepheight = 0.0, + drops = { + {name = "marinaramobs:nautilushell", chance = 1, min = 0, max = 1}, + }, + water_damage = 0, + air_damage = 1, + lava_damage = 4, + light_damage = 0, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 4}, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + fly_start = 100, -- swim animation + fly_end = 200, + die_start = 100, + die_end = 200, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"}, + floats = 0, + follow = { + "fishing:bait_worm", + "animalworld:raw_athropod", "animalworld:rawfish", "ethereal:fish_raw", "animalworld:fishfood", "mobs_fish:tropical", "water_life:meat_raw", "marinaramobs:octopus_raw", "marinaramobs:raw_exotic_fish" + }, + view_range = 5, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:nautilus", + nodes = {"default:water_source"}, {"default:river_water_source"}, + neighbors = {"marinara:sand_with_kelp"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 3, + min_height = -30, + max_height = 0, + day_toggle = true, + + on_spawn = function(self, pos) + + local nods = minetest.find_nodes_in_area_under_air( + {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, + {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, + {"default:water_source", "default:river_water_source"}) + + if nods and #nods > 0 then + + -- min herd of 3 + local iter = math.min(#nods, 3) + +-- print("--- nautilus at", minetest.pos_to_string(pos), iter) + + for n = 1, iter do + + local pos2 = nods[random(#nods)] + local kid = random(4) == 1 and true or nil + + pos2.y = pos2.y + 2 + + if minetest.get_node(pos2).name == "air" then + + mobs:add_mob(pos2, { + name = "marinaramobs:nautilus", child = kid}) + end + end + end + end + }) +end + +mobs:register_egg("marinaramobs:nautilus", ("Nautilus"), "anautilus.png") + +minetest.register_node("marinaramobs:nautilushell", { + description = S"Nautilusshell", + visual_scale = 0.6, + mesh = "Nautilusshell.b3d", + tiles = {"marinaramobs_nautilusshell.png"}, + inventory_image = "marinaramobs_nautilusshellinv.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.4, -0.45, -0.4, 0.4, 0.15, 0.4}, + --[[{-0.4, -0.45, -0.4, 0.4, 0.15, 0.4}, + {-0.4, -0.45, -0.4, 0.4, 0.15, 0.4}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.4, -0.45, -0.4, 0.4, 0.15, 0.4} + } + }, + sounds = default.node_sound_wood_defaults() +}) diff --git a/mods/marinaramobs/octopus.lua b/mods/marinaramobs/octopus.lua new file mode 100644 index 0000000..4f9732f --- /dev/null +++ b/mods/marinaramobs/octopus.lua @@ -0,0 +1,144 @@ +local S = minetest.get_translator("marinaramobs") + +mobs:register_mob("marinaramobs:octopus", { +stepheight = 0.0, + type = "monster", + passive = false, + attack_animals = true, + attack_npcs = true, + reach = 2, + damage = 5, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 3, + dogshoot_count2_max = 5, + shoot_interval = 1, + arrow = "marinara:octopusink", + shoot_offset = 0.8, + hp_min = 60, + hp_max = 95, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Octopus.b3d", + visual_size = {x = 0.5, y = 0.5}, + textures = { + {"textureoctopus.png"}, + }, + sounds = {}, + makes_footstep_sound = false, + sounds = { + attack = "marinaramobs_octopus", + }, + walk_velocity = 1, + run_velocity = 2, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + runaway = false, + jump = false, + stepheight = 0.0, + stay_near = {{"marinara:bountychest", "marinara:bountychest2", "marinara:bountychest3", "marinara:bountychest4", "marinara:bountychest5", "marinara:bountychest6", "marinara:bountychest7", "marinara:bountychest8", "marinara:bountychest9", "marinara:bountychest10", "marinara:bountychest11", "marinara:bountychest12", "marinara:hardcoral", "marinara:seapocks"}, 4}, + drops = { + {name = "marinaramobs:octopus_raw", chance = 1, min = 0, max = 1}, + {name = "dye:black", chance = 1, min = 0, max = 1}, + }, + water_damage = 0, + air_damage = 1, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + fly_start = 100, + fly_end = 200, + punch_start = 200, + punch_end = 300, + shoot_start = 200, + shoot_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing"}, + floats = 0, + follow = { + "mobs:meat_raw", "xocean:fish_edible", "ethereal:fish_raw", "mobs:clownfish_raw", "mobs:bluefish_raw", "fishing:bait_worm", "fishing:clownfish_raw", "fishing:bluewhite_raw", "fishing:exoticfish_raw", "fishing:fish_raw", "fishing:carp_raw", "fishing:perch_raw", "water_life:meat_raw", "fishing:octopus_raw", "fishing:pike_raw", "marinaramobs:octopus_raw", "marinaramobs:raw_exotic_fish" + }, + view_range = 6, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:octopus", + nodes = {"default:water_source"}, + neighbors = {"marinara:bountychest", "marinara:bountychest2", "marinara:bountychest3", "marinara:bountychest4", "marinara:bountychest5", "marinara:bountychest6", "marinara:bountychest7", "marinara:bountychest8", "marinara:bountychest9", "marinara:bountychest10", "marinara:bountychest11"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + min_height = -30, + max_height = 0, +}) + +mobs:register_egg("marinaramobs:octopus", S("Octopus"), "aoctopus.png") + +mobs:register_arrow("marinaramobs:octopusink", { + visual = "sprite", + visual_size = {x=.10, y=.10}, + textures = {"marinaramobs_octopusink.png"}, + velocity = 12, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) + + +-- raw octopus +minetest.register_craftitem("marinaramobs:octopus_raw", { + description = S("Raw Octopus"), + inventory_image = "marinaramobs_octopus_raw.png", + on_use = minetest.item_eat(3), + groups = {food_meat_raw = 1, flammable = 2}, +}) + +-- cooked octopus +minetest.register_craftitem("marinaramobs:octopus_cooked", { + description = S("Cooked Octopus"), + inventory_image = "marinaramobs_octopus_cooked.png", + on_use = minetest.item_eat(5), + groups = {food_meat = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "marinaramobs:octopus_cooked", + recipe = "marinaramobs:octopus_raw", + cooktime = 5, +}) +end diff --git a/mods/marinaramobs/parrotfish.lua b/mods/marinaramobs/parrotfish.lua new file mode 100644 index 0000000..2b4ac4c --- /dev/null +++ b/mods/marinaramobs/parrotfish.lua @@ -0,0 +1,143 @@ +local S = minetest.get_translator("marinaramobs") +local random = math.random + +mobs:register_mob("marinaramobs:parrotfish", { +stepheight = 0.0, + type = "animal", + passive = true, + attack_type = "dogfight", + attack_animals = false, + reach = 1, + damage = 1, + hp_min = 25, + hp_max = 45, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + visual = "mesh", + mesh = "Parrotfish.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"textureparrotfish.png"}, + }, + sounds = {}, + makes_footstep_sound = false, + walk_velocity = 0.5, + run_velocity = 1, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "player", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = false, + stepheight = 0.0, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 4}, + drops = { + {name = "marinaramobs:rawfish", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + air_damage = 1, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 100, + stand_speed = 50, + stand_start = 0, + stand_end = 100, + stand2_speed = 50, + stand2_start = 100, + stand2_end = 200, + fly_start = 200, + fly_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"}, + floats = 0, + follow = { + "marinara:seagrass", "marinara:seagrass2", "marinara:sand_with_seagrass", + "marinara:sand_with_seagrass2", "marinara:alage", "marinara:sand_with_alage", "default:kelp", "default:sand_with_kelp" + }, + view_range = 5, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:parrotfish", + nodes = {"default:water_source"}, + neighbors = {"marinara:hardcoral", "marinara:hardcoral_green"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 3, + min_height = -30, + max_height = 0, + day_toggle = true, + + on_spawn = function(self, pos) + + local nods = minetest.find_nodes_in_area_under_air( + {x = pos.x - 4, y = pos.y - 3, z = pos.z - 4}, + {x = pos.x + 4, y = pos.y + 3, z = pos.z + 4}, + {"default:water_source"}) + + if nods and #nods > 0 then + + -- min herd of 3 + local iter = math.min(#nods, 3) + +-- print("--- parrotfish at", minetest.pos_to_string(pos), iter) + + for n = 1, iter do + + local pos2 = nods[random(#nods)] + local kid = random(4) == 1 and true or nil + + pos2.y = pos2.y + 2 + + if minetest.get_node(pos2).name == "air" then + + mobs:add_mob(pos2, { + name = "marinaramobs:parrotfish", child = kid}) + end + end + end + end + }) +end + +mobs:register_egg("marinaramobs:parrotfish", S("Parrotfish"), "aparrotfish.png") + +-- raw fish +minetest.register_craftitem(":marinaramobs:raw_exotic_fish", { + description = S("Raw Exotic Fish"), + inventory_image = "marinaramobs_exotic_fish_raw.png", + on_use = minetest.item_eat(3), + groups = {food_meat_raw = 1, flammable = 2}, +}) + +-- cooked fish +minetest.register_craftitem(":marinaramobs:cooked_exotic_fish", { + description = S("Cooked Exotic Fish"), + inventory_image = "marinaramobs_exotic_fish_cooked.png", + on_use = minetest.item_eat(5), + groups = {food_meat = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "marinaramobs:cooked_exotic_fish", + recipe = "marinaramobs:raw_exotic_fish", + cooktime = 5, +}) + diff --git a/mods/marinaramobs/screenshot.png b/mods/marinaramobs/screenshot.png new file mode 100644 index 0000000..03f66f3 Binary files /dev/null and b/mods/marinaramobs/screenshot.png differ diff --git a/mods/marinaramobs/seamouse.lua b/mods/marinaramobs/seamouse.lua new file mode 100644 index 0000000..663d209 --- /dev/null +++ b/mods/marinaramobs/seamouse.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("marinaramobs") + +mobs:register_mob("marinaramobs:seamouse", { +stepheight = 1, + type = "animal", + passive = true, + reach = 1, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 10, + hp_max = 40, + armor = 100, + collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.2, 0.2}, + visual = "mesh", + mesh = "Seamouse.b3d", + drawtype = "front", + textures = { + {"textureseamouse.png"}, + + }, + sounds = { + }, + makes_footstep_sound = false, + walk_velocity = 0.3, + run_velocity = 0.5, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "player", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = false, + jump_height = 6, + drops = { + }, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 5}, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 200, + stand2_end = 300, + walk_start = 100, + walk_end = 200, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:water_flowing"}, + floats = 0, + follow = {"animalworld:rawfish", "mobs_fish:tropical", "mobs:clownfish_raw", +"mobs:bluefish_raw", "fishing:bait_worm", "fishing:clownfish_raw", "fishing:bluewhite_raw", "fishing:exoticfish_raw", "fishing:fish_raw", "fishing:carp_raw", "fishing:perch_raw", "water_life:meat_raw", "fishing:shark_raw", "fishing:pike_raw", "marinaramobs:octopus_raw", "marinaramobs:raw_exotic_fish"}, + view_range = 5, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:seamouse", + nodes = {"default:water_source"}, + neighbors = {"marinara:coastrock"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 2, + min_height = -30, + max_height = 0, +}) +end + + +mobs:register_egg("marinaramobs:seamouse", S("Seamouse"), "aseamouse.png", 0) + + +mobs:alias_mob("marinaramobs:seamouse", "marinaramobs:seamouse") -- compatibility diff --git a/mods/marinaramobs/seaslug.lua b/mods/marinaramobs/seaslug.lua new file mode 100644 index 0000000..f16dfa2 --- /dev/null +++ b/mods/marinaramobs/seaslug.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("marinaramobs") + +mobs:register_mob("marinaramobs:seaslug", { +stepheight = 1, + type = "animal", + passive = true, + reach = 1, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 10, + hp_max = 40, + armor = 100, + collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.2, 0.2}, + visual = "mesh", + mesh = "Seasnail.b3d", + drawtype = "front", + textures = { + {"textureseasnail.png"}, + + }, + sounds = { + }, + makes_footstep_sound = false, + walk_velocity = 0.4, + run_velocity = 0.6, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "player", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = false, + jump_height = 6, + drops = { + }, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 5}, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 25, + stand_start = 0, + stand_end = 100, + stand2_start = 200, + stand2_end = 300, + walk_start = 100, + walk_end = 200, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:water_flowing"}, + floats = 0, + follow = {"marinara:seagrass", "marinara:seagrass2", "marinara:sand_with_seagrass", + "marinara:sand_with_seagrass2", "marinara:alage", "marinara:sand_with_alage", "default:kelp", "default:sand_with_kelp"}, + view_range = 5, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:seaslug", + nodes = {"default:water_source"}, + neighbors = {"marinara:hardcoral_yellow", "marinara:hardcoral_red"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 2, + min_height = -30, + max_height = 0, +}) +end + + +mobs:register_egg("marinaramobs:seaslug", S("Seaslug"), "aseaslug.png", 0) + + +mobs:alias_mob("marinaramobs:seaslug", "marinaramobs:seaslug") -- compatibility diff --git a/mods/marinaramobs/seaurchin.lua b/mods/marinaramobs/seaurchin.lua new file mode 100644 index 0000000..a0b8f9a --- /dev/null +++ b/mods/marinaramobs/seaurchin.lua @@ -0,0 +1,106 @@ +local S = minetest.get_translator("marinaramobs") + +mobs:register_mob("marinaramobs:seaurchin", { +stepheight = 1, + type = "animal", + passive = false, + reach = 1, + attack_npcs = true, + attack_type = "dogfight", + group_attack = true, + attack_animals = false, + reach = 2, + damage = 4, + hp_min = 10, + hp_max = 40, + armor = 100, + visual_size = {x = 0.7, y = 0.7}, + collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.2, 0.2}, + visual = "mesh", + mesh = "Seaurchin.b3d", + drawtype = "front", + textures = { + {"textureseaurchin.png"}, + + }, + sounds = { + }, + makes_footstep_sound = false, + walk_velocity = 0.2, + run_velocity = 0.3, + runaway = false, + jump = false, + jump_height = 6, + drops = { + {name = "marinaramobs:seaurchin", chance = 1, min = 0, max = 1}, + }, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 5}, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 25, + stand_start = 100, + stand_end = 200, + stand2_start = 200, + stand2_end = 300, + walk_start = 0, + walk_end = 100, + punch_start = 0, + punch_end = 100, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:water_flowing"}, + floats = 0, + follow = {"marinara:seagrass", "marinara:seagrass2", "marinara:sand_with_seagrass", + "marinara:sand_with_seagrass2", "marinara:alage", "marinara:sand_with_alage", "default:kelp", "default:sand_with_kelp", "animalworld:rawfish", "mobs_fish:tropical", "mobs:clownfish_raw", +"mobs:bluefish_raw", "fishing:bait_worm", "fishing:clownfish_raw", "fishing:bluewhite_raw", "fishing:exoticfish_raw", "fishing:fish_raw", "fishing:carp_raw", "fishing:perch_raw", "water_life:meat_raw", "fishing:shark_raw", "fishing:pike_raw", "marinaramobs:octopus_raw", "marinaramobs:raw_exotic_fish"}, + view_range = 5, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:seaurchin", + nodes = {"default:water_source"}, + neighbors = {"marinara:coastrock_alage"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 2, + min_height = -30, + max_height = 0, +}) +end + + +mobs:register_egg("marinaramobs:seaurchin", S("Seaurchin"), "aseaurchin.png", 0) + + +mobs:alias_mob("marinaramobs:seaurchin", "marinaramobs:seaurchin") -- compatibility + +minetest.register_craftitem(":marinaramobs:seaurchin_cooked", { + description = S("Cooked Seaurchin"), + inventory_image = "marinaramobs_seaurchin_cooked.png", + on_use = minetest.item_eat(8), + groups = {food_meat = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "marinaramobs:seaurchin_cooked", + recipe = "marinaramobs:seaurchin", + cooktime = 2, +}) + + diff --git a/mods/marinaramobs/sounds/marinaramobs_dolphin.ogg b/mods/marinaramobs/sounds/marinaramobs_dolphin.ogg new file mode 100644 index 0000000..a3375ef Binary files /dev/null and b/mods/marinaramobs/sounds/marinaramobs_dolphin.ogg differ diff --git a/mods/marinaramobs/sounds/marinaramobs_dolphin2.ogg b/mods/marinaramobs/sounds/marinaramobs_dolphin2.ogg new file mode 100644 index 0000000..46cdbde Binary files /dev/null and b/mods/marinaramobs/sounds/marinaramobs_dolphin2.ogg differ diff --git a/mods/marinaramobs/sounds/marinaramobs_dolphin3.ogg b/mods/marinaramobs/sounds/marinaramobs_dolphin3.ogg new file mode 100644 index 0000000..05b166b Binary files /dev/null and b/mods/marinaramobs/sounds/marinaramobs_dolphin3.ogg differ diff --git a/mods/marinaramobs/sounds/marinaramobs_dolphin4.ogg b/mods/marinaramobs/sounds/marinaramobs_dolphin4.ogg new file mode 100644 index 0000000..2e19ad2 Binary files /dev/null and b/mods/marinaramobs/sounds/marinaramobs_dolphin4.ogg differ diff --git a/mods/marinaramobs/starfish.lua b/mods/marinaramobs/starfish.lua new file mode 100644 index 0000000..997196f --- /dev/null +++ b/mods/marinaramobs/starfish.lua @@ -0,0 +1,115 @@ +local S = minetest.get_translator("marinaramobs") + +mobs:register_mob("marinaramobs:starfish", { +stepheight = 1, + type = "animal", + passive = true, + reach = 1, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 10, + hp_max = 40, + armor = 100, + collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.2, 0.2}, + visual = "mesh", + mesh = "Starfish.b3d", + drawtype = "front", + textures = { + {"texturestarfish.png"}, + + }, + sounds = { + }, + makes_footstep_sound = false, + walk_velocity = 0.2, + run_velocity = 0.4, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "player", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = false, + jump_height = 6, + drops = { + {name = "marinaramobs:starfish", chance = 1, min = 0, max = 1}, + }, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay", "marinara:softcoral_red", "marinara:softcoral_white", "marinara:softcoral_green", "marinara:softcoral_white", "marinara:softcoral_green", "default:coral_cyan", "default:coral_pink", "default:coral_green"}, 5}, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 25, + stand_start = 100, + stand_end = 200, + stand2_start = 200, + stand2_end = 300, + walk_start = 0, + walk_end = 100, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:water_flowing"}, + floats = 0, + follow = {"animalworld:rawfish", "mobs_fish:tropical", "mobs:clownfish_raw", +"mobs:bluefish_raw", "fishing:bait_worm", "fishing:clownfish_raw", "fishing:bluewhite_raw", "fishing:exoticfish_raw", "fishing:fish_raw", "fishing:carp_raw", "fishing:perch_raw", "water_life:meat_raw", "fishing:shark_raw", "fishing:pike_raw", "marinaramobs:octopus_raw", "marinaramobs:raw_exotic_fish"}, + view_range = 5, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_marinaramobs then +mobs:spawn({ + name = "marinaramobs:starfish", + nodes = {"default:water_source"}, + neighbors = {"marinara:coastrock"}, + min_light = 0, + interval = 60, + chance = 2, + active_object_count = 3, + min_height = -30, + max_height = 0, +}) + + +mobs:register_egg("marinaramobs:starfish", S("Starfish"), "astarfish.png", 0) + + +mobs:alias_mob("marinaramobs:starfish", "marinaramobs:starfish") -- compatibility + +minetest.register_craft({ + output = "marinaramobs:starfishmobile", + type = "shapeless", + recipe = + {"marinaramobs:starfish", "farming:string"} + +}) + +minetest.register_node("marinaramobs:starfishmobile", { + description = S("Starfish Mobile"), + drawtype = "plantlike", + waving = 0, + tiles = {"marinaramobs_starfishmobile.png"}, + inventory_image = "marinaramobs_starfishmobile.png", + wield_image = "marinaramobs_starfishmobile.png", + paramtype = "light", + sunlight_propagates = true, + climbable = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) +end \ No newline at end of file diff --git a/mods/marinaramobs/textures/adolphin.png b/mods/marinaramobs/textures/adolphin.png new file mode 100644 index 0000000..e13fa05 Binary files /dev/null and b/mods/marinaramobs/textures/adolphin.png differ diff --git a/mods/marinaramobs/textures/ajellyfish.png b/mods/marinaramobs/textures/ajellyfish.png new file mode 100644 index 0000000..2db4d53 Binary files /dev/null and b/mods/marinaramobs/textures/ajellyfish.png differ diff --git a/mods/marinaramobs/textures/anautilus.png b/mods/marinaramobs/textures/anautilus.png new file mode 100644 index 0000000..e5b845b Binary files /dev/null and b/mods/marinaramobs/textures/anautilus.png differ diff --git a/mods/marinaramobs/textures/aoctopus.png b/mods/marinaramobs/textures/aoctopus.png new file mode 100644 index 0000000..79a9c37 Binary files /dev/null and b/mods/marinaramobs/textures/aoctopus.png differ diff --git a/mods/marinaramobs/textures/aparrotfish.png b/mods/marinaramobs/textures/aparrotfish.png new file mode 100644 index 0000000..becb855 Binary files /dev/null and b/mods/marinaramobs/textures/aparrotfish.png differ diff --git a/mods/marinaramobs/textures/aseamouse.png b/mods/marinaramobs/textures/aseamouse.png new file mode 100644 index 0000000..fbd401c Binary files /dev/null and b/mods/marinaramobs/textures/aseamouse.png differ diff --git a/mods/marinaramobs/textures/aseaslug.png b/mods/marinaramobs/textures/aseaslug.png new file mode 100644 index 0000000..26dab33 Binary files /dev/null and b/mods/marinaramobs/textures/aseaslug.png differ diff --git a/mods/marinaramobs/textures/aseaurchin.png b/mods/marinaramobs/textures/aseaurchin.png new file mode 100644 index 0000000..956a2b3 Binary files /dev/null and b/mods/marinaramobs/textures/aseaurchin.png differ diff --git a/mods/marinaramobs/textures/astarfish.png b/mods/marinaramobs/textures/astarfish.png new file mode 100644 index 0000000..2318e90 Binary files /dev/null and b/mods/marinaramobs/textures/astarfish.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_exotic_fish_cooked.png b/mods/marinaramobs/textures/marinaramobs_exotic_fish_cooked.png new file mode 100644 index 0000000..b812f98 Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_exotic_fish_cooked.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_exotic_fish_raw.png b/mods/marinaramobs/textures/marinaramobs_exotic_fish_raw.png new file mode 100644 index 0000000..877812e Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_exotic_fish_raw.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_nautilusshell.png b/mods/marinaramobs/textures/marinaramobs_nautilusshell.png new file mode 100644 index 0000000..830976a Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_nautilusshell.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_nautilusshellinv.png b/mods/marinaramobs/textures/marinaramobs_nautilusshellinv.png new file mode 100644 index 0000000..e21235a Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_nautilusshellinv.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_octopus_cooked.png b/mods/marinaramobs/textures/marinaramobs_octopus_cooked.png new file mode 100644 index 0000000..cd3f077 Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_octopus_cooked.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_octopus_raw.png b/mods/marinaramobs/textures/marinaramobs_octopus_raw.png new file mode 100644 index 0000000..d04a97f Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_octopus_raw.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_octopusink.png b/mods/marinaramobs/textures/marinaramobs_octopusink.png new file mode 100644 index 0000000..dc1e2c7 Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_octopusink.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_seaurchin_cooked.png b/mods/marinaramobs/textures/marinaramobs_seaurchin_cooked.png new file mode 100644 index 0000000..cb7066b Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_seaurchin_cooked.png differ diff --git a/mods/marinaramobs/textures/marinaramobs_starfishmobile.png b/mods/marinaramobs/textures/marinaramobs_starfishmobile.png new file mode 100644 index 0000000..ff85596 Binary files /dev/null and b/mods/marinaramobs/textures/marinaramobs_starfishmobile.png differ diff --git a/mods/marinaramobs/textures/texturedolphin.png b/mods/marinaramobs/textures/texturedolphin.png new file mode 100644 index 0000000..0c2e52d Binary files /dev/null and b/mods/marinaramobs/textures/texturedolphin.png differ diff --git a/mods/marinaramobs/textures/texturejellyfish.png b/mods/marinaramobs/textures/texturejellyfish.png new file mode 100644 index 0000000..ef6db83 Binary files /dev/null and b/mods/marinaramobs/textures/texturejellyfish.png differ diff --git a/mods/marinaramobs/textures/texturenautilus.png b/mods/marinaramobs/textures/texturenautilus.png new file mode 100644 index 0000000..830976a Binary files /dev/null and b/mods/marinaramobs/textures/texturenautilus.png differ diff --git a/mods/marinaramobs/textures/textureoctopus.png b/mods/marinaramobs/textures/textureoctopus.png new file mode 100644 index 0000000..9fdfb1f Binary files /dev/null and b/mods/marinaramobs/textures/textureoctopus.png differ diff --git a/mods/marinaramobs/textures/textureparrotfish.png b/mods/marinaramobs/textures/textureparrotfish.png new file mode 100644 index 0000000..672037f Binary files /dev/null and b/mods/marinaramobs/textures/textureparrotfish.png differ diff --git a/mods/marinaramobs/textures/textureseamouse.png b/mods/marinaramobs/textures/textureseamouse.png new file mode 100644 index 0000000..e678244 Binary files /dev/null and b/mods/marinaramobs/textures/textureseamouse.png differ diff --git a/mods/marinaramobs/textures/textureseasnail.png b/mods/marinaramobs/textures/textureseasnail.png new file mode 100644 index 0000000..8ef1792 Binary files /dev/null and b/mods/marinaramobs/textures/textureseasnail.png differ diff --git a/mods/marinaramobs/textures/textureseaurchin.png b/mods/marinaramobs/textures/textureseaurchin.png new file mode 100644 index 0000000..26696ca Binary files /dev/null and b/mods/marinaramobs/textures/textureseaurchin.png differ diff --git a/mods/marinaramobs/textures/texturestarfish.png b/mods/marinaramobs/textures/texturestarfish.png new file mode 100644 index 0000000..ac5604a Binary files /dev/null and b/mods/marinaramobs/textures/texturestarfish.png differ diff --git a/mods/moreblocks/.editorconfig b/mods/moreblocks/.editorconfig new file mode 100644 index 0000000..a41c697 --- /dev/null +++ b/mods/moreblocks/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{lua,luacheckrc}] +indent_style = tab +indent_size = 4 diff --git a/mods/moreblocks/.github/workflows/build.yml b/mods/moreblocks/.github/workflows/build.yml new file mode 100644 index 0000000..e8f4bda --- /dev/null +++ b/mods/moreblocks/.github/workflows/build.yml @@ -0,0 +1,24 @@ +name: build +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - uses: actions/setup-python@master + + - run: | + sudo apt-get update -qq + sudo apt-get install -qqq luarocks + - name: Install pre-commit + run: pip3 install pre-commit + + - name: Install LuaCheck + run: luarocks install --local luacheck + + - name: Run LuaCheck using pre-commit + run: | + pre-commit run --all-files + $HOME/.luarocks/bin/luacheck . diff --git a/mods/moreblocks/.luacheckrc b/mods/moreblocks/.luacheckrc new file mode 100644 index 0000000..a2f0a79 --- /dev/null +++ b/mods/moreblocks/.luacheckrc @@ -0,0 +1,35 @@ +std = "lua51+minetest" +unused_args = false +allow_defined_top = true +max_line_length = 999 + +stds.minetest = { + read_globals = { + "DIR_DELIM", + "minetest", + "core", + "dump", + "vector", + "nodeupdate", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + table = { + fields = { + "copy", + }, + }, + } +} + +read_globals = { + "protector", + "isprotect", + "IsPlayerNodeOwner", + "HasOwner", + "getLastOwner", + "GetNodeOwnerName", + "place_rotated", +} diff --git a/mods/moreblocks/.pre-commit-config.yaml b/mods/moreblocks/.pre-commit-config.yaml new file mode 100644 index 0000000..a52dbb2 --- /dev/null +++ b/mods/moreblocks/.pre-commit-config.yaml @@ -0,0 +1,10 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.3.0 + hooks: + - id: fix-byte-order-marker + - id: end-of-file-fixer + - id: trailing-whitespace + + - id: mixed-line-ending + args: [--fix=lf] diff --git a/mods/moreblocks/CHANGELOG.md b/mods/moreblocks/CHANGELOG.md new file mode 100644 index 0000000..a441fdb --- /dev/null +++ b/mods/moreblocks/CHANGELOG.md @@ -0,0 +1,142 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [2.2.0] - 2021-06-28 + +### Changed + +- Refactored recipe override mechanism to avoid re-coding recipes + when we only want to change the amount produced. +- [Realigned rail recipe to the changes made in Minetest Game.](https://github.com/minetest-mods/moreblocks/pull/169) + - All rail recipes (standard, power, break) were boosted by 50%. + +### Fixed + +- [Shapeless crafting recipes are now handled in redefinitions.](https://github.com/minetest-mods/moreblocks/pull/171) +- [Aliases are now resolved in Stairs+ circular saw cost calculation.](https://github.com/minetest-mods/moreblocks/pull/175) +- [Fixed strange placement behavior for non-default Stairs+ nodes.](https://github.com/minetest-mods/moreblocks/pull/168) +- [Fixed stairs placement over oddly-shaped nodes.](https://github.com/minetest-mods/moreblocks/pull/166) + +## [2.1.0] - 2020-12-14 + +### Added + +- Clean Glass versions of Trap and (Super) Glowing Glass. +- Compressed desert cobblestone. + +### Changed + +- Revised placing strategy that takes into account which side of the face + (top/bottom for horizontal, left/right for vertical placement) is being clicked. + Aux (sprint/special, default E) key can be used to place the node with the orientation + it would have if placed from the other side. + When placing nodes next to nodes of the same gategory (e.g.slab to slab) the other + node's orientation is copied, flipping it placing on top or below an upright or + upside-down node. In this case the aux key will disable the special processing of + same-category nodes. + +### Fixed + +- Revised minetest_game crafting recipe overrides to match Minetest 5.0.0 and later. + +### Removed + +- Legacy Stairs+ conversion code. + - It was only required to import worlds last edited before Q3 2013. + +## [2.0.0] - 2019-11-25 + +### Added + +- Stairs+ nodes for ice. +- `settingtypes.txt` file to allow configuring settings in the main menu. +- Polish translation. + +### Changed + +- The minimum supported Minetest version is now 5.0.0. +- Stairs+ nodes now emit one light level less compared to full nodes to make up + for their smaller visual size. + +### Fixed + +- Fixed a recipe conflict that made Centered Wooden Tiles impossible to craft. + +## [1.3.0] - 2019-03-23 + +### Changed + +- Stairs+ are now displayed in the creative inventory by default. +- Localization files now use the gettext `.po` format. +- Updated intllib support to avoid using deprecated functions. + +### Fixed + +- Node rotation now works correctly when placing Stairs+ nodes. +- Stairs+ glasslike nodes' textures are now easier to see. + +## [1.2.0] - 2018-11-24 + +### Added + +- Stairs+ nodes for `basic_materials`'s concrete, cement and brass blocks. +- Listring add for circular saw. +- **Stairs+:** New API function + `stairsplus:register_custom_subset(subset, modname, subname, recipeitem, fields)`. + +### Fixed + +- The papyrus crafting recipe override is now properly applied over the + `default` mod's recipe. +- Centered wooden tiles are now craftable. +- Wool Stairs+ nodes can no longer be used in crafting. +- The circular saw can no longer replace items from the player's inventory + when it is full. + +### Changed + +- New crafting recipes for: + - Stone Tile + - Circle Stone Bricks +- Stairs+: + - Moved definitions to `stairsplus.defs` table into a separate file. + - Moved recipe definitions to `stairsplus.register_recipes` function + into a separate file. + +## [1.1.0] - 2017-10-04 + +### Added + +- 3 new node shapes in the circular saw (thin slabs, available in + "L-shaped", "corner-shaped" and "U-shaped" variations), all with 1/16 + thickness. +- New Stairs+ nodes: + - Coral Skeleton + - Desert Sandstone, Silver Sandstone + - Desert Sandstone Brick, Silver Sandstone Brick + - Desert Sandstone Block, Silver Sandstone Block + - Obsidian Block + - Sandstone Block + - Stone Block, Desert Stone Block + - Straw + - Tin Block + - Wool (all colors) +- Other mods can now get a list of all the defined Stairs+ shapes. + +## 1.0.0 - 2017-02-19 + +- Initial versioned release. + +[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.2.0...HEAD +[2.2.0]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...v2.2.0 +[2.1.0]: https://github.com/minetest-mods/moreblocks/compare/v2.0.0...v2.1.0 +[2.0.0]: https://github.com/minetest-mods/moreblocks/compare/v1.3.0...v2.0.0 +[1.3.0]: https://github.com/minetest-mods/moreblocks/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/minetest-mods/moreblocks/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/minetest-mods/moreblocks/compare/v1.0.0...v1.1.0 diff --git a/mods/moreblocks/CONTRIBUTING.md b/mods/moreblocks/CONTRIBUTING.md new file mode 100644 index 0000000..c435731 --- /dev/null +++ b/mods/moreblocks/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# Contributing to More Blocks + +Thank you for your interest in More Blocks! Before contributing, +be sure to know about these few guidelines: + +- Contributions have to be licensed under the zlib license (or compatible) + for code, and CC BY-SA 3.0 (or compatible) for assets. +- Make sure to update the changelog, keeping the + [changelog format](http://keepachangelog.com/en/1.0.0/) we use. +- Don't bump the version yourself. Maintainers will do this when necessary. diff --git a/mods/moreblocks/LICENSE.md b/mods/moreblocks/LICENSE.md new file mode 100644 index 0000000..67f5f7f --- /dev/null +++ b/mods/moreblocks/LICENSE.md @@ -0,0 +1,13 @@ +# zlib license + +Copyright © 2011-2020 Hugo Locurcio and contributors + +**This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.** + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/mods/moreblocks/README.md b/mods/moreblocks/README.md new file mode 100644 index 0000000..f22cd09 --- /dev/null +++ b/mods/moreblocks/README.md @@ -0,0 +1,75 @@ +# More Blocks [![Build status](https://github.com/minetest-mods/moreblocks/workflows/build/badge.svg)](https://github.com/minetest-mods/moreblocks/actions) + +More Blocks for [Luanti](https://www.luanti.org/), a free and open source infinite +world block sandbox game. + +[**Forum topic**](https://forum.luanti.org/viewtopic.php?f=11&t=509) + +## Installation + +### Download the mod + +To install More Blocks, clone this Git repository into your Luanti's `mods/` +directory: + +```bash +git clone https://github.com/minetest-mods/moreblocks.git +``` + +You can also +[download a ZIP archive](https://github.com/minetest-mods/moreblocks/archive/master.zip) +of More Blocks. + +### Enable the mod + +Once you have installed More Blocks, you need to enable it in Luanti. +The procedure is as follows: + +#### Using the client's main menu + +This is the easiest way to enable More Blocks when playing in singleplayer +(or on a server hosted from a client). + +1. Start Luanti and switch to the **Local Game** tab. +2. Select the world you want to enable More Blocks in. +3. Click **Configure**, then enable `moreblocks` by double-clicking it + (or ticking the **Enabled** checkbox). +4. Save the changes, then start a game on the world you enabled More Blocks on. +5. More Blocks should now be running on your world. + +#### Using a text editor + +This is the recommended way to enable the mod on a server without using a GUI. + +1. Make sure Luanti is not currently running (otherwise, it will overwrite + the changes when exiting). +2. Open the world's `world.mt` file using a text editor. +3. Add the following line at the end of the file: + +```text +load_mod_moreblocks = true +``` + +If the line is already present in the file, then replace `false` with `true` +on that line. + +4. Save the file, then start a game on the world you enabled More Blocks on. +5. More Blocks should now be running on your world. + +## Version compatibility + +More Blocks is currently primarily tested with Luanti 5.3.0. +It may or may not work with newer or older versions. Issues arising in older +versions than 5.0.0 will generally not be fixed. + +## License + +Copyright © 2011-2020 Hugo Locurcio and contributors + +- More Blocks code is licensed under the zlib license, see + [`LICENSE.md`](LICENSE.md) for details. +- Unless otherwise specified, More Blocks textures are licensed under + [CC BY-SA 3.0 Unported](https://creativecommons.org/licenses/by-sa/3.0/). + +`moreblocks_copperpatina.png` was created by pithydon, and is licensed under +[CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/mods/moreblocks/aliases.lua b/mods/moreblocks/aliases.lua new file mode 100644 index 0000000..fb1ab91 --- /dev/null +++ b/mods/moreblocks/aliases.lua @@ -0,0 +1,105 @@ +--[[ +More Blocks: alias definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- More Blocks aliases: +core.register_alias("sweeper", "moreblocks:sweeper") +core.register_alias("circular_saw", "moreblocks:circular_saw") +core.register_alias("jungle_stick", "moreblocks:jungle_stick") + +-- Old block/item replacement: +core.register_alias("moreblocks:oerkkiblock", "default:mossycobble") +core.register_alias("moreblocks:screwdriver", "screwdriver:screwdriver") + +-- Node and item renaming: +core.register_alias("moreblocks:stone_bricks", "default:stonebrick") +core.register_alias("moreblocks:stonebrick", "default:stonebrick") +core.register_alias("moreblocks:junglewood", "default:junglewood") +core.register_alias("moreblocks:jungle_wood", "default:junglewood") +core.register_alias("moreblocks:fence_junglewood", "default:fence_junglewood") +core.register_alias("moreblocks:fence_jungle_wood", "default:fence_junglewood") +core.register_alias("moreblocks:jungle_stick", "default:stick") + +for _, t in pairs(circular_saw.names) do + core.register_alias("moreblocks:" .. t[1] .. "_jungle_wood" .. t[2], + "moreblocks:" .. t[1] .. "_junglewood" .. t[2]) +end +core.register_alias("moreblocks:horizontaltree", "moreblocks:horizontal_tree") +core.register_alias("moreblocks:horizontaljungletree", "moreblocks:horizontal_jungle_tree") +core.register_alias("moreblocks:stonesquare", "moreblocks:stone_tile") +core.register_alias("moreblocks:circlestonebrick", "moreblocks:circle_stone_bricks") +core.register_alias("moreblocks:ironstonebrick", "moreblocks:iron_stone_bricks") +core.register_alias("moreblocks:coalstone", "moreblocks:coal_stone") +core.register_alias("moreblocks:ironstone", "moreblocks:iron_stone") +core.register_alias("moreblocks:woodtile", "moreblocks:wood_tile") +core.register_alias("moreblocks:woodtile_full", "moreblocks:wood_tile_full") +core.register_alias("moreblocks:woodtile_centered", "moreblocks:wood_tile_centered") +core.register_alias("moreblocks:woodtile_up", "moreblocks:wood_tile_offset") +core.register_alias("moreblocks:wood_tile_up", "moreblocks:wood_tile_offset") +core.register_alias("moreblocks:woodtile_down", "moreblocks:wood_tile_down") +core.register_alias("moreblocks:woodtile_left", "moreblocks:wood_tile_left") +core.register_alias("moreblocks:woodtile_right", "moreblocks:wood_tile_right") +core.register_alias("moreblocks:coalglass", "moreblocks:coal_glass") +core.register_alias("moreblocks:ironglass", "moreblocks:iron_glass") +core.register_alias("moreblocks:glowglass", "moreblocks:glow_glass") +core.register_alias("moreblocks:superglowglass", "moreblocks:super_glow_glass") +core.register_alias("moreblocks:trapglass", "moreblocks:trap_glass") +core.register_alias("moreblocks:trapstone", "moreblocks:trap_stone") +core.register_alias("moreblocks:cactuschecker", "moreblocks:cactus_checker") +core.register_alias("moreblocks:coalchecker", "moreblocks:coal_checker") +core.register_alias("moreblocks:ironchecker", "moreblocks:iron_checker") +core.register_alias("moreblocks:cactusbrick", "moreblocks:cactus_brick") +core.register_alias("moreblocks:cleanglass", "moreblocks:clean_glass") +core.register_alias("moreblocks:emptybookshelf", "moreblocks:empty_bookshelf") +core.register_alias("moreblocks:junglestick", "moreblocks:jungle_stick") +core.register_alias("moreblocks:splitstonesquare","moreblocks:split_stone_tile") +core.register_alias("moreblocks:allfacestree","moreblocks:all_faces_tree") +core.register_alias("moreblocks:empty_bookshelf","moreblocks:empty_shelf") +core.register_alias("moreblocks:split_stone_tile_alt","moreblocks:checker_stone_tile") + +-- ABM for horizontal trees (fix facedir): +local horizontal_tree_convert_facedir = {7, 12, 9, 18} + +core.register_abm({ + nodenames = {"moreblocks:horizontal_tree","moreblocks:horizontal_jungle_tree"}, + interval = 1, + chance = 1, + action = function(pos, node) + if node.name == "moreblocks:horizontal_tree" then + node.name = "default:tree" + else + node.name = "default:jungletree" + end + node.param2 = node.param2 < 3 and node.param2 or 0 + core.set_node(pos, { + name = node.name, + param2 = horizontal_tree_convert_facedir[node.param2 + 1] + }) + end, +}) + +core.register_lbm({ + name = "moreblocks:reduce_wood_tile_redundancy", + nodenames = { + "moreblocks:wood_tile_left", + "moreblocks:wood_tile_down", + "moreblocks:wood_tile_right", + "moreblocks:wood_tile_flipped", + }, + action = function(pos, node) + if node.name:find("left") then + core.set_node(pos, {name = "moreblocks:wood_tile_offset", param2=1}) + elseif node.name:find("down") then + core.set_node(pos, {name = "moreblocks:wood_tile_offset", param2=2}) + elseif node.name:find("right") then + core.set_node(pos, {name = "moreblocks:wood_tile_offset", param2=3}) + else -- wood_tile_flipped + core.set_node(pos, {name = "moreblocks:wood_tile", param2=1}) + end + core.log('action', "LBM replaced " .. node.name .. + " at " .. core.pos_to_string(pos)) + end, +}) diff --git a/mods/moreblocks/circular_saw.lua b/mods/moreblocks/circular_saw.lua new file mode 100644 index 0000000..e65054d --- /dev/null +++ b/mods/moreblocks/circular_saw.lua @@ -0,0 +1,477 @@ +--[[ +More Blocks: circular saw + +Copyright © 2011-2020 Hugo Locurcio, Sokomine and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.S +local F = core.formspec_escape + +circular_saw = {} + +circular_saw.known_stairs = setmetatable({}, { + __newindex = function(k, v) + local modname = core.get_current_modname() + print(("WARNING: mod %s tried to add node %s to the circular saw manually."):format(modname, v)) + end, +}) + +if not core.features.physics_overrides_v2 then + -- Notable engine PR: #13919 + core.log("warning", "[moreblocks] Detected Luanti/Minetest < 5.8.0. Inventory handling issues may occur.") +end + + +-- This is populated by stairsplus:register_all: +circular_saw.known_nodes = {} + +-- This is populated by stairsplus:register_micro: +circular_saw.microblocks = {} + +circular_saw.names = { + {"micro", "_1"}, + {"panel", "_1"}, + {"micro", "_2"}, + {"panel", "_2"}, + {"micro", "_4"}, + {"panel", "_4"}, + {"micro", ""}, + {"panel", ""}, + + {"micro", "_12"}, + {"panel", "_12"}, + {"micro", "_14"}, + {"panel", "_14"}, + {"micro", "_15"}, + {"panel", "_15"}, + {"stair", "_outer"}, + {"stair", ""}, + + {"stair", "_inner"}, + {"slab", "_1"}, + {"slab", "_2"}, + {"slab", "_quarter"}, + {"slab", ""}, + {"slab", "_three_quarter"}, + {"slab", "_14"}, + {"slab", "_15"}, + + {"slab", "_two_sides"}, + {"slab", "_three_sides"}, + {"slab", "_three_sides_u"}, + {"stair", "_half"}, + {"stair", "_alt_1"}, + {"stair", "_alt_2"}, + {"stair", "_alt_4"}, + {"stair", "_alt"}, + + {"slope", ""}, + {"slope", "_half"}, + {"slope", "_half_raised"}, + {"slope", "_inner"}, + {"slope", "_inner_half"}, + {"slope", "_inner_half_raised"}, + {"slope", "_inner_cut"}, + {"slope", "_inner_cut_half"}, + + {"slope", "_inner_cut_half_raised"}, + {"slope", "_outer"}, + {"slope", "_outer_half"}, + {"slope", "_outer_half_raised"}, + {"slope", "_outer_cut"}, + {"slope", "_outer_cut_half"}, + {"slope", "_outer_cut_half_raised"}, + {"slope", "_cut"}, +} + +-- How many microblocks does this shape at the output inventory cost: +-- It may cause slight loss, but no gain. +function circular_saw:get_cost(inv, stackname) + local name = core.registered_aliases[stackname] or stackname + for i, item in pairs(inv:get_list("output")) do + if item:get_name() == name then + return item:get_definition()._circular_saw_cost + end + end +end + +function circular_saw:get_output_inv(modname, material, amount, max) + if (not max or max < 1 or max > 99) then max = 99 end + + local list = {} + local pos = #list + + -- If there is nothing inside, display empty inventory: + if amount < 1 then + return list + end + + for i = 1, #circular_saw.names do + local t = circular_saw.names[i] + local nodename = modname .. ":" .. t[1] .. "_" .. material .. t[2] + local def = core.registered_nodes[nodename] + if def then + local cost = def._circular_saw_cost + local balance = math.min(math.floor(amount/cost), max) + pos = pos + 1 + list[pos] = nodename .. " " .. balance + end + end + return list +end + + +-- Reset empty circular_saw after last full block has been taken out +-- (or the circular_saw has been placed the first time) +-- Note: max_offered is not reset: +function circular_saw:reset(pos) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local owned_by = meta:get_string("owner") + + if owned_by and owned_by ~= "" then + owned_by = (" ("..S("owned by @1", meta:get_string("owner"))..")") + else + owned_by = "" + end + + inv:set_list("input", {}) + inv:set_list("micro", {}) + + local microblockcount = inv:get_stack("micro",1):get_count() + meta:set_int("anz", microblockcount) + if microblockcount == 0 then + meta:set_string("infotext", S("Circular Saw is empty") .. owned_by) + inv:set_list("output", {}) + end +end + + +-- Player has taken something out of the box or placed something inside +-- that amounts to count microblocks: +function circular_saw:update_inventory(pos, amount) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + + amount = meta:get_int("anz") + amount + + -- The material is recycled automatically. + inv:set_list("recycle", {}) + + if amount < 1 then -- If the last block is taken out. + self:reset(pos) + return + end + + local stack = inv:get_stack("input", 1) + local microstack = inv:get_stack("micro",1) + + -- At least one (micro)block is necessary to see what kind of stairs are requested. + if stack:is_empty() and microstack:is_empty() then + + self:reset(pos) + return + + end + + local node_name = circular_saw.microblocks[microstack:get_name()] or stack:get_name() or "" + local node_def = stack:get_definition() + local name_parts = circular_saw.known_nodes[node_name] or "" + local modname = name_parts[1] + local material = name_parts[2] + local owned_by = meta:get_string("owner") + + if owned_by and owned_by ~= "" then + owned_by = (" ("..S("owned by @1", meta:get_string("owner"))..")") + else + owned_by = "" + end + + inv:set_list("input", { -- Display as many full blocks as possible: + node_name.. " " .. math.floor(amount / 8) + }) + + -- The stairnodes made of default nodes use moreblocks namespace, other mods keep own: + if modname == "default" then + modname = "moreblocks" + end + -- print("circular_saw set to " .. modname .. " : " + -- .. material .. " with " .. (amount) .. " microblocks.") + + -- 0-7 microblocks may remain left-over: + inv:set_list("micro", { + modname .. ":micro_" .. material .. " " .. (amount % 8) + }) + + -- Display: + inv:set_list("output", + self:get_output_inv(modname, material, amount, + meta:get_int("max_offered"))) + -- Store how many microblocks are available: + meta:set_int("anz", amount) + + meta:set_string("infotext", + S("Circular Saw is working on @1", + node_def and node_def.description or material + ) .. owned_by + ) +end + + +-- The amount of items offered per shape can be configured: +function circular_saw.on_receive_fields(pos, formname, fields, sender) + local meta = core.get_meta(pos) + local max = tonumber(fields.max_offered) + if max and max > 0 then + meta:set_string("max_offered", max) + -- Update to show the correct number of items: + circular_saw:update_inventory(pos, 0) + end +end + + +-- Moving the inventory of the circular_saw around is not allowed because it +-- is a fictional inventory. Moving inventory around would be rather +-- impractical and make things more difficult to calculate: +function circular_saw.allow_metadata_inventory_move( + pos, from_list, from_index, to_list, to_index, count, player) + return 0 +end + + +-- Only input- and recycle-slot (and microblock slot when empty) are intended as input slots: +function circular_saw.allow_metadata_inventory_put( + pos, listname, index, stack, player) + -- The player is not allowed to put something in there: + if listname == "output" then + return 0 + end + + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local stackname = stack:get_name() + local count = stack:get_count() + + -- Only allow those items that are offered in the output inventory to be recycled: + if listname == "recycle" then + if not inv:contains_item("output", stackname) then + return 0 + end + local stackmax = stack:get_stack_max() + local instack = inv:get_stack("input", 1) + local microstack = inv:get_stack("micro", 1) + local incount = instack:get_count() + local incost = (incount * 8) + microstack:get_count() + local maxcost = (stackmax * 8) + 7 + local cost = circular_saw:get_cost(inv, stackname) + if (incost + cost) > maxcost then + return math.max((maxcost - incost) / cost, 0) + end + return count + end + + -- Only accept certain blocks as input which are known to be craftable into stairs: + if listname == "input" then + if not inv:is_empty("input") then + if inv:get_stack("input", index):get_name() ~= stackname then + return 0 + end + end + if not inv:is_empty("micro") then + local microstackname = inv:get_stack("micro", 1):get_name():gsub("^.+:micro_", "", 1) + local cutstackname = stackname:gsub("^.+:", "", 1) + if microstackname ~= cutstackname then + return 0 + end + end + for name, t in pairs(circular_saw.known_nodes) do + if name == stackname and inv:room_for_item("input", stack) then + return count + end + end + return 0 + end + + if listname == "micro" then + if not (inv:is_empty("input") and inv:is_empty("micro")) then return 0 end + for name, t in pairs(circular_saw.microblocks) do + if name == stackname and inv:room_for_item("input", stack) then + return count + end + end + return 0 + end +end + +-- Taking is allowed from all slots (even the internal microblock slot). +-- Putting something in is slightly more complicated than taking anything +-- because we have to make sure it is of a suitable material: +function circular_saw.on_metadata_inventory_put( + pos, listname, index, stack, player) + -- We need to find out if the circular_saw is already set to a + -- specific material or not: + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local stackname = stack:get_name() + local count = stack:get_count() + + -- Putting something into the input slot is only possible if that had + -- been empty before or did contain something of the same material: + if listname == "input" then + -- Each new block is worth 8 microblocks: + circular_saw:update_inventory(pos, 8 * count) + elseif listname == "micro" then + circular_saw:update_inventory(pos, count) + elseif listname == "recycle" then + -- Lets look which shape this represents: + local cost = circular_saw:get_cost(inv, stackname) + local input_stack = inv:get_stack("input", 1) + -- check if this would not exceed input itemstack max_stacks + if input_stack:get_count() + ((cost * count) / 8) <= input_stack:get_stack_max() then + circular_saw:update_inventory(pos, cost * count) + end + end +end + +function circular_saw.allow_metadata_inventory_take(pos, listname, index, stack, player) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local input_stack = inv:get_stack(listname, index) + local player_inv = player:get_inventory() + if not player_inv:room_for_item("main", input_stack) then + return 0 + else return stack:get_count() + end +end + +function circular_saw.on_metadata_inventory_take( + pos, listname, index, stack, player) + -- If it is one of the offered stairs: find out how many + -- microblocks have to be subtracted: + if listname == "output" then + local def = stack:get_definition() + -- We do know how much each block at each position costs: + local cost = def._circular_saw_cost + * stack:get_count() + circular_saw:update_inventory(pos, -cost) + elseif listname == "micro" then + -- Each microblock costs 1 microblock: + circular_saw:update_inventory(pos, -stack:get_count()) + elseif listname == "input" then + -- Each normal (= full) block taken costs 8 microblocks: + circular_saw:update_inventory(pos, 8 * -stack:get_count()) + end + -- The recycle field plays no role here since it is processed immediately. +end + +local has_default_mod = core.get_modpath("default") + +function circular_saw.on_construct(pos) + local meta = core.get_meta(pos) + local fancy_inv = "" + if has_default_mod then + -- prepend background and slot styles from default if available + fancy_inv = default.gui_bg..default.gui_bg_img..default.gui_slots + end + meta:set_string( + --FIXME Not work with @n in this part bug in luanti-org/luanti#7450. + "formspec", "size[11,10]"..fancy_inv.. + "label[0,0;" ..S("Input material").. "]" .. + "list[current_name;input;1.7,0;1,1;]" .. + "label[0,1;" ..F(S("Left-over")).. "]" .. + "list[current_name;micro;1.7,1;1,1;]" .. + "label[0,2;" ..F(S("Recycle output")).. "]" .. + "list[current_name;recycle;1.7,2;1,1;]" .. + "field[0.3,3.5;1,1;max_offered;" ..F(S("Max")).. ":;${max_offered}]" .. + "button[1,3.2;1.7,1;Set;" ..F(S("Set")).. "]" .. + "list[current_name;output;2.8,0;8,6;]" .. + "list[current_player;main;1.5,6.25;8,4;]" .. + "listring[current_name;output]" .. + "listring[current_player;main]" .. + "listring[current_name;input]" .. + "listring[current_player;main]" .. + "listring[current_name;micro]" .. + "listring[current_player;main]" .. + "listring[current_name;recycle]" .. + "listring[current_player;main]" + ) + + meta:set_int("anz", 0) -- No microblocks inside yet. + meta:set_string("max_offered", 99) -- How many items of this kind are offered by default? + meta:set_string("infotext", S("Circular Saw is empty")) + + local inv = meta:get_inventory() + inv:set_size("input", 1) -- Input slot for full blocks of material x. + inv:set_size("micro", 1) -- Storage for 1-7 surplus microblocks. + inv:set_size("recycle", 1) -- Surplus partial blocks can be placed here. + inv:set_size("output", 6*8) -- 6x8 versions of stair-parts of material x. + + circular_saw:reset(pos) +end + + +function circular_saw.can_dig(pos,player) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("input") or + not inv:is_empty("micro") or + not inv:is_empty("recycle") then + return false + end + -- Can be dug by anyone when empty, not only by the owner: + return true +end + +core.register_node("moreblocks:circular_saw", { + description = S("Circular Saw"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.4, -0.5, -0.4, -0.25, 0.25, -0.25}, -- Leg + {0.25, -0.5, 0.25, 0.4, 0.25, 0.4}, -- Leg + {-0.4, -0.5, 0.25, -0.25, 0.25, 0.4}, -- Leg + {0.25, -0.5, -0.4, 0.4, 0.25, -0.25}, -- Leg + {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- Tabletop + {-0.01, 0.4375, -0.125, 0.01, 0.5, 0.125}, -- Saw blade (top) + {-0.01, 0.375, -0.1875, 0.01, 0.4375, 0.1875}, -- Saw blade (bottom) + {-0.25, -0.0625, -0.25, 0.25, 0.25, 0.25}, -- Motor case + }, + }, + tiles = {"moreblocks_circular_saw_top.png", + "moreblocks_circular_saw_bottom.png", + "moreblocks_circular_saw_side.png"}, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy = 2,oddly_breakable_by_hand = 2}, + is_ground_content = false, + sounds = moreblocks.node_sound_wood_defaults(), + on_construct = circular_saw.on_construct, + can_dig = circular_saw.can_dig, + -- Set the owner of this circular saw. + after_place_node = function(pos, placer) + local meta = core.get_meta(pos) + local owner = placer and placer:get_player_name() or "" + local owned_by = owner + + if owner ~= "" then + owned_by = (" (%s)"):format(S("owned by @1", owner)) + end + + meta:set_string("owner", owner) + meta:set_string("infotext", S("Circular Saw is empty") .. owned_by) + end, + + -- The amount of items offered per shape can be configured: + on_receive_fields = circular_saw.on_receive_fields, + allow_metadata_inventory_move = circular_saw.allow_metadata_inventory_move, + -- Only input- and recycle-slot are intended as input slots: + allow_metadata_inventory_put = circular_saw.allow_metadata_inventory_put, + allow_metadata_inventory_take = circular_saw.allow_metadata_inventory_take, + -- Taking is allowed from all slots (even the internal microblock slot). Moving is forbidden. + -- Putting something in is slightly more complicated than taking anything because we have to make sure it is of a suitable material: + on_metadata_inventory_put = circular_saw.on_metadata_inventory_put, + on_metadata_inventory_take = circular_saw.on_metadata_inventory_take, +}) diff --git a/mods/moreblocks/config.lua b/mods/moreblocks/config.lua new file mode 100644 index 0000000..77c1d59 --- /dev/null +++ b/mods/moreblocks/config.lua @@ -0,0 +1,29 @@ +--[[ +More Blocks: configuration handling + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +moreblocks.config = {} + +local function getbool_default(setting, default) + local value = core.settings:get_bool(setting) + if value == nil then + value = default + end + return value +end + +local function setting(settingtype, name, default) + if settingtype == "bool" then + moreblocks.config[name] = + getbool_default("moreblocks." .. name, default) + else + moreblocks.config[name] = + core.settings:get("moreblocks." .. name) or default + end +end + +-- Show stairs/slabs/panels/microblocks in creative inventory (true or false): +setting("bool", "stairsplus_in_creative_inventory", true) diff --git a/mods/moreblocks/crafting.lua b/mods/moreblocks/crafting.lua new file mode 100644 index 0000000..fb189ff --- /dev/null +++ b/mods/moreblocks/crafting.lua @@ -0,0 +1,644 @@ +--[[ +More Blocks: crafting recipes + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +core.register_craft({ + output = "default:stick 2", + recipe = {{"default:dry_shrub"}, {"default:dry_shrub"}} +}) + +core.register_craft({ + output = "default:stick", + recipe = {{"group:sapling"}} +}) + +core.register_craft({ + output = "default:wood", + recipe = { + {"default:stick", "default:stick"}, + {"default:stick", "default:stick"}, + } +}) + +core.register_craft({ + output = "default:dirt_with_grass", + type = "shapeless", + recipe = {"default:junglegrass", "default:dirt"}, +}) + +core.register_craft({ + output = "default:mossycobble", + type = "shapeless", + recipe = {"default:junglegrass", "default:cobble"}, +}) + +core.register_craft({ + output = "moreblocks:wood_tile 9", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +-- This must be registered after `moreblocks:wood_tile` to avoid recipe conflicts, +-- since `moreblocks:wood_tile` is part of `group:wood` +core.register_craft({ + output = "moreblocks:wood_tile_center 9", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "moreblocks:wood_tile", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +core.register_craft({ + type = "shapeless", + output = "moreblocks:wood_tile", + recipe = {"moreblocks:wood_tile_flipped"} +}) + +core.register_craft({ + output = "moreblocks:wood_tile_full 4", + recipe = { + {"moreblocks:wood_tile", "moreblocks:wood_tile"}, + {"moreblocks:wood_tile", "moreblocks:wood_tile"}, + } +}) + +core.register_craft({ + output = "moreblocks:wood_tile_offset", + recipe = { + {"default:stick"}, + {"moreblocks:wood_tile_center"}, + } +}) + +core.register_craft({ + type = "shapeless", + output = "moreblocks:wood_tile_offset", + recipe = {"moreblocks:wood_tile_down"} +}) + +core.register_craft({ + type = "shapeless", + output = "moreblocks:wood_tile_offset", + recipe = {"moreblocks:wood_tile_left"} +}) + +core.register_craft({ + type = "shapeless", + output = "moreblocks:wood_tile_offset", + recipe = {"moreblocks:wood_tile_right"} +}) + +core.register_craft({ + output = "moreblocks:circle_stone_bricks 5", + recipe = { + {"", "default:stone", ""}, + {"default:stone", "default:coal_lump", "default:stone"}, + {"", "default:stone", ""}, + } +}) + +core.register_craft({ + output = "moreblocks:all_faces_tree 8", + recipe = { + {"default:tree", "default:tree", "default:tree"}, + {"default:tree", "", "default:tree"}, + {"default:tree", "default:tree", "default:tree"}, + } +}) + +core.register_craft({ + output = "moreblocks:all_faces_jungle_tree 8", + recipe = { + {"default:jungletree", "default:jungletree", "default:jungletree"}, + {"default:jungletree", "", "default:jungletree"}, + {"default:jungletree", "default:jungletree", "default:jungletree"}, + } +}) + +core.register_craft({ + output = "moreblocks:all_faces_pine_tree 8", + recipe = { + {"default:pine_tree", "default:pine_tree", "default:pine_tree"}, + {"default:pine_tree", "", "default:pine_tree"}, + {"default:pine_tree", "default:pine_tree", "default:pine_tree"}, + } +}) + +core.register_craft({ + output = "moreblocks:all_faces_acacia_tree 8", + recipe = { + {"default:acacia_tree", "default:acacia_tree", "default:acacia_tree"}, + {"default:acacia_tree", "", "default:acacia_tree"}, + {"default:acacia_tree", "default:acacia_tree", "default:acacia_tree"}, + } +}) + +core.register_craft({ + output = "moreblocks:all_faces_aspen_tree 8", + recipe = { + {"default:aspen_tree", "default:aspen_tree", "default:aspen_tree"}, + {"default:aspen_tree", "", "default:aspen_tree"}, + {"default:aspen_tree", "default:aspen_tree", "default:aspen_tree"}, + } +}) + +core.register_craft({ + output = "moreblocks:sweeper 4", + recipe = { + {"default:junglegrass"}, + {"default:stick"}, + } +}) + +core.register_craft({ + output = "moreblocks:stone_tile 9", + recipe = { + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:stone", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"}, + } +}) + +core.register_craft({ + output = "moreblocks:split_stone_tile", + recipe = { + {"moreblocks:stone_tile"}, + } +}) + +core.register_craft({ + output = "moreblocks:checker_stone_tile", + recipe = { + {"moreblocks:split_stone_tile"}, + } +}) + +-- When approaching the below craft, loop back to cobblestone, which can then be used to craft stone tiles again +core.register_craft({ + output = "default:cobble", + recipe = { + {"moreblocks:checker_stone_tile"}, + } +}) + +core.register_craft({ + output = "moreblocks:grey_bricks 2", + type = "shapeless", + recipe = {"default:stone", "default:brick"}, +}) + +core.register_craft({ + output = "moreblocks:grey_bricks 2", + type = "shapeless", + recipe = {"default:stonebrick", "default:brick"}, +}) + +core.register_craft({ + output = "moreblocks:empty_shelf", + type = "shapeless", + recipe = {"moreblocks:sweeper", "default:bookshelf"}, + replacements = {{"default:bookshelf", "default:book 3"}}, + -- When obtaining an empty shelf, return the books used in it as well +}) + +core.register_craft({ + output = "moreblocks:empty_shelf", + type = "shapeless", + recipe = {"moreblocks:sweeper", "vessels:shelf"}, + replacements = {{"vessels:shelf", "vessels:glass_bottle 3"}}, +}) + +core.register_craft({ + type = "shapeless", + output = "default:bookshelf", + recipe = {"moreblocks:empty_shelf", "default:book", "default:book", "default:book"}, +}) + +core.register_craft({ + output = "moreblocks:empty_shelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"", "", ""}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +core.register_craft({ + output = "moreblocks:coal_stone_bricks 4", + recipe = { + {"moreblocks:coal_stone", "moreblocks:coal_stone"}, + {"moreblocks:coal_stone", "moreblocks:coal_stone"}, + } +}) + +core.register_craft({ + output = "moreblocks:iron_stone_bricks 4", + recipe = { + {"moreblocks:iron_stone", "moreblocks:iron_stone"}, + {"moreblocks:iron_stone", "moreblocks:iron_stone"}, + } +}) + +core.register_craft({ + output = "moreblocks:plankstone 4", + recipe = { + {"group:stone", "group:wood"}, + {"group:wood", "group:stone"}, + } +}) + +core.register_craft({ + output = "moreblocks:plankstone 4", + recipe = { + {"group:wood", "group:stone"}, + {"group:stone", "group:wood"}, + } +}) + +core.register_craft({ + output = "moreblocks:coal_checker 4", + recipe = { + {"default:stone", "default:coal_lump"}, + {"default:coal_lump", "default:stone"}, + } +}) + +core.register_craft({ + output = "moreblocks:coal_checker 4", + recipe = { + {"default:coal_lump", "default:stone"}, + {"default:stone", "default:coal_lump"}, + } +}) + +core.register_craft({ + output = "moreblocks:iron_checker 4", + recipe = { + {"default:steel_ingot", "default:stone"}, + {"default:stone", "default:steel_ingot"}, + } +}) + +core.register_craft({ + output = "moreblocks:iron_checker 4", + recipe = { + {"default:stone", "default:steel_ingot"}, + {"default:steel_ingot", "default:stone"}, + } +}) + +core.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:steel_ingot", "default:chest"}, +}) +core.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:copper_ingot", "default:chest"}, +}) + +core.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:bronze_ingot", "default:chest"}, +}) + +core.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:gold_ingot", "default:chest"}, +}) + +core.register_craft({ + output = "moreblocks:iron_glass", + type = "shapeless", + recipe = {"default:steel_ingot", "default:glass"}, +}) + +core.register_craft({ + output = "default:glass", + type = "shapeless", + recipe = {"default:coal_lump", "moreblocks:iron_glass"}, +}) + + +core.register_craft({ + output = "moreblocks:coal_glass", + type = "shapeless", + recipe = {"default:coal_lump", "default:glass"}, +}) + +core.register_craft({ + output = "default:glass", + type = "shapeless", + recipe = {"default:steel_ingot", "moreblocks:coal_glass"}, +}) + +core.register_craft({ + output = "moreblocks:clean_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "default:glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "moreblocks:trap_glass"}, +}) + +core.register_craft({ + output = "moreblocks:glow_glass", + type = "shapeless", + recipe = {"default:torch", "default:glass"}, +}) + +core.register_craft({ + output = "moreblocks:clean_glow_glass", + type = "shapeless", + recipe = {"default:torch", "moreblocks:clean_glass"}, +}) + +core.register_craft({ + output = "moreblocks:clean_glow_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "moreblocks:glow_glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:glass", "default:torch"}, +}) + +core.register_craft({ + output = "moreblocks:trap_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:glow_glass"}, +}) + +-- several recipes are possible for the trap+clean+glow, we only present 3 of them +core.register_craft({ + output = "moreblocks:trap_clean_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glow_glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glass", "default:torch"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_glow_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "moreblocks:trap_glow_glass" }, +}) + + +core.register_craft({ + output = "moreblocks:super_glow_glass", + type = "shapeless", + recipe = {"default:torch", "default:torch", "default:glass"}, +}) + +core.register_craft({ + output = "moreblocks:super_glow_glass", + type = "shapeless", + recipe = {"default:torch", "moreblocks:glow_glass"}, +}) + +core.register_craft({ + output = "moreblocks:clean_super_glow_glass", + type = "shapeless", + recipe = {"default:torch", "default:torch", "moreblocks:clean_glass"}, +}) + +core.register_craft({ + output = "moreblocks:clean_super_glow_glass", + type = "shapeless", + recipe = {"default:torch", "moreblocks:clean_glow_glass"}, +}) + +core.register_craft({ + output = "moreblocks:clean_super_glow_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "moreblocks:super_glow_glass"}, +}) + + +core.register_craft({ + output = "moreblocks:trap_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:glass", "default:torch", "default:torch"}, +}) + +core.register_craft({ + output = "moreblocks:trap_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:super_glow_glass"}, +}) + +-- several recipes are possible for the trap+clean+glow, we only present 4 of them +core.register_craft({ + output = "moreblocks:trap_clean_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:clean_super_glow_glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glow_glass", "default:torch"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glass", "default:torch", "default:torch"}, +}) + +core.register_craft({ + output = "moreblocks:trap_clean_super_glow_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "moreblocks:trap_super_glow_glass" }, +}) + + +core.register_craft({ + output = "moreblocks:coal_stone", + type = "shapeless", + recipe = {"default:coal_lump", "default:stone"}, +}) + +core.register_craft({ + output = "default:stone", + type = "shapeless", + recipe = {"default:steel_ingot", "moreblocks:coal_stone"}, +}) + +core.register_craft({ + output = "moreblocks:iron_stone", + type = "shapeless", + recipe = {"default:steel_ingot", "default:stone"}, +}) + +core.register_craft({ + output = "default:stone", + type = "shapeless", + recipe = {"default:coal_lump", "moreblocks:iron_stone"}, +}) + +core.register_craft({ + output = "moreblocks:trap_stone", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:stone"}, +}) + +core.register_craft({ + output = "moreblocks:trap_desert_stone", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:desert_stone"}, +}) + +core.register_craft({ + output = "moreblocks:trap_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_obsidian_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:obsidian_glass"}, +}) + +core.register_craft({ + output = "moreblocks:trap_obsidian", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:obsidian"}, +}) + +core.register_craft({ + output = "moreblocks:trap_sandstone", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:sandstone"}, +}) + +core.register_craft({ + output = "moreblocks:cactus_brick", + type = "shapeless", + recipe = {"default:cactus", "default:brick"}, +}) + +core.register_craft({ + output = "moreblocks:cactus_checker 4", + recipe = { + {"default:cactus", "default:stone"}, + {"default:stone", "default:cactus"}, + } +}) + +core.register_craft({ + output = "moreblocks:cactus_checker 4", + recipe = { + {"default:stone", "default:cactus"}, + {"default:cactus", "default:stone"}, + } +}) + +core.register_craft({ + output = "moreblocks:rope 3", + recipe = { + {"default:junglegrass"}, + {"default:junglegrass"}, + {"default:junglegrass"}, + } +}) + +core.register_craft({ + output = "moreblocks:dirt_compressed", + recipe = { + {'default:dirt', 'default:dirt', 'default:dirt'}, + {'default:dirt', 'default:dirt', 'default:dirt'}, + {'default:dirt', 'default:dirt', 'default:dirt'}, + } +}) + +core.register_craft({ + output = "default:dirt 9", + recipe = {{"moreblocks:dirt_compressed"}}, +}) + +core.register_craft({ + output = "moreblocks:cobble_compressed", + recipe = { + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"}, + } +}) + +core.register_craft({ + output = "default:cobble 9", + recipe = { + {"moreblocks:cobble_compressed"}, + } +}) + +core.register_craft({ + output = "moreblocks:desert_cobble_compressed", + recipe = { + {"default:desert_cobble", "default:desert_cobble", "default:desert_cobble"}, + {"default:desert_cobble", "default:desert_cobble", "default:desert_cobble"}, + {"default:desert_cobble", "default:desert_cobble", "default:desert_cobble"}, + } +}) + +core.register_craft({ + output = "default:desert_cobble 9", + recipe = { + {"moreblocks:desert_cobble_compressed"}, + } +}) + +core.register_craft({ + type = "cooking", output = "moreblocks:tar", recipe = "default:pine_tree", +}) + +core.register_craft({ + output = "moreblocks:copperpatina 4", + recipe = { + {"", "default:copperblock", ""}, + {"default:copperblock", "group:water_bucket", "default:copperblock"}, + {"", "default:copperblock", ""} + }, + replacements = { + {"group:water_bucket", "bucket:bucket_empty"} + } +}) + +if core.settings:get_bool("moreblocks.circular_saw_crafting") ~= false then -- “If nil or true then” + core.register_craft({ + output = "moreblocks:circular_saw", + recipe = { + { "", "default:steel_ingot", "" }, + { "group:wood", "group:wood", "group:wood"}, + { "group:wood", "", "group:wood"}, + } + }) +end diff --git a/mods/moreblocks/init.lua b/mods/moreblocks/init.lua new file mode 100644 index 0000000..f734c25 --- /dev/null +++ b/mods/moreblocks/init.lua @@ -0,0 +1,27 @@ +--[[ +===================================================================== +** More Blocks ** +By Calinou, with the help of ShadowNinja and VanessaE. + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +===================================================================== +--]] + +moreblocks = {} + +local modpath = core.get_modpath("moreblocks") + +moreblocks.S = core.get_translator("moreblocks") + +dofile(modpath .. "/config.lua") +dofile(modpath .. "/sounds.lua") +dofile(modpath .. "/circular_saw.lua") +dofile(modpath .. "/stairsplus/init.lua") + +if core.get_modpath("default") then + dofile(modpath .. "/nodes.lua") + dofile(modpath .. "/redefinitions.lua") + dofile(modpath .. "/crafting.lua") + dofile(modpath .. "/aliases.lua") +end diff --git a/mods/moreblocks/locale/moreblocks.de.tr b/mods/moreblocks/locale/moreblocks.de.tr new file mode 100644 index 0000000..b2297e7 --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.de.tr @@ -0,0 +1,92 @@ +# textdomain: moreblocks + +# German translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# Xanthin, 2014. +# CodeXP , 2018. + +#: circular_saw.lua + +Circular Saw=Kreissäge +Input material=Ausgangs-@nmaterial +Left-over=Rest +Max=Anzahl +Recycle output=Wiederver-@nwerten +Set=Ok +owned by @1=gehört @1 +Circular Saw is empty=Kreissäge ist leer +Circular Saw is working on @1=Kreissäge arbeitet mit @1 + +#: init.lua + +[moreblocks] loaded.=[moreblocks] geladen. + +#: nodes.lua + +Deprecated=veraltet +All-faces Acacia Tree=allseitiger Akazienbaumstamm +All-faces Aspen Tree=allseitiger Espenbaumstamm +All-faces Jungle Tree=allseitiger Tropenbaumstamm +All-faces Pine Tree=allseitiger Kieferbaumstamm +All-faces Tree=allseitiger Baumstamm +Cactus Brick=Kaktusziegel +Cactus Checker=Kaktus-Mosaik +Centered Wooden Tile=Holzfliese mittig +Checker Stone Tile=Stein-Mosaik +Circle Stone Bricks=Kreissteinziegel +Clean Glass=Klares Glas +Coal Checker=Kohlen-Mosaik +Coal Glass=Kohleglas +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=Kohlestein +Coal Stone Bricks=Kohlesteinziegel +Compressed Cobblestone=Gepresster Kopfsteinpflaster +Compressed Desert Cobblestone= +Compressed Dirt=Gepresste Erde +Copper Patina Block=Kupfer Edelrostblock +Empty Shelf=Leeres Regal +Full Wooden Tile=Vollholzfliese +Glow Glass=Leuchtglas +Iron Checker=Metall-Mosaik +Iron Glass=metallisiertes Glas +Iron Stone=Eisenstein +Iron Stone Bricks=Eisensteinziegel +Plankstone=Brettstein +Rope=Seil +Split Stone Tile=Geteilte Steinfliese +Stone Bricks=Steinziegel +Stone Tile=Steinfliese +Super Glow Glass=Superleuchtglas +Sweeper=Besen +Tar=Teer +Trap Desert Stone=Wüstensteinfalle +Trap Glass=Glasfalle +Trap Glow Glass=Leuchtglasfalle +Trap Obsidian=Obsidianfalle +Trap Obsidian Glass=Obsidianglasfalle +Trap Sandstone=Sandsteinfalle +Trap Stone=Steinfalle +Trap Super Glow Glass=Superleuchtglasfalle +Wooden Tile=Holzfliese +Offset Wooden Tile=Holzfliese versetzt +Downwards Wooden Tile=Holzfliese unten +Leftwards Wooden Tile=Holzfliese links +Rightwards Wooden Tile=Holzfliese rechts + +#: ownership.lua + +Sorry, @1 owns that spot.=Tut mir leid, dieser Bereich gehört @1. +someone=jemand + +#: stairsplus/common.lua + +@1 Microblock=@1mikroblock +@1 Slab=@1platte +@1 Slope=@1neigung +@1 Panel=@1paneel +@1 Stairs=@1treppe diff --git a/mods/moreblocks/locale/moreblocks.es.tr b/mods/moreblocks/locale/moreblocks.es.tr new file mode 100644 index 0000000..c07124d --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.es.tr @@ -0,0 +1,96 @@ +# textdomain: moreblocks + +# Spanish translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# kaeza, 2013. +# CodeXP , 2018. +# Carlos Barraza 2020. + +#: circular_saw.lua + +Circular Saw=Sierra circular +Input material=Material de@nentrada +Left-over=Sobrante +Max=Maximo +Recycle output=Reciclar@nsalida +Set=Establecer +owned by @1=protegido por @1 +Circular Saw is empty=La sierra circular está vacia +Circular Saw is working on @1=Sierra circular trabajando en @1 + +#: nodes.lua + +Deprecated=Obsoleto +All-faces Acacia Tree=Árbol de Acacia, todas las caras +All-faces Aspen Tree=Álamo temblón, todas las caras +All-faces Jungle Tree=Árbol de Selva, todas las caras +All-faces Pine Tree=Pino, todas las caras +All-faces Tree=Tronco de Árbol +Cactus Brick=Ladrillos de Cactus +Cactus Checker=Cuadros de Cactus +Centered Wooden Tile=Parqué​ Centrado +Checker Stone Tile=Cuadros de Baldosa de Piedra +Circle Stone Bricks=Bloques de Piedra Circulares +Clean Glass=Cristal Limpio +Coal Checker=Cuadros de Carbón +Coal Glass=Cristal con Carbón +Clean Super Glow Glass=Cristal Súper Brillante Limpio +Trap Clean Super Glow Glass=Cristal Súper Brillante Limpio Falso +Trap Clean Glass=Cristal Limpio Falso +Clean Glow Glass=Cristal Brillante Limpio +Trap Clean Glow Glass=Cristal Brillante Limpio Falso +Coal Stone=Carbón y Piedra +Coal Stone Bricks=Ladrillos de Piedra de Carbon +Compressed Cobblestone=Adoquín Comprimido +Compressed Desert Cobblestone=Adoquín del Desierto Comprimido +Compressed Dirt=Tierra Comprimida +Copper Patina Block=Bloque de Pátina de Cobre +Empty Shelf=Estante vacio +Full Wooden Tile=Parqué​ Completo +Glow Glass=Cristal Brillante +Iron Checker=Cuadros de Hierro +Iron Glass=Cristal con Hierro +Iron Stone=Hierro y Piedra +Iron Stone Bricks=Ladrillo de Piedra de Hierro +Plankstone=Tablones de piedra +Rope=Soga +Split Stone Tile=Baldosas de Piedra Partida +Stone Bricks=Ladrillos de Piedra +Stone Tile=Baldosa de Piedra +Super Glow Glass=Cristal Súper Brillante +Sweeper=Limpiador +Tar=Alquitrán +Trap Desert Stone=Piedra del Desierto Falsa +Trap Glass=Cristal Falso +Trap Glow Glass=Cristal Brillante Falso +Trap Obsidian=Obsidiana Falsa +Trap Obsidian Glass=Vidrio de Obsidiana Falso +Trap Sandstone=Arenisca Falsa +Trap Stone=Piedra Falsa +Trap Super Glow Glass=Cristal Súper Brillante Falso +Wooden Tile=Parqué​ +Offset Wooden Tile=Parqué​ Ajustado +Downwards Wooden Tile=Parqué​ hacia Abajo +Leftwards Wooden Tile=Parqué​ hacia la Izquierda +Rightwards Wooden Tile=Parqué​ hacia la Derecha + + +#: ownership.lua + +Sorry, @1 owns that spot.=Lo siento, @1 es dueño de ese lugar. +someone=alguien + +#: stairsplus/common.lua + +@1 Microblock=Microbloque de @1 +@1 Slab=Losa de @1 +@1 Slope=Pendiente de @1 +@1 Panel=Panel de @1 +@1 Stairs=Escalera de @1 + +#: stairsplus/registrations.lua + +Concrete=Concreto +Cement=Cemento +Brass Block=Bloque de latón diff --git a/mods/moreblocks/locale/moreblocks.fr.tr b/mods/moreblocks/locale/moreblocks.fr.tr new file mode 100644 index 0000000..790b19a --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.fr.tr @@ -0,0 +1,93 @@ +# textdomain: moreblocks + +# French translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# Hugo Locurcio , 2013-2019. +# Jat15, 2013. +# CodeXP , 2018. + +#: circular_saw.lua + +Circular Saw=Scie circulaire +Input material=Matériau@nd'entrée +Left-over=Reste +Max=Max +Recycle output=Sortie à@nrecycler +Set=Définir +owned by @1=propriété de @1 +Circular Saw is empty=Scie circulaire vide +Circular Saw is working on @1=Scie circulaire manipulant @1 + +#: init.lua + +[moreblocks] loaded.=[moreblocks] a été chargé. + +#: nodes.lua + +Deprecated=déprécié +All-faces Acacia Tree=Tronc d'arbre d'acacia (toutes faces) +All-faces Aspen Tree=Tronc d'arbre de peuplier (toutes faces) +All-faces Jungle Tree=Tronc d'arbre de jungle (toutes faces) +All-faces Pine Tree=Tronc d'arbre de pin (toutes faces) +All-faces Tree=Tronc d'arbre (toutes faces) +Cactus Brick=Briques de cactus +Cactus Checker=Damier en cactus +Centered Wooden Tile=Dalle en bois centrée +Checker Stone Tile=Damier de dalle en pierre +Circle Stone Bricks=Briques en pierre circulaires +Clean Glass=Verre propre +Coal Checker=Damier en charbon +Coal Glass=Verre de charbon +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=Pierre de charbon +Coal Stone Bricks=Briques en pierre de charbon +Compressed Cobblestone=Pierre taillée compressée +Compressed Desert Cobblestone= +Compressed Dirt=Terre compressée +Copper Patina Block=Bloc de patine de cuivre +Empty Shelf=Étagère vide +Full Wooden Tile=Dalle en bois complète +Glow Glass=Verre brillant +Iron Checker=Damier de fer +Iron Glass=Verre de fer +Iron Stone=Pierre de fer +Iron Stone Bricks=Briques en pierre de fer +Plankstone=Pierre-bois +Rope=Corde +Split Stone Tile=Dalle en pierre découpée +Stone Bricks=Briques en pierre +Stone Tile=Dalle en pierre +Super Glow Glass=Verre très brillant +Sweeper=Balai +Tar=Bitume +Trap Desert Stone=Pierre du désert traversable +Trap Glass=Verre traversable +Trap Glow Glass=Verre brillant traversable +Trap Obsidian=Obsidienne traversable +Trap Obsidian Glass=Verre d'obsidienne traversable +Trap Sandstone=Grès traversable +Trap Stone=Pierre traversable +Trap Super Glow Glass=Verre très brillant traversable +Wooden Tile=Dalle en bois +Offset Wooden Tile=Dalle en bois décalée +Downwards Wooden Tile=Dalle en bois vers le bas +Leftwards Wooden Tile=Dalle en bois vers la gauche +Rightwards Wooden Tile=Dalle en bois vers la droite + +#: ownership.lua + +Sorry, @1 owns that spot.=Désolé, @1 possède cet endroit. +someone=quelqu'un + +#: stairsplus/common.lua + +@1 Microblock=Microbloc en @1 +@1 Slab=Demi-dalle en @1 +@1 Slope=Pente en @1 +@1 Panel=Barre en @1 +@1 Stairs=Escaliers en @1 diff --git a/mods/moreblocks/locale/moreblocks.it.tr b/mods/moreblocks/locale/moreblocks.it.tr new file mode 100644 index 0000000..f3c1639 --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.it.tr @@ -0,0 +1,92 @@ +# textdomain: moreblocks + +# Italian translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# Emon, 2016. +# CodeXP , 2018. + +#: circular_saw.lua + +Circular Saw=Sega circolare +Input material=Materiale@niniziale +Left-over=Scarto +Max=Max. +Recycle output=Ricicla@nfinale +Set=Imp. +owned by @1= +Circular Saw is empty=Sega circolare, vuota +Circular Saw is working on @1=Sega circolare, in funzione su @1 + +#: init.lua + +[moreblocks] loaded.=[moreblocks] caricato. + +#: nodes.lua + +Deprecated= +All-faces Acacia Tree= +All-faces Aspen Tree= +All-faces Jungle Tree= +All-faces Pine Tree= +All-faces Tree=Albero su ogni lato +Cactus Brick=Mattoni di cactus +Cactus Checker=Scacchiera in cactus +Centered Wooden Tile=Mattonella in legno centrata +Checker Stone Tile= +Circle Stone Bricks=Mattoni concentrici in pietra +Clean Glass=Vetro pulito +Coal Checker=Scacchiera in carbone +Coal Glass=Vetro e carbone +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=Pietra in carbone +Coal Stone Bricks=Mattoni di pietra in carbone +Compressed Cobblestone= +Compressed Desert Cobblestone= +Compressed Dirt= +Copper Patina Block= +Empty Shelf=Scaffale Vuoto +Full Wooden Tile=Mattonella in legno pieno +Glow Glass=Vetro luminoso +Iron Checker=Scacchiera in ferro +Iron Glass=Vetro e ferro +Iron Stone=Pietra in ferro +Iron Stone Bricks=Mattoni di pietra in ferro +Plankstone=Pietra e legno +Rope=Corda +Split Stone Tile=Mattonella in pietra divisa +Stone Bricks= +Stone Tile=Mattonella in pietra +Super Glow Glass=Super vetro luminoso +Sweeper=Spazzola +Tar= +Trap Desert Stone= +Trap Glass=Vetro trappola +Trap Glow Glass=Vetro luminoso trappola +Trap Obsidian= +Trap Obsidian Glass= +Trap Sandstone= +Trap Stone=Pietra trappola +Trap Super Glow Glass=Super vetro luminoso trappola +Wooden Tile=Mattonella in legno +Offset Wooden Tile= +Downwards Wooden Tile= +Leftwards Wooden Tile= +Rightwards Wooden Tile= + +#: ownership.lua + +Sorry, @1 owns that spot.=Spiacente, quel punto è di proprietà di @1 +someone=qualcuno + +#: stairsplus/common.lua + +@1 Microblock=Microblocco @1 +@1 Slab=Lastra - @1 +@1 Slope= +@1 Panel=Pannello - @1 +@1 Stairs=Scale - @1 diff --git a/mods/moreblocks/locale/moreblocks.pl.tr b/mods/moreblocks/locale/moreblocks.pl.tr new file mode 100644 index 0000000..9f9d86a --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.pl.tr @@ -0,0 +1,93 @@ +# textdomain: moreblocks + +# Polish translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# mat9117, 2019 +# CodeXP , 2018. + +#: circular_saw.lua + +Circular Saw=Piła tarczowa +Input material=wejście@nmateriał +Left-over=Resztki +Max=Maks +Recycle output=Przetwarzanie@nWyjście +Set=Ustaw +owned by @1=Należy do @1 +Circular Saw is empty=Piła tarczowa jest pusta +Circular Saw is working on @1=Piła tarczowa pracuje na @1 + +#: init.lua + +[moreblocks] loaded.=[moreblocks] załadowane. + +#: nodes.lua + +Deprecated=Przestarzałe +All-faces Acacia Tree=Wielostronna tekstura akacji +All-faces Aspen Tree=Wielostronna tekstura osiki +All-faces Jungle Tree=Wielostronna tekstura drzewa dżunglowego +All-faces Pine Tree=Wielostronna tekstura sosny +All-faces Tree=Wielostronna tekstura drzewa +Cactus Brick=Kaktusowa cegła +Cactus Checker=Kaktusowa szachownica +Centered Wooden Tile=Wyśrodkowany drewniany kafelek +Checker Stone Tile=Kamienna szachownica +Circle Stone Bricks=Okrągłe kamienne cegły +Clean Glass=Czyste szkło +Coal Checker=Węglowa szachownica +Coal Glass=Szkło węglowe +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=Kamień węglowy +Coal Stone Bricks=Węglowe kamienne cegły +Compressed Cobblestone=Skompresowany bruk +Compressed Desert Cobblestone= +Compressed Dirt=Skompresowana ziemia +Copper Patina Block=Blok patynowanej miedzi +Empty Shelf=Pusta półka +Full Wooden Tile=Pełny drewniany kafelek +Glow Glass=Świecące szkło +Iron Checker=Żelazna szachownica +Iron Glass=Żelazne szkło +Iron Stone=Żelazny kamień +Iron Stone Bricks=Żelazne kamienne cegły +Plankstone=Deskokamień +Rope=Lina +Split Stone Tile=Kamienny blok kafelkowy +Stone Bricks=Kamienne cegły +Stone Tile=Kamienny kafelek +Super Glow Glass=Super świecące szkło +Sweeper=Miotła +Tar=Smoła +Trap Desert Stone=Pułapka z pustynnego kamienia +Trap Glass=Szklana pułapka +Trap Glow Glass=Pułapka ze świecącego szkłą +Trap Obsidian=Obsydianowa pułapka +Trap Obsidian Glass=Pułapka z obsydianowego szkła +Trap Sandstone=Pułapka z piaskowca +Trap Stone=Kamienna pułapka +Trap Super Glow Glass=Pułapka z super świecącego szkła +Wooden Tile=Drewniany kafelek +Offset Wooden Tile= +Downwards Wooden Tile=Dolny drewniany kafelek +# @deprecated +Leftwards Wooden Tile=Lewy drewniany kafelek +# @deprecated +Rightwards Wooden Tile=Prawy drewniany kafelek + +#: ownership.lua +Sorry, @1 owns that spot.=Przykro mi, to miejsce należy do @1 +someone=ktoś + +#: stairsplus/common.lua + +@1 Microblock=@1 Mikroblok +@1 Slab=@1 Płyta +@1 Slope=@1 Spad +@1 Panel=@1 Panel +@1 Stairs=@1 Schody diff --git a/mods/moreblocks/locale/moreblocks.pt_BR.tr b/mods/moreblocks/locale/moreblocks.pt_BR.tr new file mode 100644 index 0000000..770c818 --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.pt_BR.tr @@ -0,0 +1,94 @@ +# textdomain: moreblocks + +# Portuguese_Brazil translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# Jose Anastacio 2020. + +#: circular_saw.lua + +Circular Saw=Serra Circular +Input material=Material de entrada +Left-over=Sobra +Max=Máximo +Recycle output=Saida reciclagem +Set=Defina +owned by @1=propriedade de @1 +Circular Saw is empty=Serra Circular está vazia +Circular Saw is working on @1=Serra Circular está trabalhando em @1 + +#: nodes.lua + +Deprecated=Descontinuado +All-faces Acacia Tree=Árvore de Acácia multifacetada +All-faces Aspen Tree=Árvore Aspen multifacetada +All-faces Jungle Tree=Árvore da Selva multifacetada +All-faces Pine Tree=Pinheiro multifacetado +All-faces Tree=Tronco de árvore +Cactus Brick=Tijolos de Cacto +Cactus Checker=Xadrez de Cacto +Centered Wooden Tile=Tijolos Centrado de Madeira +Checker Stone Tile=Xadrez Centrado de Pedra +Circle Stone Bricks=Tijolos de Pedra Cricular +Clean Glass=Vidro Limpo +Coal Checker=Xadrez de Carvão +Coal Glass=Vidro com Carvao +Clean Super Glow Glass=Cristal Limpo Super brilhante +Trap Clean Super Glow Glass=Vidro Limpo Super brilhante +Trap Clean Glass=Cristal Falso Limpo +Clean Glow Glass=Cristal Brillante Limpo +Trap Clean Glow Glass=Cristal Brillante Limpo Falso +Coal Stone=Pedra de carvão +Coal Stone Bricks=Tijolos de Carvão +Compressed Cobblestone=Pedregulho Comprimido +Compressed Desert Cobblestone=Pedregulho do Deserto Comprimido +Compressed Dirt=Terra Comprimida +Copper Patina Block=Bloco pátina de cobre +Empty Shelf=Prateleira Vazia +Full Wooden Tile=Xadrez de Madeira completo +Glow Glass=Vidro brilhante +Iron Checker=Xadrez de Ferro +Iron Glass=Cristal com ferro +Iron Stone=Ferro e Pedra +Iron Stone Bricks=Tijolos de Ferro +Plankstone=Prancha de Pedra +Rope=Corda +Split Stone Tile=Xadrez de Pedra Dividido +Stone Bricks=Tijolos de Pedra +Stone Tile=Xadrez de Pedra +Super Glow Glass=Cristal Súper Brillante +Sweeper=Limpiador +Tar=Alquitrán +Trap Desert Stone=Pedra del Desierto Falsa +Trap Glass=Cristal Falso +Trap Glow Glass=Cristal Brillante Falso +Trap Obsidian=Obsidiana Falsa +Trap Obsidian Glass=Vidrio de Obsidiana Falso +Trap Sandstone=Arenisca Falsa +Trap Stone=Piedra Falsa +Trap Super Glow Glass=Cristal Súper Brillante Falso +Wooden Tile=Xadrez de Madeira +Offset Wooden Tile=Xadrez de Madeira compensada +Downwards Wooden Tile=Xadrez de Madeira para baixo +Leftwards Wooden Tile=Xadrez de Madeira para a esquerda +Rightwards Wooden Tile=Xadrez de Madeira para a direita + + +#: ownership.lua + +Sorry, @1 owns that spot.=Desculpe, @1 é o dono desse lugar. +someone=alguem + +#: stairsplus/common.lua + +@1 Microblock=Microbloco de @1 +@1 Slab=Laje de @1 +@1 Slope=Declive de @1 +@1 Painel=Panel de @1 +@1 Stairs=Escadas de @1 + +#: stairsplus/registrations.lua + +Concrete=Concreto +Cement=Cimento +Brass Block=Bloco de latão diff --git a/mods/moreblocks/locale/moreblocks.ru.tr b/mods/moreblocks/locale/moreblocks.ru.tr new file mode 100644 index 0000000..058b1ad --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.ru.tr @@ -0,0 +1,95 @@ +# textdomain: moreblocks + +# Russian translation for MOREBLOCKS Luanti mod. +# Copyright (C) 2018 Hugo Locurcio and contributors +# This file is distributed under the same license as the MOREBLOCKS package. +# CodeXP , 2018. +# +#, fuzzy + +#: circular_saw.lua + +Circular Saw=циркулярная пила +Input material=Входной@nматериал +Left-over=Остатки +Max=Кол. +Recycle output=Пере-@nобработка +Set=ОК +owned by @1=принадлежит @1 +Circular Saw is empty=циркулярная пила пустая +Circular Saw is working on @1=циркулярная пила, @1 в обработке + +#: init.lua + +[MOD] moreblocks loaded.=[MOD] moreblocks загружен. + +#: nodes.lua + +Deprecated=устаревший +All-faces Acacia Tree=всестороннее бревно акации +All-faces Aspen Tree=всестороннее бревно осины +All-faces Jungle Tree=всестороннее бревно дерева джунглей +All-faces Pine Tree=всестороннее бревно сосновое +All-faces Tree=всестороннее бревно дерева +Cactus Brick=кирпич из кактуса +Cactus Checker=мозаика из кактуса +Centered Wooden Tile=деревянная мозаика (центр) +Checker Stone Tile=каменная мозаика +Circle Stone Bricks=кольцевой камень +Clean Glass=чистое стекло +Coal Checker=угольная мозаика +Coal Glass=угольное стекло +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=угольный камень +Coal Stone Bricks=угольно-каменный кирпич +Compressed Cobblestone=прессованный булыжник +Compressed Desert Cobblestone= +Compressed Dirt=прессованная земля +Copper Patina Block=медный патинированный блок +Empty Shelf=пустые полки +Full Wooden Tile=деревянная мозаика +Glow Glass=светящееся стекло +Iron Checker=стальная мозаика +Iron Glass=металлизированное стекло +Iron Stone=железный камень +Iron Stone Bricks=железно-каменный кирпич +Plankstone=дерево-каменная мозаика +Rope=верёвка +Split Stone Tile=каменная мозаика +Stone Bricks=каменный кирпич +Stone Tile=каменная плитка +Super Glow Glass=супер светящееся стекло +Sweeper=метёлка +Tar=смола +Trap Desert Stone=мнимый пустынный камень +Trap Glass=мнимое стекло +Trap Glow Glass=мнимое светящееся стекло +Trap Obsidian=мнимый обсидиан +Trap Obsidian Glass=мнимое обсидиановое стекло +Trap Sandstone=мнимый песчаник +Trap Stone=мнимый камень +Trap Super Glow Glass=мнимое супер светящееся стекло +Wooden Tile=деревянная мозаика +Offset Wooden Tile=деревянная мозаика (сверху) +# @deprecated +Downwards Wooden Tile=деревянная мозаика (снизу) +# @deprecated +Leftwards Wooden Tile=деревянная мозаика (слева) +# @deprecated +Rightwards Wooden Tile=деревянная мозаика (справа) + +#: ownership.lua +Sorry, @1 owns that spot.=Извините, это принадлежит @1. +someone=кому-то + +#: stairsplus/common.lua + +@1 Microblock=@1 (микроблок) +@1 Slab=@1 (плита) +@1 Slope=@1 (наклон) +@1 Panel=@1 (панель) +@1 Stairs=@1 (лестница) diff --git a/mods/moreblocks/locale/moreblocks.template.tr b/mods/moreblocks/locale/moreblocks.template.tr new file mode 100644 index 0000000..c509f18 --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.template.tr @@ -0,0 +1,89 @@ +# textdomain: moreblocks + +#: circular_saw.lua + +Circular Saw= +Input material= +Left-over= +Max= +Recycle output= +Set= +owned by @1= +Circular Saw is empty= +Circular Saw is working on @1= + +#: nodes.lua + +Deprecated= +All-faces Acacia Tree= +All-faces Aspen Tree= +All-faces Jungle Tree= +All-faces Pine Tree= +All-faces Tree= +Cactus Brick= +Cactus Checker= +Centered Wooden Tile= +Checker Stone Tile= +Circle Stone Bricks= +Clean Glass= +Coal Checker= +Coal Glass= +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone= +Coal Stone Bricks= +Compressed Cobblestone= +Compressed Desert Cobblestone= +Compressed Dirt= +Copper Patina Block= +Empty Shelf= +Full Wooden Tile= +Glow Glass= +Iron Checker= +Iron Glass= +Iron Stone= +Iron Stone Bricks= +Plankstone= +Rope= +Split Stone Tile= +Stone Bricks= +Stone Tile= +Super Glow Glass= +Sweeper= +Tar= +Trap Desert Stone= +Trap Glass= +Trap Glow Glass= +Trap Obsidian= +Trap Obsidian Glass= +Trap Sandstone= +Trap Stone= +Trap Super Glow Glass= +Wooden Tile= +Offset Wooden Tile= +Downwards Wooden Tile= +Leftwards Wooden Tile= +Rightwards Wooden Tile= + + +#: ownership.lua + +Sorry, @1 owns that spot.= +someone= + +#: stairsplus/common.lua + +@1 Microblock= +@1 Slab= +@1 Slope= +@1 Panel= +@1 Stairs= + +#: stairsplus/registrations.lua + +Concrete= +Cement= +Brass Block= diff --git a/mods/moreblocks/locale/moreblocks.uk.tr b/mods/moreblocks/locale/moreblocks.uk.tr new file mode 100644 index 0000000..cd8fb94 --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.uk.tr @@ -0,0 +1,92 @@ +# textdomain: moreblocks + +More Blocks=Більше Блоків +Adds various miscellaneous blocks to the game.=Додає різноманітні нові блоки до гри. +Adds various miscellaneous blocks.=Додає різноманітні нові блоки до гри. + +#: circular_saw.lua + +Circular Saw=Циркулярна пила +Input material=Вхідний@nматеріал +Left-over=Залишки +Max=Кільк. +Recycle output=Пере-@nобробка +Set=Гаразд +owned by @1=належить @1 +Circular Saw is empty=Циркулярна пила пуста +Circular Saw is working on @1=Циркулярна пила працює над @1 + +#: init.lua + +[MOD] moreblocks loaded.=[MOD] moreblocks завантажено. + +#: nodes.lua + +Deprecated=застарілий +All-faces Acacia Tree=Всебічна колода акації +All-faces Aspen Tree=Всебічна колода осики +All-faces Jungle Tree=Всебічна джунглева колода +All-faces Pine Tree=Всебічна колода сосни +All-faces Tree=Всебічна колода яблуні +Cactus Brick=Кактусова цегла +Cactus Checker=Кактусова мозаїка +Centered Wooden Tile=Дерев'яна мозаїка (центр) +Checker Stone Tile=Кам'яна мозаїка +Circle Stone Bricks=Кільцевий камінь +Clean Glass=Чисте скло +Coal Checker=Вугілляна мозаїка +Coal Glass=Вугілляне скло +Clean Super Glow Glass=Чисте супер-сяюче скло +Trap Clean Super Glow Glass=Trap чисте супер-сяюче скло +Trap Clean Glass=Trap чисте скло +Clean Glow Glass=Чисте сяюче скло +Trap Clean Glow Glass=Trap чисте сяюче скло +Coal Stone=Вугілляний камінь +Coal Stone Bricks=Вуглекам'яна цегла +Compressed Cobblestone=Пресований кругляк +Compressed Desert Cobblestone=Пресований пустельний кругляк +Compressed Dirt=Пресований ґрунт +Copper Patina Block=Блок мідного патину +Empty Shelf=Пусті полиці +Full Wooden Tile=Дерев'яна мозаїка +Glow Glass=Сяюче скло +Iron Checker=Сталева мозаїка +Iron Glass=Металізоване скло +Iron Stone=Залізний камінь +Iron Stone Bricks=Залізокам'яна цегла +Plankstone=Деревокам'яна мозаїка +Rope=Мотузка +Split Stone Tile=Кам'яна мозаїка +Stone Bricks=Кам'яна цегла +Stone Tile=Кам'яна плитка +Super Glow Glass=Супер-сяюче скло +Sweeper=Підмітальник +Tar=Смола +Trap Desert Stone=Уявний пустельний камінь +Trap Glass=Уявне скло +Trap Glow Glass=Уявне сяюче скло +Trap Obsidian=Уявний обсидіан +Trap Obsidian Glass=Уявне обсидіанове скло +Trap Sandstone=Уявний пісковик +Trap Stone=Уявний камінь +Trap Super Glow Glass=Уявне супер-сяюче скло +Wooden Tile=Дерев'яна мозаїка +Offset Wooden Tile=Дерев'яна мозаїка (зверзу) +# @deprecated +Downwards Wooden Tile=Дерев'яна мозаїка (знизу) +# @deprecated +Leftwards Wooden Tile=Дерев'яна мозаїка (ліворуч) +# @deprecated +Rightwards Wooden Tile=Дерев'яна мозаїка (праворуч) + +#: ownership.lua +Sorry, @1 owns that spot.=Вибачте, це належить @1. +someone=комусь + +#: stairsplus/common.lua + +@1 Microblock=@1 (мікроблок) +@1 Slab=@1 (плита) +@1 Slope=@1 (схил) +@1 Panel=@1 (панель) +@1 Stairs=@1 (сходи) diff --git a/mods/moreblocks/locale/moreblocks.zh_CN.tr b/mods/moreblocks/locale/moreblocks.zh_CN.tr new file mode 100644 index 0000000..ac55722 --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.zh_CN.tr @@ -0,0 +1,94 @@ +# textdomain: moreblocks + +# zh_CN translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# IFRFSX , 2020. + +#: circular_saw.lua + +Circular Saw=圆锯 +Input material=输入@n材料 +Left-over=剩余材料 +Max=最大值 +Recycle output=回收@n输出物 +Set=设置 +owned by @1=属于@1所有 +Circular Saw is empty=圆锯是空的 +Circular Saw is working on @1=圆锯正在加工@1 + +#: nodes.lua + +Deprecated=弃用 +All-faces Acacia Tree=全切面相思树木方块 +All-faces Aspen Tree=全切面白杨树木方块 +All-faces Jungle Tree=全切面丛林树木方块 +All-faces Pine Tree=全切面松树木方块 +All-faces Tree=全切面树木方块 +Cactus Brick=仙人掌砖 +Cactus Checker=仙人掌棋盘方块 +Centered Wooden Tile=居中的木瓦 +Checker Stone Tile=棋盘石瓦 +Circle Stone Bricks=圆石砖 +Clean Glass=干净的玻璃 +Coal Checker=棋盘煤块 +Coal Glass=煤玻璃 +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=煤炭石 +Coal Stone Bricks=煤炭石砖 +Compressed Cobblestone=压缩圆石 +Compressed Desert Cobblestone= +Compressed Dirt=压缩土 +Copper Patina Block=铜绿方块 +Empty Shelf=空书架 +Full Wooden Tile=全木瓦 +Glow Glass=发光玻璃 +Iron Checker=棋盘铁方块 +Iron Glass=铁玻璃 +Iron Stone=铁石 +Iron Stone Bricks=铁石砖 +Plankstone=板石 +Rope=绳子 +Split Stone Tile=裂石砖 +Stone Bricks=石砖 +Stone Tile=石瓦 +Super Glow Glass=超级发光玻璃 +Sweeper=清扫器 +Tar=焦油 +Trap Desert Stone=陷阱沙漠石 +Trap Glass=陷阱玻璃 +Trap Glow Glass=陷阱发光玻璃 +Trap Obsidian=陷阱黑耀石 +Trap Obsidian Glass=陷阱黑耀石玻璃 +Trap Sandstone=陷阱沙石 +Trap Stone=陷阱石 +Trap Super Glow Glass=陷阱超级发光玻璃 +Wooden Tile=木瓦 +Offset Wooden Tile=胶合木瓦 +Downwards Wooden Tile=向下的木瓦 +Leftwards Wooden Tile=向左的木瓦 +Rightwards Wooden Tile=向右的木瓦 + + +#: ownership.lua + +Sorry, @1 owns that spot.=抱歉,那个位置是@1的。 +someone=某人 + +#: stairsplus/common.lua + +@1 Microblock=@1小方块 +@1 Slab=@1台阶 +@1 Slope=@1斜坡 +@1 Panel=@1嵌板 +@1 Stairs=@1楼梯 + +#: stairsplus/registrations.lua + +Concrete= +Cement= +Brass Block= diff --git a/mods/moreblocks/locale/moreblocks.zh_TW.tr b/mods/moreblocks/locale/moreblocks.zh_TW.tr new file mode 100644 index 0000000..49a8cbc --- /dev/null +++ b/mods/moreblocks/locale/moreblocks.zh_TW.tr @@ -0,0 +1,94 @@ +# textdomain: moreblocks + +# zh_TW translation for More Blocks. +# Copyright © 2011-2020 Hugo Locurcio and contributors +# This file is distributed under the same license as the More Blocks package. +# IFRFSX , 2020. + +#: circular_saw.lua + +Circular Saw=圓鋸 +Input material=輸入@n材料 +Left-over=剩餘材料 +Max=最大值 +Recycle output=回收@n輸出物 +Set=設置 +owned by @1=屬於@1所有 +Circular Saw is empty=圓鋸是空的 +Circular Saw is working on @1=圓鋸正在加工@1 + +#: nodes.lua + +Deprecated=棄用 +All-faces Acacia Tree=全切面相思樹木方塊 +All-faces Aspen Tree=全切面白楊樹木方塊 +All-faces Jungle Tree=全切面叢林樹木方塊 +All-faces Pine Tree=全切面松樹木方塊 +All-faces Tree=全切面樹木方塊 +Cactus Brick=仙人掌磚 +Cactus Checker=仙人掌棋盤方塊 +Centered Wooden Tile=居中的木瓦 +Checker Stone Tile=棋盤石瓦 +Circle Stone Bricks=圓石磚 +Clean Glass=乾淨的玻璃 +Coal Checker=棋盤煤塊 +Coal Glass=煤玻璃 +Clean Super Glow Glass= +Trap Clean Super Glow Glass= +Trap Clean Glass= +Clean Glow Glass= +Trap Clean Glow Glass= +Coal Stone=煤炭石 +Coal Stone Bricks=煤炭石磚 +Compressed Cobblestone=壓縮圓石 +Compressed Desert Cobblestone= +Compressed Dirt=壓縮土 +Copper Patina Block=銅綠方塊 +Empty Shelf=空書架 +Full Wooden Tile=全木瓦 +Glow Glass=發光玻璃 +Iron Checker=棋盤鐵方塊 +Iron Glass=鐵玻璃 +Iron Stone=鐵石 +Iron Stone Bricks=鐵石磚 +Plankstone=板石 +Rope=繩子 +Split Stone Tile=裂石磚 +Stone Bricks=石磚 +Stone Tile=石瓦 +Super Glow Glass=超級發光玻璃 +Sweeper=清掃器 +Tar=焦油 +Trap Desert Stone=陷阱沙漠石 +Trap Glass=陷阱玻璃 +Trap Glow Glass=陷阱發光玻璃 +Trap Obsidian=陷阱黑耀石 +Trap Obsidian Glass=陷阱黑耀石玻璃 +Trap Sandstone=陷阱沙石 +Trap Stone=陷阱石 +Trap Super Glow Glass=陷阱超級發光玻璃 +Wooden Tile=木瓦 +Offset Wooden Tile=膠合木瓦 +Downwards Wooden Tile=向下的木瓦 +Leftwards Wooden Tile=向左的木瓦 +Rightwards Wooden Tile=向右的木瓦 + + +#: ownership.lua + +Sorry, @1 owns that spot.=抱歉,那個位置是@1的。 +someone=某人 + +#: stairsplus/common.lua + +@1 Microblock=@1小方塊 +@1 Slab=@1臺階 +@1 Slope=@1斜坡 +@1 Panel=@1嵌板 +@1 Stairs=@1樓梯 + +#: stairsplus/registrations.lua + +Concrete= +Cement= +Brass Block= diff --git a/mods/moreblocks/mod.conf b/mods/moreblocks/mod.conf new file mode 100644 index 0000000..c9dd836 --- /dev/null +++ b/mods/moreblocks/mod.conf @@ -0,0 +1,4 @@ +name = moreblocks +description = Adds various miscellaneous blocks to the game. +optional_depends = default,stairs,farming,wool,basic_materials,place_rotated +min_minetest_version = 5.0.0 diff --git a/mods/moreblocks/models/moreblocks_slope.obj b/mods/moreblocks/models/moreblocks_slope.obj new file mode 100644 index 0000000..57298d7 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope.obj @@ -0,0 +1,56 @@ +g top +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +s off +f 2/1/1 1/2/1 4/3/1 3/4/1 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 6/5/2 5/6/2 7/7/2 8/8/2 +g right +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 9/9/3 11/10/3 10/11/3 +g left +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 12/12/4 13/13/4 14/14/4 +g back +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 15/15/5 16/16/5 17/17/5 18/18/5 diff --git a/mods/moreblocks/models/moreblocks_slope_cut.obj b/mods/moreblocks/models/moreblocks_slope_cut.obj new file mode 100644 index 0000000..bf2dd79 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_cut.obj @@ -0,0 +1,68 @@ +g top +v 0.500000 0.500000 0.500000 +v -0.500000 -0.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.5000 0.0000 +vt 1.0000 1.0000 +vt 0.5000 2.0000 +vt 0.0000 1.0000 +vn -0.4082 0.8165 -0.4082 +s 1 +f 4/1/1 2/2/1 1/3/1 3/4/1 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 6/5/2 5/6/2 8/7/2 7/8/2 +g right +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vn -1.0000 0.0000 0.0000 +s 1 +f 11/9/3 9/10/3 10/11/3 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +s 1 +f 12/12/4 14/13/4 15/14/4 13/15/4 +g back +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.000000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 0.5000 +vn -0.0000 -0.0000 1.0000 +s 1 +f 16/16/5 17/17/5 18/18/5 19/19/5 +g front +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 0.5000 +vn 0.0000 0.0000 -1.0000 +s 1 +f 20/20/6 22/21/6 21/22/6 diff --git a/mods/moreblocks/models/moreblocks_slope_half.obj b/mods/moreblocks/models/moreblocks_slope_half.obj new file mode 100644 index 0000000..1fa631c --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_half.obj @@ -0,0 +1,56 @@ +g top +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.8944 -0.4472 +s off +f 2/1/1 1/2/1 4/3/1 3/4/1 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 6/5/2 5/6/2 7/7/2 8/8/2 +g right +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 9/9/3 11/10/3 10/11/3 +g left +v 0.500000 -0.000000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 12/12/4 13/13/4 14/14/4 +g back +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 15/15/5 16/16/5 17/17/5 18/18/5 diff --git a/mods/moreblocks/models/moreblocks_slope_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_half_raised.obj new file mode 100644 index 0000000..86139d7 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_half_raised.obj @@ -0,0 +1,72 @@ +g top +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vn 0.0000 0.8944 -0.4472 +s off +f 2/1/1 1/2/1 4/3/1 3/4/1 +g bottom +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 6/5/2 5/6/2 7/7/2 8/8/2 +g right +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 9/9/3 10/10/3 11/11/3 12/12/3 +g left +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 0.5000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 13/13/4 15/14/4 16/15/4 14/16/4 +g back +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 19/17/5 17/18/5 18/19/5 20/20/5 +g front +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 21/21/6 23/22/6 24/23/6 22/24/6 diff --git a/mods/moreblocks/models/moreblocks_slope_inner.obj b/mods/moreblocks/models/moreblocks_slope_inner.obj new file mode 100644 index 0000000..c6f811e --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner.obj @@ -0,0 +1,81 @@ +g top +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 0.0000 +s 1 +f 3/1/1 2/2/1 4/3/1 +f 2/4/2 1/5/2 5/6/2 +g bottom +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 9/7/3 7/8/3 6/9/3 8/10/3 +l 8 10 +g right +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s 1 +f 11/11/4 12/12/4 13/13/4 +g left +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s 1 +f 14/14/5 15/15/5 16/16/5 17/17/5 +l 15 18 +g back +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +s 1 +f 22/18/6 20/19/6 19/20/6 21/21/6 +l 22 23 +l 19 23 +g front +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +s 1 +f 24/22/7 25/23/7 27/24/7 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_cut.obj b/mods/moreblocks/models/moreblocks_slope_inner_cut.obj new file mode 100644 index 0000000..babe502 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_cut.obj @@ -0,0 +1,72 @@ +g top +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.5000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.5774 0.5774 -0.5774 +s 1 +f 3/1/1 2/2/1 1/3/1 +f 4/4/2 3/5/2 1/6/2 +g bottom +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 6/7/3 5/8/3 7/9/3 8/10/3 +g right +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn -1.0000 0.0000 0.0000 +s 1 +f 11/11/4 9/12/4 10/13/4 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +s 1 +f 12/14/5 13/15/5 14/16/5 15/17/5 +g back +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +s 1 +f 18/18/6 16/19/6 17/20/6 19/21/6 +g front +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +s 1 +f 20/22/7 22/23/7 21/24/7 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_cut_half.obj b/mods/moreblocks/models/moreblocks_slope_inner_cut_half.obj new file mode 100644 index 0000000..5af38b5 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_cut_half.obj @@ -0,0 +1,72 @@ +g top +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.5000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.4082 0.8165 -0.4082 +s 1 +f 3/1/1 2/2/1 1/3/1 +f 4/4/2 3/5/2 1/6/2 +g bottom +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 6/7/3 5/8/3 7/9/3 8/10/3 +g right +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vn -1.0000 0.0000 0.0000 +s 1 +f 11/11/4 9/12/4 10/13/4 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.000000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vn 1.0000 0.0000 0.0000 +s 1 +f 12/14/5 13/15/5 14/16/5 15/17/5 +g back +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.000000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vn 0.0000 -0.0000 1.0000 +s 1 +f 18/18/6 16/19/6 17/20/6 19/21/6 +g front +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 0.5000 +vn 0.0000 0.0000 -1.0000 +s 1 +f 20/22/7 22/23/7 21/24/7 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_cut_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_inner_cut_half_raised.obj new file mode 100644 index 0000000..d8c1f81 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_cut_half_raised.obj @@ -0,0 +1,76 @@ +g top +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.5000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.4082 0.8165 -0.4082 +s 1 +f 3/1/1 2/2/1 1/3/1 +f 4/4/2 3/5/2 1/6/2 +g bottom +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s 1 +f 6/7/3 5/8/3 7/9/3 8/10/3 +g right +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.000000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 0.5000 +vn -1.0000 0.0000 0.0000 +s 1 +f 11/11/4 9/12/4 10/13/4 12/14/4 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +s 1 +f 13/15/5 14/16/5 15/17/5 16/18/5 +g back +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +s 1 +f 19/19/6 17/20/6 18/21/6 20/22/6 +g front +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.000000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 1.0000 +vn -0.0000 0.0000 -1.0000 +s 1 +f 21/23/7 23/24/7 24/25/7 22/26/7 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_half.obj b/mods/moreblocks/models/moreblocks_slope_inner_half.obj new file mode 100644 index 0000000..3158b57 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_half.obj @@ -0,0 +1,85 @@ +g top +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vn 0.0000 0.8944 -0.4472 +vn -0.4472 0.8944 0.0000 +s off +f 3/1/1 2/2/1 4/3/1 +f 2/4/2 1/5/2 5/6/2 +g bottom +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 10/7/3 7/8/3 6/9/3 9/10/3 +l 9 8 +l 11 9 +g right +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 12/11/4 13/12/4 14/13/4 +l 15 14 +g left +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.000000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 16/14/5 17/15/5 18/16/5 19/17/5 +l 20 17 +g back +v 0.500000 -0.000000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 24/18/6 22/19/6 21/20/6 23/21/6 +l 25 24 +l 25 21 +g front +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 26/22/7 27/23/7 29/24/7 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_inner_half_raised.obj new file mode 100644 index 0000000..bd41389 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_half_raised.obj @@ -0,0 +1,86 @@ +g top +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.8944 -0.4472 +vn -0.4472 0.8944 0.0000 +s off +f 3/1/1 2/2/1 4/3/1 +f 2/2/2 1/4/2 5/5/2 +g bottom +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 8/6/3 9/7/3 7/8/3 6/9/3 +l 10 8 +g right +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 13/10/4 11/11/4 12/12/4 15/13/4 +g left +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 16/14/5 17/15/5 18/16/5 19/17/5 +l 20 17 +g back +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 24/18/6 22/19/6 21/20/6 23/21/6 +l 25 21 +l 25 24 +g front +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 0.5000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +s off +f 28/22/7 26/23/7 27/24/7 30/25/7 +l 29 26 diff --git a/mods/moreblocks/models/moreblocks_slope_outer.obj b/mods/moreblocks/models/moreblocks_slope_outer.obj new file mode 100644 index 0000000..c779309 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer.obj @@ -0,0 +1,48 @@ +g top +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.7071 -0.7071 +s off +f 4/1/1 2/2/1 1/3/1 +f 4/4/2 3/5/2 2/6/2 +g bottom +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 5/7/3 6/8/3 7/9/3 8/10/3 +g right +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 10/11/4 9/12/4 11/13/4 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 14/14/5 12/15/5 13/16/5 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_cut.obj b/mods/moreblocks/models/moreblocks_slope_outer_cut.obj new file mode 100644 index 0000000..4dcd46a --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_cut.obj @@ -0,0 +1,40 @@ +g top +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 0.0000 +vt 0.5000 1.0000 +vt 0.0000 0.0000 +vn -0.5774 0.5774 -0.5774 +s off +f 2/1/1 1/2/1 3/3/1 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 5/4/2 4/5/2 6/6/2 +g right +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 7/7/3 8/8/3 9/9/3 +g left +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 12/10/4 10/11/4 11/12/4 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_cut_half.obj b/mods/moreblocks/models/moreblocks_slope_outer_cut_half.obj new file mode 100644 index 0000000..c309a4e --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_cut_half.obj @@ -0,0 +1,40 @@ +g top +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 0.0000 +vt 0.5000 1.0000 +vt 0.0000 0.0000 +vn -0.4082 0.8165 -0.4082 +s off +f 2/1/1 1/2/1 3/3/1 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 5/4/2 4/5/2 6/6/2 +g right +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 7/7/3 8/8/3 9/9/3 +g left +v 0.500000 -0.000000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.0000 0.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 12/10/4 10/11/4 11/12/4 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_cut_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_outer_cut_half_raised.obj new file mode 100644 index 0000000..78cdfed --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_cut_half_raised.obj @@ -0,0 +1,56 @@ +g top +v -0.500000 -0.000000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.000000 -0.500000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn -0.4082 0.8165 -0.4082 +s off +f 1/1/1 2/2/1 3/3/1 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 4/4/2 6/5/2 5/6/2 +g right +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +s off +f 8/7/3 7/8/3 10/9/3 9/10/3 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vn 1.0000 0.0000 0.0000 +s off +f 12/11/4 11/12/4 13/13/4 14/14/4 +g back +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn -0.0000 -0.0000 1.0000 +s off +f 15/15/5 16/16/5 17/17/5 18/18/5 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_half.obj b/mods/moreblocks/models/moreblocks_slope_outer_half.obj new file mode 100644 index 0000000..b87be69 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_half.obj @@ -0,0 +1,48 @@ +g top +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.000000 0.500000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vn 0.0000 0.8944 -0.4472 +vn -0.4472 0.8944 0.0000 +s off +f 2/1/1 4/2/1 3/3/1 +f 1/4/2 4/5/2 2/6/2 +g bottom +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 5/7/3 6/8/3 7/9/3 8/10/3 +g right +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.000000 0.500000 +vt 1.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +s off +f 11/11/4 9/12/4 10/13/4 +g left +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.000000 0.500000 +vt 1.0000 0.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +s off +f 12/14/5 14/15/5 13/16/5 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_outer_half_raised.obj new file mode 100644 index 0000000..e06304d --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_half_raised.obj @@ -0,0 +1,74 @@ +g top +v -0.500000 -0.000000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 1.0000 +vn 0.0000 0.8944 -0.4472 +vn -0.4472 0.8944 0.0000 +s off +f 4/1/1 2/2/1 3/3/1 +f 4/1/2 1/4/2 2/2/2 +g bottom +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +s off +f 7/5/3 6/6/3 5/7/3 8/8/3 +g right +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 9/9/4 11/10/4 12/11/4 10/12/4 +g left +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vn 1.0000 0.0000 0.0000 +s off +f 14/13/5 13/14/5 15/15/5 16/16/5 +g back +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vn -0.0000 -0.0000 1.0000 +s off +f 17/17/6 18/18/6 19/19/6 20/20/6 +g front +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vn 0.0000 0.0000 -1.0000 +s off +f 22/21/7 21/22/7 24/23/7 23/24/7 diff --git a/mods/moreblocks/nodes.lua b/mods/moreblocks/nodes.lua new file mode 100644 index 0000000..fa87633 --- /dev/null +++ b/mods/moreblocks/nodes.lua @@ -0,0 +1,548 @@ +--[[ +More Blocks: node definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.S + +local sound_dirt = moreblocks.node_sound_dirt_defaults() +local sound_wood = moreblocks.node_sound_wood_defaults() +local sound_stone = moreblocks.node_sound_stone_defaults() +local sound_glass = moreblocks.node_sound_glass_defaults() +local sound_leaves = moreblocks.node_sound_leaves_defaults() + +-- Don't break on 0.4.14 and earlier. +local sound_metal = (moreblocks.node_sound_metal_defaults + and moreblocks.node_sound_metal_defaults() or sound_stone) + +local function tile_tiles(name) + local tex = "moreblocks_" ..name.. ".png" + return {tex, tex, tex, tex, tex.. "^[transformR90", tex.. "^[transformR90"} +end + +local function wood_tile_replace(itemstack, placer, pointed_thing) + local substack + if itemstack:get_name() == "moreblocks:wood_tile_flipped" then + substack = ItemStack("moreblocks:wood_tile") + else -- right, left, and down variants + substack = ItemStack("moreblocks:wood_tile_offset") + end + local _, success = core.item_place(substack, placer, pointed_thing) + if success then + itemstack:take_item() + end + return itemstack +end + +local deprecated = (" ("..S('Deprecated')..")") +local nodes = { + ["wood_tile"] = { + description = S("Wooden Tile"), + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90"}, + sounds = sound_wood, + }, + ["wood_tile_flipped"] = { + description = S("Wooden Tile") .. deprecated, + tiles = {"default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR180", + "default_wood.png^moreblocks_wood_tile.png^[transformR180"}, + no_stairs = true, + on_place = wood_tile_replace + }, + ["wood_tile_center"] = { + description = S("Centered Wooden Tile"), + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^moreblocks_wood_tile_center.png"}, + sounds = sound_wood, + }, + ["wood_tile_full"] = { + description = S("Full Wooden Tile"), + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = tile_tiles("wood_tile_full"), + sounds = sound_wood, + }, + ["wood_tile_offset"] = { + description = S("Offset Wooden Tile"), + paramtype2 = "facedir", + place_param2 = 0, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^moreblocks_wood_tile_offset.png"}, + sounds = sound_wood, + no_stairs = true, + }, + ["wood_tile_down"] = { + description = S("Downwards Wooden Tile") .. deprecated, + tiles = {"default_wood.png^[transformR180^moreblocks_wood_tile_offset.png^[transformR180"}, + no_stairs = true, + on_place = wood_tile_replace + }, + ["wood_tile_left"] = { + description = S("Leftwards Wooden Tile") .. deprecated, + tiles = {"default_wood.png^[transformR270^moreblocks_wood_tile_offset.png^[transformR270"}, + no_stairs = true, + on_place = wood_tile_replace + }, + ["wood_tile_right"] = { + description = S("Rightwards Wooden Tile") .. deprecated, + tiles = {"default_wood.png^[transformR90^moreblocks_wood_tile_offset.png^[transformR90"}, + no_stairs = true, + on_place = wood_tile_replace + }, + ["circle_stone_bricks"] = { + description = S("Circle Stone Bricks"), + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["grey_bricks"] = { + description = S("Stone Bricks"), + paramtype2 = "facedir", + place_param2 = 0, + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["coal_stone_bricks"] = { + description = S("Coal Stone Bricks"), + paramtype2 = "facedir", + place_param2 = 0, + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["iron_stone_bricks"] = { + description = S("Iron Stone Bricks"), + paramtype2 = "facedir", + place_param2 = 0, + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["stone_tile"] = { + description = S("Stone Tile"), + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["split_stone_tile"] = { + description = S("Split Stone Tile"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"moreblocks_split_stone_tile_top.png", + "moreblocks_split_stone_tile.png"}, + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["checker_stone_tile"] = { + description = S("Checker Stone Tile"), + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["tar"] = { + description = S("Tar"), + groups = {cracky=2, tar_block=1}, + sounds = sound_stone, + }, + ["dirt_compressed"] = { + description = S("Compressed Dirt"), + groups = {crumbly=2, compressed = 1}, + sounds = sound_dirt, + }, + ["cobble_compressed"] = { + description = S("Compressed Cobblestone"), + groups = {cracky = 1, compressed = 1}, + sounds = sound_stone, + }, + ["desert_cobble_compressed"] = { + description = S("Compressed Desert Cobblestone"), + groups = {cracky = 1, compressed = 1}, + sounds = sound_stone, + }, + ["plankstone"] = { + description = S("Plankstone"), + paramtype2 = "facedir", + place_param2 = 0, + groups = {cracky = 3}, + tiles = tile_tiles("plankstone"), + sounds = sound_stone, + }, + ["iron_glass"] = { + description = S("Iron Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^[colorize:#DEDEDE", "default_glass_detail.png^[colorize:#DEDEDE"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["coal_glass"] = { + description = S("Coal Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^[colorize:#828282", "default_glass_detail.png^[colorize:#828282"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["clean_glass"] = { + description = S("Clean Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"moreblocks_clean_glass.png", "moreblocks_clean_glass_detail.png"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["cactus_brick"] = { + description = S("Cactus Brick"), + paramtype2 = "facedir", + place_param2 = 0, + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["cactus_checker"] = { + description = S("Cactus Checker"), + groups = {stone = 1, cracky = 3}, + tiles = {"default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png^[transformR90", + "default_stone.png^moreblocks_cactus_checker.png^[transformR90"}, + sounds = sound_stone, + }, + ["empty_shelf"] = { + description = S("Empty Shelf"), + paramtype2 = "facedir", + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "moreblocks_empty_shelf.png", "moreblocks_empty_shelf.png"}, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = sound_wood, + furnace_burntime = 15, + no_stairs = true, + }, + ["coal_stone"] = { + description = S("Coal Stone"), + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["iron_stone"] = { + description = S("Iron Stone"), + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["coal_checker"] = { + description = S("Coal Checker"), + tiles = {"default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png^[transformR90", + "default_stone.png^moreblocks_coal_checker.png^[transformR90"}, + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["iron_checker"] = { + description = S("Iron Checker"), + tiles = {"default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png^[transformR90", + "default_stone.png^moreblocks_iron_checker.png^[transformR90"}, + groups = {stone = 1, cracky = 3}, + sounds = sound_stone, + }, + ["trap_stone"] = { + description = S("Trap Stone"), + drawtype = "glasslike_framed", + tiles = {"default_stone.png^moreblocks_trap_box.png"}, + walkable = false, + groups = {cracky = 3}, + paramtype = "light", + sounds = sound_stone, + no_stairs = true, + }, + ["trap_desert_stone"] = { + description = S("Trap Desert Stone"), + drawtype = "glasslike_framed", + tiles = {"default_desert_stone.png^moreblocks_trap_box.png"}, + walkable = false, + groups = {cracky = 3}, + paramtype = "light", + sounds = sound_stone, + no_stairs = true, + }, + ["trap_glass"] = { + description = S("Trap Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^moreblocks_trap_box_glass.png", "default_glass_detail.png"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["trap_obsidian_glass"] = { + description = S("Trap Obsidian Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_obsidian_glass.png^moreblocks_trap_box_glass.png", "default_obsidian_glass_detail.png"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["trap_obsidian"] = { + description = S("Trap Obsidian"), + drawtype = "glasslike_framed", + tiles = {"default_obsidian.png^moreblocks_trap_box.png"}, + walkable = false, + groups = {cracky = 1, level = 2}, + paramtype = "light", + sounds = sound_stone, + no_stairs = true, + }, + ["trap_clean_glass"] = { + description = S("Trap Clean Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"moreblocks_clean_glass.png^moreblocks_trap_box_glass.png", "moreblocks_clean_glass_detail.png"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["trap_sandstone"] = { + description = S("Trap Sandstone"), + drawtype = "glasslike_framed", + tiles = {"default_sandstone.png^moreblocks_trap_box.png"}, + walkable = false, + groups = {crumbly = 1, cracky = 3}, + paramtype = "light", + sounds = sound_stone, + no_stairs = true, + }, + ["all_faces_tree"] = { + description = S("All-faces Tree"), + tiles = {"default_tree_top.png"}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = sound_wood, + furnace_burntime = 30, + }, + ["all_faces_jungle_tree"] = { + description = S("All-faces Jungle Tree"), + tiles = {"default_jungletree_top.png"}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = sound_wood, + furnace_burntime = 38, + }, + ["all_faces_pine_tree"] = { + description = S("All-faces Pine Tree"), + tiles = {"default_pine_tree_top.png"}, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = sound_wood, + furnace_burntime = 26, + }, + ["all_faces_acacia_tree"] = { + description = S("All-faces Acacia Tree"), + tiles = {"default_acacia_tree_top.png"}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = sound_wood, + furnace_burntime = 34, + }, + ["all_faces_aspen_tree"] = { + description = S("All-faces Aspen Tree"), + tiles = {"default_aspen_tree_top.png"}, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = sound_wood, + furnace_burntime = 22, + }, + ["glow_glass"] = { + description = S("Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^[colorize:#E9CD61", "default_glass_detail.png^[colorize:#E9CD61"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["clean_glow_glass"] = { + description = S("Clean Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"moreblocks_clean_glass.png^[colorize:#E9CD61", "moreblocks_clean_glass_detail.png^[colorize:#E9CD61"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["trap_glow_glass"] = { + description = S("Trap Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^[colorize:#E9CD61^moreblocks_trap_box_glass.png", "default_glass_detail.png^[colorize:#E9CD61"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["trap_clean_glow_glass"] = { + description = S("Trap Clean Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"moreblocks_clean_glass.png^[colorize:#E9CD61^moreblocks_trap_box_glass.png", "moreblocks_clean_glass_detail.png^[colorize:#E9CD61"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["super_glow_glass"] = { + description = S("Super Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^[colorize:#FFFF78", "default_glass_detail.png^[colorize:#FFFF78"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = default.LIGHT_MAX, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["clean_super_glow_glass"] = { + description = S("Clean Super Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"moreblocks_clean_glass.png^[colorize:#FFFF78", "moreblocks_clean_glass_detail.png^[colorize:#FFFF78"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = default.LIGHT_MAX, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["trap_super_glow_glass"] = { + description = S("Trap Super Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png^[colorize:#FFFF78^moreblocks_trap_box_glass.png", "default_glass_detail.png^[colorize:#FFFF78"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = default.LIGHT_MAX, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["trap_clean_super_glow_glass"] = { + description = S("Trap Clean Super Glow Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"moreblocks_clean_glass.png^[colorize:#FFFF78^moreblocks_trap_box_glass.png", "moreblocks_clean_glass_detail.png^[colorize:#FFFF78"}, + use_texture_alpha = "clip", + paramtype = "light", + sunlight_propagates = true, + light_source = default.LIGHT_MAX, + walkable = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["rope"] = { + description = S("Rope"), + drawtype = "signlike", + inventory_image = "moreblocks_rope.png", + wield_image = "moreblocks_rope.png", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + walkable = false, + climbable = true, + selection_box = {type = "wallmounted",}, + groups = {snappy = 3, flammable = 2}, + sounds = sound_leaves, + no_stairs = true, + }, + ["copperpatina"] = { + description = S("Copper Patina Block"), + groups = {cracky = 1, level = 2}, + sounds = sound_metal, + }, +} + +for name, def in pairs(nodes) do + def.is_ground_content = def.is_ground_content == true + def.tiles = def.tiles or {"moreblocks_" ..name.. ".png"} + + local burntime = def.furnace_burntime + def.furnace_burntime = nil -- deprecated node def field + + core.register_node("moreblocks:" ..name, def) + core.register_alias(name, "moreblocks:" ..name) + + -- Optional: register the node as fuel + if burntime then + core.register_craft({ + type = "fuel", + recipe = "moreblocks:" .. name, + burntime = burntime, + }) + end + + local tiles = def.tiles + + -- Use the primary tile for all sides of cut glasslike nodes. + -- This makes them easier to see + if + #tiles > 1 and + def.drawtype and + def.drawtype == "glasslike_framed" or + def.drawtype == "glasslike_framed_optional" + then + tiles = {def.tiles[1]} + end + + + if not def.no_stairs then + local groups = {} + for k, v in pairs(def.groups) do groups[k] = v end + stairsplus:register_all("moreblocks", name, "moreblocks:" ..name, { + description = def.description, + groups = groups, + tiles = tiles, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + sounds = def.sounds, + }) + end +end + +-- Items + +core.register_craftitem("moreblocks:sweeper", { + description = S("Sweeper"), + inventory_image = "moreblocks_sweeper.png", +}) diff --git a/mods/moreblocks/ownership.lua b/mods/moreblocks/ownership.lua new file mode 100644 index 0000000..ca2f54b --- /dev/null +++ b/mods/moreblocks/ownership.lua @@ -0,0 +1,41 @@ +--[[ +More Blocks: ownership handling + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.S + +function moreblocks.node_is_owned(pos, placer) + local ownername = false + if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod + if HasOwner(pos, placer) then -- returns true if the node is owned + if not IsPlayerNodeOwner(pos, placer:get_player_name()) then + if type(getLastOwner) == "function" then -- ...is an old version + ownername = getLastOwner(pos) + elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version + ownername = GetNodeOwnerName(pos) + else + ownername = S("someone") + end + end + end + + elseif type(isprotect)=="function" then -- glomie's protection mod + if not isprotect(5, pos, placer) then + ownername = S("someone") + end + elseif type(protector)=="table" and type(protector.can_dig)=="function" then -- Zeg9's protection mod + if not protector.can_dig(5, pos, placer) then + ownername = S("someone") + end + end + + if ownername ~= false then + core.chat_send_player( placer:get_player_name(), S("Sorry, @1 owns that spot.", ownername) ) + return true + else + return false + end +end diff --git a/mods/moreblocks/redefinitions.lua b/mods/moreblocks/redefinitions.lua new file mode 100644 index 0000000..1be17a5 --- /dev/null +++ b/mods/moreblocks/redefinitions.lua @@ -0,0 +1,94 @@ +--[[ +More Blocks: redefinitions of default stuff + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local modname = core.get_current_modname() + +-- Redefine some of the default crafting recipes to be more productive + +-- Auxiliary function: take a recipe as returned by get_all_craft_recipes +-- and turn it into a table that can be used to clear a craft or declare a new one +local reconstruct_internal_craft = function(recipe) + local recp = { + { "", "", "" }, + { "", "", "" }, + { "", "", "" }, + } + local width = recipe.width + for idx, item in pairs(recipe.items) do + local row = math.ceil(idx / width) + local col = idx - (row-1)*width + recp[row][col] = item + end + return recp +end + +-- Change the amount produced by recipe by apply func to the old amount +local change_recipe_amount = function(product, recipe, func) + -- if width == 0, this is a shapeless recipe, for which the + -- internal and Lua API recipe table is the same. + -- Otherwise we need to reconstruct the table for the shaped recipe. + local shapeless = (recipe.width == 0) + local recp = shapeless and recipe.items or reconstruct_internal_craft(recipe) + + local oldamount = tonumber(recipe.output:match(" [0-9]+$") or "1") + + local newamount = func(oldamount) + + -- remove old crafting recipe + local redo = { recipe = recp } + -- preserve shapelessness + if shapeless then + redo.type = "shapeless" + end + core.clear_craft(redo) + + -- new output + redo.output = ("%s %d"):format(product, newamount) + core.register_craft(redo) + + core.log("action", ("[MOD]%s: recipe for %s production: %d => %d"):format(modname, product, oldamount, newamount)) +end + +local increase_craft_production = function(product, func) + local recipes = core.get_all_craft_recipes(product) + for _, r in pairs(recipes) do + if r.type == "normal" or r.method == "normal" then + change_recipe_amount(product, r, func) + end + end +end + +-- Increase the crafting production according to the rules from the table, which is in the form: +-- { +-- { detector, amount changing function } +-- { detector, amount changing function } +-- } +-- TODO: consider exporting this function to other mods +local increase_craft_production_table = function(map_table) + for product, _ in pairs(core.registered_items) do + for _, tab in pairs(map_table) do + local detector = tab[1] + local func = tab[2] + if detector(product) then + increase_craft_production(product, func) + -- only apply one boost + break + end + end + end +end + +increase_craft_production_table({ + { function(n) return n:match('^default:sign_wall') end, function(old) return old + 1 end }, + { function(n) return n == 'default:paper' end, function(old) return old*4 end }, + { function(n) return n:match('^carts:.*rail$') or n:match('^default:.*rail$') end, function(old) return old + old/2 end }, +}) + +core.register_craft({ + type = "toolrepair", + additional_wear = -0.10, -- Tool repair buff (10% bonus instead of 2%). +}) diff --git a/mods/moreblocks/settingtypes.txt b/mods/moreblocks/settingtypes.txt new file mode 100644 index 0000000..c52286e --- /dev/null +++ b/mods/moreblocks/settingtypes.txt @@ -0,0 +1,3 @@ +# If enabled, Stairs+ nodes will be displayed in the inventory when playing in creative mode. +# Disabling this can speed up loading times for clients as fewer nodes need to be registered in the creative inventory. +moreblocks.stairsplus_in_creative_inventory (Display Stairs+ nodes in creative inventory) bool true diff --git a/mods/moreblocks/sounds.lua b/mods/moreblocks/sounds.lua new file mode 100644 index 0000000..f337355 --- /dev/null +++ b/mods/moreblocks/sounds.lua @@ -0,0 +1,20 @@ +--[[ +More Blocks: sound definitions + +Copyright © 2011-2021 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local has_default_mod = core.get_modpath("default") +for _, sound in ipairs({"dirt", "wood", "stone", "metal", "glass", "leaves"}) do + -- use sound-function from default if available + -- otherwise fall back to a no-op function (no sounds) + local sound_function_name = "node_sound_" .. sound .. "_defaults" + if has_default_mod then + -- use default sounds + moreblocks[sound_function_name] = default[sound_function_name] + else + -- no-op + moreblocks[sound_function_name] = function() end + end +end diff --git a/mods/moreblocks/stairsplus/API.md b/mods/moreblocks/stairsplus/API.md new file mode 100644 index 0000000..9a9a4d7 --- /dev/null +++ b/mods/moreblocks/stairsplus/API.md @@ -0,0 +1,82 @@ +# API documentation for Stairs+ + +* `stairsplus:register_all(modname, subname, recipeitem, fields)` + Registers a stair, slab, panel, microblock, and any other types of + nodes to be added in the future. + This also registers the node with the circular saw. + Example: + ```lua + stairsplus:register_all("moreblocks", "wood", "default:wood", { + description = "Wooden", + tiles = {"default_wood.png"}, + groups = {oddly_breakable_by_hand=1}, + sounds = moreblocks.node_sound_wood_defaults(), + }) + ``` +The following register only a particular type of microblock. +You will probably never want to use them directly: + +* `stairsplus:register_stair(modname, subname, recipeitem, fields)` +* `stairsplus:register_slab(modname, subname, recipeitem, fields)` +* `stairsplus:register_panel(modname, subname, recipeitem, fields)` +* `stairsplus:register_micro(modname, subname, recipeitem, fields)` +* `stairsplus:register_slope(modname, subname, recipeitem, fields)` + +If you only want to register a subset of stairsplus nodes, +you can use the `stairsplus:register_custom_subset(subset, modname, subname, recipeitem, fields)` function. +The subset table should have the following format: + +```lua + local subset = { + { "micro", "" }, + { "micro", "_1" }, + { "micro", "_2" }, + { "micro", "_4" }, + { "micro", "_12" }, + { "micro", "_14" }, + { "micro", "_15" }, + { "panel", "" }, + { "panel", "_1" }, + { "panel", "_2" }, + { "panel", "_4" }, + { "panel", "_12" }, + { "panel", "_14" }, + { "panel", "_15" }, + { "slab", "" }, + { "slab", "_quarter" }, + { "slab", "_three_quarter" }, + { "slab", "_1" }, + { "slab", "_2" }, + { "slab", "_14" }, + { "slab", "_15" }, + { "slab", "_two_sides" }, + { "slab", "_three_sides" }, + { "slab", "_three_sides_u" }, + { "slope", "" }, + { "slope", "_half" }, + { "slope", "_half_raised" }, + { "slope", "_inner" }, + { "slope", "_inner_half" }, + { "slope", "_inner_half_raised" }, + { "slope", "_inner_cut" }, + { "slope", "_inner_cut_half" }, + { "slope", "_inner_cut_half_raised" }, + { "slope", "_outer" }, + { "slope", "_outer_half" }, + { "slope", "_outer_half_raised" }, + { "slope", "_outer_cut" }, + { "slope", "_outer_cut_half" }, + { "slope", "_outer_cut_half_raised" }, + { "slope", "_cut" }, + { "stair", "" }, + { "stair", "_half" }, + { "stair", "_right_half" }, + { "stair", "_inner" }, + { "stair", "_outer" }, + { "stair", "_alt" }, + { "stair", "_alt_1" }, + { "stair", "_alt_2" }, + { "stair", "_alt_4" }, + } +``` +You can remove entries as needed. diff --git a/mods/moreblocks/stairsplus/common.lua b/mods/moreblocks/stairsplus/common.lua new file mode 100644 index 0000000..97a5700 --- /dev/null +++ b/mods/moreblocks/stairsplus/common.lua @@ -0,0 +1,192 @@ +--[[ +More Blocks: registrations + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.S + +local descriptions = { + ["micro"] = "Microblock", + ["slab"] = "Slab", + ["slope"] = "Slope", + ["panel"] = "Panel", + ["stair"] = "Stairs", +} + +-- Extends the standad rotate_node placement so that it takes into account +-- the side (top/bottom or left/right) of the face being pointed at. +-- As with the standard rotate_node, sneak can be used to force the perpendicular +-- placement (wall placement on floor/ceiling, floor/ceiling placement on walls). +-- Additionally, the aux / sprint / special key can be used to place the node +-- as if from the opposite side. +-- +-- When placing a node next to one of the same category (e.g. slab to slab or +-- stair to stair), the default placement (regardless of sneak) is to copy the +-- under node's param2, flipping if placed above or below it. The aux key disable +-- this behavior. +local wall_right_dirmap = {9, 18, 7, 12} +local wall_left_dirmap = {11, 16, 5, 14} +local ceil_dirmap = {20, 23, 22, 21} + +-- extract the stairsplus category from a node name +-- assumes the name is in the form mod_name:category_original_ndoe_name +local function name_to_category(name) + local colon = name:find(":") or 0 + colon = colon + 1 + local under = name:find("_", colon) + return name:sub(colon, under) +end + +stairsplus.rotate_node_aux = function(itemstack, placer, pointed_thing) + local sneak = placer and placer:get_player_control().sneak + local aux = placer and placer:get_player_control().aux1 + + -- category for what we are placing + local item_prefix = name_to_category(itemstack:get_name()) + -- category for what we are placing against + local under = pointed_thing.under + local under_node = core.get_node(under) + local under_prefix = under_node and name_to_category(under_node.name) + + local same_cat = item_prefix == under_prefix + + -- standard (floor) facedir, also used for sneak placement against the lower half of the wall + local p2 = placer and core.dir_to_facedir(placer:get_look_dir()) or 0 + + -- check which face and which quadrant we are interested in + -- this is used both to check if we're handling parallel placement in the same-category case, + -- and in general for sneak placement + local face_pos = core.pointed_thing_to_face_pos(placer, pointed_thing) + local face_off = vector.subtract(face_pos, under) + + -- we cannot trust face_off to tell us the correct directionif the + -- under node has a non-standard shape, so use the distance between under and above + local wallmounted = core.dir_to_wallmounted(vector.subtract(pointed_thing.above, under)) + + if same_cat and not aux then + -- param2 can be in the range [0, 31]. We assume that the stair nodes use the + -- drawtype "facedir". Wrap the value like done in Luanti `src/mapnode.cpp`. + p2 = under_node.param2 % 24 + + -- flip if placing above or below an upright or upside-down node + -- TODO should we also flip when placing next to a side-mounted node? + if wallmounted < 2 then + if p2 < 4 then + p2 = (p2 + 2) % 4 + p2 = ceil_dirmap[p2 + 1] + elseif p2 > 19 then + p2 = ceil_dirmap[p2 - 19] - 20 + p2 = (p2 + 2) % 4 + end + end + else + -- for same-cat placement, aux is used to disable param2 copying + if same_cat then + aux = not aux + end + + local remap = nil + + -- standard placement against the wall + local use_wallmap = (wallmounted > 1 and not sneak) or (wallmounted < 2 and sneak) + + -- standard placement against the ceiling, or sneak placement against the upper half of the wall + local use_ceilmap = wallmounted == 1 and not sneak + use_ceilmap = use_ceilmap or (wallmounted > 1 and sneak and face_off.y > 0) + + if use_wallmap then + local left = (p2 == 0 and face_off.x < 0) or + (p2 == 1 and face_off.z > 0) or + (p2 == 2 and face_off.x > 0) or + (p2 == 3 and face_off.z < 0) + if aux then + left = not left + end + remap = left and wall_left_dirmap or wall_right_dirmap + elseif use_ceilmap then + remap = ceil_dirmap + end + + if aux then + p2 = (p2 + 2) % 4 + end + + if remap then + p2 = remap[p2 + 1] + end + end + + return core.item_place(itemstack, placer, pointed_thing, p2) +end + +stairsplus.register_single = function(category, alternate, info, modname, subname, recipeitem, fields) + + local src_def = core.registered_nodes[recipeitem] or {} + local desc_base = S("@1 "..descriptions[category], fields.description) + local def = {} + + if category ~= "slab" then + def = table.copy(info) + end + + -- copy fields to def + for k, v in pairs(fields) do + def[k] = v + end + + def.is_ground_content = def.is_ground_content == true + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = def.paramtype2 or "facedir" + if def.use_texture_alpha == nil then + def.use_texture_alpha = src_def.use_texture_alpha + end + + -- This makes node rotation work on placement + def.place_param2 = nil + + -- This strips palettes from respective nodes to prevent warnings + def.palette = nil + + -- Darken light sources slightly to make up for their smaller visual size + def.light_source = math.max(0, (def.light_source or 0) - 1) + def.groups = stairsplus:prepare_groups(fields.groups) + + if category == "slab" then + if core.global_exists("place_rotated") then + def.on_place = place_rotated.slab + else + def.on_place = stairsplus.rotate_node_aux + end + if info._circular_saw_cost then + def._circular_saw_cost = info._circular_saw_cost + end + if info.size then + def.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, (info.size/16)-0.5, 0.5}, + } + def.description = ("%s (%d/16)"):format(desc_base, info.size) + else + def.node_box = info.node_box + def.description = desc_base .. alternate:gsub("_", " "):gsub("(%a)(%S*)", function(a, b) return a:upper() .. b end) + end + else + def.on_place = stairsplus.rotate_node_aux + def.description = desc_base + if category == "slope" then + def.drawtype = "mesh" + elseif category == "stair" and alternate == "" then + def.groups.stair = 1 + end + end + + if fields.drop and (type(fields.drop) ~= "table") then + def.drop = modname.. ":" .. category .. "_" .. fields.drop .. alternate + end + + core.register_node(":" ..modname.. ":" .. category .. "_" .. subname .. alternate, def) + stairsplus.register_recipes(category, alternate, modname, subname, recipeitem) +end diff --git a/mods/moreblocks/stairsplus/custom.lua b/mods/moreblocks/stairsplus/custom.lua new file mode 100644 index 0000000..9aa2fc5 --- /dev/null +++ b/mods/moreblocks/stairsplus/custom.lua @@ -0,0 +1,98 @@ +--[[ +More Blocks: microblock definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +--[[ +Subset table should have the following format: (You can remove entries as needed.) + +local subset = { + { "micro", "" }, + { "micro", "_1" }, + { "micro", "_2" }, + { "micro", "_4" }, + { "micro", "_12" }, + { "micro", "_14" }, + { "micro", "_15" }, + { "panel", "" }, + { "panel", "_1" }, + { "panel", "_2" }, + { "panel", "_4" }, + { "panel", "_12" }, + { "panel", "_14" }, + { "panel", "_15" }, + { "slab", "" }, + { "slab", "_quarter" }, + { "slab", "_three_quarter" }, + { "slab", "_1" }, + { "slab", "_2" }, + { "slab", "_14" }, + { "slab", "_15" }, + { "slab", "_two_sides" }, + { "slab", "_three_sides" }, + { "slab", "_three_sides_u" }, + { "slope", "" }, + { "slope", "_half" }, + { "slope", "_half_raised" }, + { "slope", "_inner" }, + { "slope", "_inner_half" }, + { "slope", "_inner_half_raised" }, + { "slope", "_inner_cut" }, + { "slope", "_inner_cut_half" }, + { "slope", "_inner_cut_half_raised" }, + { "slope", "_outer" }, + { "slope", "_outer_half" }, + { "slope", "_outer_half_raised" }, + { "slope", "_outer_cut" }, + { "slope", "_outer_cut_half" }, + { "slope", "_outer_cut_half_raised" }, + { "slope", "_cut" }, + { "stair", "" }, + { "stair", "_half" }, + { "stair", "_right_half" }, + { "stair", "_inner" }, + { "stair", "_outer" }, + { "stair", "_alt" }, + { "stair", "_alt_1" }, + { "stair", "_alt_2" }, + { "stair", "_alt_4" }, +} +--]] + +-- luacheck: no unused +local function register_custom_subset(subset, modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_custom_subset(subset, modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = moreblocks.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_custom_subset_alias(subset, modname_old, subname_old, modname_new, subname_new) + local subset_copy = table.copy(subset) + for k, v in pairs(subset_copy) do + core.register_alias(modname_old .. ":" .. v[1] .. "_" .. subname_old .. v[2], modname_new .. ":" .. v[1] .. "_" .. subname_new .. v[2]) + end +end + +function stairsplus:register_custom_subset_alias_force(subset, modname_old, subname_old, modname_new, subname_new) + local subset_copy = table.copy(subset) + for k, v in pairs(subset_copy) do + core.register_alias_force(modname_old .. ":" .. v[1] .. "_" .. subname_old .. v[2], modname_new .. ":" .. v[1] .. "_" .. subname_new .. v[2]) + end +end + +function stairsplus:register_custom_subset(subset, modname, subname, recipeitem, fields) + local subset_copy = table.copy(subset) + for k, v in pairs(subset_copy) do + stairsplus.register_single(v[1], v[2], stairsplus.defs[v[1]][v[2]], modname, subname, recipeitem, fields) + end + + circular_saw.known_nodes[recipeitem] = {modname, subname} + circular_saw.microblocks[modname.. ":micro_" .. subname] = recipeitem +end diff --git a/mods/moreblocks/stairsplus/defs.lua b/mods/moreblocks/stairsplus/defs.lua new file mode 100644 index 0000000..934822a --- /dev/null +++ b/mods/moreblocks/stairsplus/defs.lua @@ -0,0 +1,487 @@ +--[[ +More Blocks: registrations + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + + +local box_slope = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5} + } +} + +local box_slope_half = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.5, -0.375, -0.25, 0.5, -0.25, 0.5}, + {-0.5, -0.25, 0, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.25, 0.5, 0, 0.5}, + } +} + +local box_slope_half_raised = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, 0.125, -0.25, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0, 0.5, 0.375, 0.5}, + {-0.5, 0.375, 0.25, 0.5, 0.5, 0.5}, + } +} + +--============================================================== + +local box_slope_inner = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.5, -0.25, 0.5, 0, 0.5}, + {-0.5, -0.5, -0.5, 0.25, 0, 0.5}, + {-0.5, 0, -0.5, 0, 0.25, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}, + {-0.5, 0.25, -0.5, -0.25, 0.5, 0.5}, + } +} + +local box_slope_inner_half = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.5, -0.375, -0.25, 0.5, -0.25, 0.5}, + {-0.5, -0.375, -0.5, 0.25, -0.25, 0.5}, + {-0.5, -0.25, -0.5, 0, -0.125, 0.5}, + {-0.5, -0.25, 0, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.25, 0.5, 0, 0.5}, + {-0.5, -0.125, -0.5, -0.25, 0, 0.5}, + } +} + +local box_slope_inner_half_raised = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, 0.125, -0.25, 0.5, 0.25, 0.5}, + {-0.5, 0.125, -0.5, 0.25, 0.25, 0.5}, + {-0.5, 0.25, -0.5, 0, 0.375, 0.5}, + {-0.5, 0.25, 0, 0.5, 0.375, 0.5}, + {-0.5, 0.375, 0.25, 0.5, 0.5, 0.5}, + {-0.5, 0.375, -0.5, -0.25, 0.5, 0.5}, + } +} + +--============================================================== + +local box_slope_outer = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.25, 0, 0.5}, + {-0.5, 0, 0, 0, 0.25, 0.5}, + {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5} + } +} + +local box_slope_outer_half = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.5, -0.375, -0.25, 0.25, -0.25, 0.5}, + {-0.5, -0.25, 0, 0, -0.125, 0.5}, + {-0.5, -0.125, 0.25, -0.25, 0, 0.5} + } +} + +local box_slope_outer_half_raised = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, 0.125, -0.25, 0.25, 0.25, 0.5}, + {-0.5, 0.25, 0, 0, 0.375, 0.5}, + {-0.5, 0.375, 0.25, -0.25, 0.5, 0.5} + } +} + +stairsplus.defs = { + ["micro"] = { + [""] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0, 0.5}, + }, + }, + ["_1"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, -0.4375, 0.5}, + }, + }, + ["_2"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, -0.375, 0.5}, + }, + }, + ["_4"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, -0.25, 0.5}, + }, + }, + ["_12"] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0.25, 0.5}, + }, + }, + ["_14"] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0.375, 0.5}, + }, + }, + ["_15"] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0.4375, 0.5}, + }, + } + }, + ["panel"] = { + [""] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0, 0.5}, + }, + }, + ["_1"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, -0.4375, 0.5}, + }, + }, + ["_2"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, -0.375, 0.5}, + }, + }, + ["_4"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, -0.25, 0.5}, + }, + }, + ["_12"] = { + _circular_saw_cost = 3, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0.25, 0.5}, + }, + }, + ["_14"] = { + _circular_saw_cost = 4, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0.375, 0.5}, + }, + }, + ["_15"] = { + _circular_saw_cost = 4, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0.4375, 0.5}, + }, + } + }, + ["slab"] = { + [""] = { + _circular_saw_cost = 4, + size = 8 + }, + ["_quarter"] = { + _circular_saw_cost = 2, + size = 4 + }, + ["_three_quarter"] = { + _circular_saw_cost = 6, + size = 12 + }, + ["_1"] = { + _circular_saw_cost = 1, + size = 1 + }, + ["_2"] = { + _circular_saw_cost = 1, + size = 2 + }, + ["_14"] = { + _circular_saw_cost = 7, + size = 14 + }, + ["_15"] = { + _circular_saw_cost = 8, + size = 15; + }, + ["_two_sides"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -7/16, 7/16 }, + { -0.5, -0.5, 7/16, 0.5, 0.5, 0.5 } + } + }; + }, + ["_three_sides"] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = { + { -7/16, -0.5, -0.5, 0.5, -7/16, 7/16 }, + { -7/16, -0.5, 7/16, 0.5, 0.5, 0.5 }, + { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 } + } + } + }, + ["_three_sides_u"] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, -7/16 }, + { -0.5, -0.5, -7/16, 0.5, -7/16, 7/16 }, + { -0.5, -0.5, 7/16, 0.5, 0.5, 0.5 } + } + } + } + }, + ["slope"] = { + [""] = { + _circular_saw_cost = 4, + mesh = "moreblocks_slope.obj", + collision_box = box_slope, + selection_box = box_slope, + + }, + ["_half"] = { + _circular_saw_cost = 2, + mesh = "moreblocks_slope_half.obj", + collision_box = box_slope_half, + selection_box = box_slope_half, + }, + ["_half_raised"] = { + _circular_saw_cost = 6, + mesh = "moreblocks_slope_half_raised.obj", + collision_box = box_slope_half_raised, + selection_box = box_slope_half_raised, + }, + + --============================================================== + + ["_inner"] = { + _circular_saw_cost = 7, + mesh = "moreblocks_slope_inner.obj", + collision_box = box_slope_inner, + selection_box = box_slope_inner, + }, + ["_inner_half"] = { + _circular_saw_cost = 3, + mesh = "moreblocks_slope_inner_half.obj", + collision_box = box_slope_inner_half, + selection_box = box_slope_inner_half, + }, + ["_inner_half_raised"] = { + _circular_saw_cost = 7, + mesh = "moreblocks_slope_inner_half_raised.obj", + collision_box = box_slope_inner_half_raised, + selection_box = box_slope_inner_half_raised, + }, + + --============================================================== + + ["_inner_cut"] = { + _circular_saw_cost = 7, + mesh = "moreblocks_slope_inner_cut.obj", + collision_box = box_slope_inner, + selection_box = box_slope_inner, + }, + ["_inner_cut_half"] = { + _circular_saw_cost = 4, + mesh = "moreblocks_slope_inner_cut_half.obj", + collision_box = box_slope_inner_half, + selection_box = box_slope_inner_half, + }, + ["_inner_cut_half_raised"] = { + _circular_saw_cost = 8, + mesh = "moreblocks_slope_inner_cut_half_raised.obj", + collision_box = box_slope_inner_half_raised, + selection_box = box_slope_inner_half_raised, + }, + + --============================================================== + + ["_outer"] = { + _circular_saw_cost = 3, + mesh = "moreblocks_slope_outer.obj", + collision_box = box_slope_outer, + selection_box = box_slope_outer, + }, + ["_outer_half"] = { + _circular_saw_cost = 2, + mesh = "moreblocks_slope_outer_half.obj", + collision_box = box_slope_outer_half, + selection_box = box_slope_outer_half, + }, + ["_outer_half_raised"] = { + _circular_saw_cost = 6, + mesh = "moreblocks_slope_outer_half_raised.obj", + collision_box = box_slope_outer_half_raised, + selection_box = box_slope_outer_half_raised, + }, + + --============================================================== + + ["_outer_cut"] = { + _circular_saw_cost = 2, + mesh = "moreblocks_slope_outer_cut.obj", + collision_box = box_slope_outer, + selection_box = box_slope_outer, + }, + ["_outer_cut_half"] = { + _circular_saw_cost = 1, + mesh = "moreblocks_slope_outer_cut_half.obj", + collision_box = box_slope_outer_half, + selection_box = box_slope_outer_half, + }, + ["_outer_cut_half_raised"] = { + _circular_saw_cost = 3, + mesh = "moreblocks_slope_outer_cut_half_raised.obj", + collision_box = box_slope_outer_half_raised, + selection_box = box_slope_outer_half_raised, + }, + ["_cut"] = { + _circular_saw_cost = 4, + mesh = "moreblocks_slope_cut.obj", + collision_box = box_slope_outer, + selection_box = box_slope_outer, + }, + }, + ["stair"] = { + [""] = { + _circular_saw_cost = 6, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_half"] = { + _circular_saw_cost = 3, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0, 0, 0.5}, + {-0.5, 0, 0, 0, 0.5, 0.5}, + }, + }, + }, + -- TODO FIXME not included in circular_saw.names + ["_right_half"] = { + node_box = { + type = "fixed", + fixed = { + {0, -0.5, -0.5, 0.5, 0, 0.5}, + {0, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_inner"] = { + _circular_saw_cost = 7, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, 0, -0.5, 0, 0.5, 0}, + }, + }, + }, + ["_outer"] = { + _circular_saw_cost = 5, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0, 0.5, 0.5}, + }, + }, + }, + ["_alt"] = { + _circular_saw_cost = 4, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_alt_1"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0, 0}, + {-0.5, 0.4375, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_alt_2"] = { + _circular_saw_cost = 1, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.125, -0.5, 0.5, 0, 0}, + {-0.5, 0.375, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_alt_4"] = { + _circular_saw_cost = 2, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.25, -0.5, 0.5, 0, 0}, + {-0.5, 0.25, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + }, +} + +for type,a in pairs(stairsplus.defs) do + for name,b in pairs(stairsplus.defs[type]) do + table.insert(stairsplus.shapes_list, { type .. "_", name }) + end +end diff --git a/mods/moreblocks/stairsplus/init.lua b/mods/moreblocks/stairsplus/init.lua new file mode 100644 index 0000000..39fb906 --- /dev/null +++ b/mods/moreblocks/stairsplus/init.lua @@ -0,0 +1,82 @@ +--[[ +More Blocks: Stairs+ + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Nodes will be called :{stair,slab,panel,micro,slope}_ + +local modpath = core.get_modpath("moreblocks").. "/stairsplus" + +stairsplus = {} +stairsplus.expect_infinite_stacks = false + +stairsplus.shapes_list = {} + +if + not core.get_modpath("unified_inventory") + and core.settings:get_bool("creative_mode") +then + stairsplus.expect_infinite_stacks = true +end + +function stairsplus:prepare_groups(groups) + local result = {} + if groups then + for k, v in pairs(groups) do + if k ~= "wood" and k ~= "stone" and k ~= "wool" and k ~= "tree" then + result[k] = v + end + end + end + if not moreblocks.config.stairsplus_in_creative_inventory then + result.not_in_creative_inventory = 1 + end + return result +end + +function stairsplus:register_all(modname, subname, recipeitem, fields) + self:register_stair(modname, subname, recipeitem, fields) + self:register_slab(modname, subname, recipeitem, fields) + self:register_slope(modname, subname, recipeitem, fields) + self:register_panel(modname, subname, recipeitem, fields) + self:register_micro(modname, subname, recipeitem, fields) +end + +function stairsplus:register_alias_all(modname_old, subname_old, modname_new, subname_new) + self:register_stair_alias(modname_old, subname_old, modname_new, subname_new) + self:register_slab_alias(modname_old, subname_old, modname_new, subname_new) + self:register_slope_alias(modname_old, subname_old, modname_new, subname_new) + self:register_panel_alias(modname_old, subname_old, modname_new, subname_new) + self:register_micro_alias(modname_old, subname_old, modname_new, subname_new) +end +function stairsplus:register_alias_force_all(modname_old, subname_old, modname_new, subname_new) + self:register_stair_alias_force(modname_old, subname_old, modname_new, subname_new) + self:register_slab_alias_force(modname_old, subname_old, modname_new, subname_new) + self:register_slope_alias_force(modname_old, subname_old, modname_new, subname_new) + self:register_panel_alias_force(modname_old, subname_old, modname_new, subname_new) + self:register_micro_alias_force(modname_old, subname_old, modname_new, subname_new) +end + +-- luacheck: no unused +local function register_stair_slab_panel_micro(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_all(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light + }) +end + +dofile(modpath .. "/defs.lua") +dofile(modpath .. "/recipes.lua") +dofile(modpath .. "/common.lua") +dofile(modpath .. "/stairs.lua") +dofile(modpath .. "/slabs.lua") +dofile(modpath .. "/slopes.lua") +dofile(modpath .. "/panels.lua") +dofile(modpath .. "/microblocks.lua") +dofile(modpath .. "/custom.lua") +dofile(modpath .. "/registrations.lua") diff --git a/mods/moreblocks/stairsplus/microblocks.lua b/mods/moreblocks/stairsplus/microblocks.lua new file mode 100644 index 0000000..eb9d604 --- /dev/null +++ b/mods/moreblocks/stairsplus/microblocks.lua @@ -0,0 +1,44 @@ +--[[ +More Blocks: microblock definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Node will be called :micro_ + +-- luacheck: no unused +local function register_micro(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_micro(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = moreblocks.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_micro_alias(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["micro"]) + for alternate, def in pairs(defs) do + core.register_alias(modname_old .. ":micro_" .. subname_old .. alternate, modname_new .. ":micro_" .. subname_new .. alternate) + end +end + +function stairsplus:register_micro_alias_force(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["micro"]) + for alternate, def in pairs(defs) do + core.register_alias_force(modname_old .. ":micro_" .. subname_old .. alternate, modname_new .. ":micro_" .. subname_new .. alternate) + end +end + +function stairsplus:register_micro(modname, subname, recipeitem, fields) + local defs = table.copy(stairsplus.defs["micro"]) + for alternate, def in pairs(defs) do + stairsplus.register_single("micro", alternate, def, modname, subname, recipeitem, fields) + end + + circular_saw.known_nodes[recipeitem] = {modname, subname} + circular_saw.microblocks[modname.. ":micro_" .. subname] = recipeitem +end diff --git a/mods/moreblocks/stairsplus/panels.lua b/mods/moreblocks/stairsplus/panels.lua new file mode 100644 index 0000000..f486ab1 --- /dev/null +++ b/mods/moreblocks/stairsplus/panels.lua @@ -0,0 +1,43 @@ +--[[ +More Blocks: panel definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Node will be called :panel_ + +-- luacheck: no unused +local function register_panel(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_panel(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = moreblocks.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_panel_alias(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["panel"]) + for alternate, def in pairs(defs) do + core.register_alias(modname_old .. ":panel_" .. subname_old .. alternate, modname_new .. ":panel_" .. subname_new .. alternate) + end +end + +function stairsplus:register_panel_alias_force(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["panel"]) + for alternate, def in pairs(defs) do + core.register_alias_force(modname_old .. ":panel_" .. subname_old .. alternate, modname_new .. ":panel_" .. subname_new .. alternate) + end +end + +function stairsplus:register_panel(modname, subname, recipeitem, fields) + local defs = table.copy(stairsplus.defs["panel"]) + for alternate, def in pairs(defs) do + stairsplus.register_single("panel", alternate, def, modname, subname, recipeitem, fields) + end + + circular_saw.known_nodes[recipeitem] = {modname, subname} +end diff --git a/mods/moreblocks/stairsplus/recipes.lua b/mods/moreblocks/stairsplus/recipes.lua new file mode 100644 index 0000000..db284e3 --- /dev/null +++ b/mods/moreblocks/stairsplus/recipes.lua @@ -0,0 +1,443 @@ +--[[ +More Blocks: Stairs+ + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + + +stairsplus.register_recipes = function(category, alternate, modname, subname, recipeitem) + if category == "micro" and alternate == "" then + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 7", + recipe = {modname .. ":stair_" .. subname .. "_inner"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 6", + recipe = {modname .. ":stair_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 5", + recipe = {modname .. ":stair_" .. subname .. "_outer"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 4", + recipe = {modname .. ":slab_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 4", + recipe = {modname .. ":stair_" .. subname .. "_alt"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 3", + recipe = {modname .. ":stair_" .. subname .. "_right_half"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 2", + recipe = {modname .. ":panel_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + core.register_alias(modname .. ":micro_" .. subname .. "_bottom", modname .. ":micro_" .. subname) + elseif category == "panel" and alternate == "" then + core.register_craft({ + output = modname .. ":panel_" .. subname .. " 12", + recipe = { + {recipeitem, ""}, + {recipeitem, recipeitem}, + }, + }) + + core.register_craft({ + output = modname .. ":panel_" .. subname .. " 12", + recipe = { + {"", recipeitem}, + {recipeitem, recipeitem}, + }, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":panel_" .. subname, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + }) + + core.register_alias(modname.. ":panel_" ..subname.. "_bottom", modname.. ":panel_" ..subname) + elseif category == "slab" then + if alternate == "" then + core.register_craft({ + output = modname .. ":slab_" .. subname .. " 6", + recipe = {{recipeitem, recipeitem, recipeitem}}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + -- uncomment this rule when conflict is no longer likely to happen + -- https://github.com/luanti-org/luanti/issues/2881 + -- core.register_craft({ + -- type = "shapeless", + -- output = modname .. ":slab_" .. subname, + -- recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + -- }) + + -- then remove these two + core.register_craft({ + output = modname .. ":slab_" .. subname, + recipe = {{modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}}, + }) + + core.register_craft({ + output = modname .. ":slab_" .. subname, + recipe = { + {modname .. ":panel_" .. subname}, + {modname .. ":panel_" .. subname}, + }, + }) + ------------------------------ + + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname, modname .. ":slab_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. " 3", + recipe = {modname .. ":stair_" .. subname, modname .. ":stair_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slope_" .. subname .. "_outer_half", modname .. ":slope_" .. subname .. "_inner_half"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slope_" .. subname .. "_outer_cut_half", modname .. ":slope_" .. subname .. "_inner_cut_half"}, + }) + elseif alternate == "_quarter" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_three_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_quarter", + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_quarter", + recipe = {modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1"}, + }) + elseif alternate == "_three_quarter" then + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_three_quarter", + recipe = {modname .. ":slab_" .. subname, modname .. ":slab_" .. subname .. "_quarter"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_three_quarter", + recipe = {modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_three_quarter", + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + elseif alternate == "_2" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_14", modname .. ":slab_" .. subname .. "_2"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_2", + recipe = {modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1"}, + }) + elseif alternate == "_14" then + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_14", + recipe = {modname .. ":slab_" .. subname .. "_three_quarter", modname .. ":slab_" .. subname .. "_2"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_14", + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + elseif alternate == "_15" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_15", modname .. ":slab_" .. subname .. "_1"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_15", + recipe = {modname .. ":slab_" .. subname .. "_14", modname .. ":slab_" .. subname .. "_1"}, + }) + end + elseif category == "slope" then + if alternate == "" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname, modname .. ":slope_" .. subname}, + }) + elseif alternate == "_half" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half_raised"}, + }) + + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half", + modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half"}, + }) + elseif alternate == "_outer" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer", modname .. ":slope_" .. subname .. "_inner"}, + }) + elseif alternate == "_outer_half" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_half", modname .. ":slope_" .. subname .. "_inner_half_raised"}, + }) + elseif alternate == "_inner_half" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_half_raised", modname .. ":slope_" .. subname .. "_inner_half"}, + }) + elseif alternate == "_outer_cut" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_cut", modname .. ":slope_" .. subname .. "_inner_cut"}, + }) + elseif alternate == "_outer_cut_half" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_cut_half", modname .. ":slope_" .. subname .. "_inner_cut_half_raised"}, + }) + elseif alternate == "_cut" then + core.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_cut", modname .. ":slope_" .. subname .. "_cut"}, + }) + elseif alternate == "_half_raised" then + core.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_half_raised", + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half", + modname .. ":slope_" .. subname .. "_half"}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_half"}, + }) + elseif alternate == "_inner_half_raised" then + core.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_inner_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_inner_half"}, + }) + elseif alternate == "_outer_half_raised" then + core.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_outer_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_outer_half"}, + }) + elseif alternate == "_inner_cut_half_raised" then + core.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_inner_cut_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_inner_cut_half"}, + }) + end + elseif category == "stair" then + if alternate == "" then + core.register_craft({ + output = modname .. ":stair_" .. subname .. " 8", + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + core.register_craft({ + output = modname .. ":stair_" .. subname .. " 8", + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":panel_" .. subname, modname .. ":slab_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + }) + elseif alternate == "_inner" then + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_inner", + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + elseif alternate == "_outer" then + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_outer", + recipe = {modname .. ":micro_" .. subname, modname .. ":slab_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_outer", + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + elseif alternate == "_half" then + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_half", + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_half", + recipe = {modname .. ":panel_" .. subname, modname .. ":micro_" .. subname}, + }) + elseif alternate == "_right_half" then + core.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_right_half", + recipe = {modname .. ":stair_" .. subname .. "_half"}, + }) + elseif alternate == "_alt" then + core.register_craft({ -- See mirrored variation of the recipe below. + output = modname .. ":stair_" .. subname .. "_alt", + recipe = { + {modname .. ":panel_" .. subname, ""}, + {"" , modname .. ":panel_" .. subname}, + }, + }) + + core.register_craft({ -- Mirrored variation of the recipe above. + output = modname .. ":stair_" .. subname .. "_alt", + recipe = { + {"" , modname .. ":panel_" .. subname}, + {modname .. ":panel_" .. subname, ""}, + }, + }) + end + end +end diff --git a/mods/moreblocks/stairsplus/registrations.lua b/mods/moreblocks/stairsplus/registrations.lua new file mode 100644 index 0000000..9b4fc01 --- /dev/null +++ b/mods/moreblocks/stairsplus/registrations.lua @@ -0,0 +1,163 @@ +--[[ +More Blocks: registrations + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] +local S = moreblocks.S +-- default registrations +if core.get_modpath("default") then + local default_nodes = { -- Default stairs/slabs/panels/microblocks: + "stone", + "stone_block", + "cobble", + "mossycobble", + "brick", + "sandstone", + "steelblock", + "goldblock", + "copperblock", + "bronzeblock", + "diamondblock", + "tinblock", + "desert_stone", + "desert_stone_block", + "desert_cobble", + "meselamp", + "glass", + "tree", + "wood", + "jungletree", + "junglewood", + "pine_tree", + "pine_wood", + "acacia_tree", + "acacia_wood", + "aspen_tree", + "aspen_wood", + "obsidian", + "obsidian_block", + "obsidianbrick", + "obsidian_glass", + "stonebrick", + "desert_stonebrick", + "sandstonebrick", + "silver_sandstone", + "silver_sandstone_brick", + "silver_sandstone_block", + "desert_sandstone", + "desert_sandstone_brick", + "desert_sandstone_block", + "sandstone_block", + "coral_skeleton", + "ice", + } + + for _, name in pairs(default_nodes) do + local mod = "default" + local nodename = mod .. ":" .. name + local ndef = table.copy(core.registered_nodes[nodename]) + ndef.sunlight_propagates = true + + -- Stone and desert_stone drop cobble and desert_cobble respectively. + if type(ndef.drop) == "string" then + ndef.drop = ndef.drop:gsub(".+:", "") + end + + -- Use the primary tile for all sides of cut glasslike nodes and disregard paramtype2. + if #ndef.tiles > 1 and ndef.drawtype and ndef.drawtype:find("glass") then + ndef.tiles = {ndef.tiles[1]} + ndef.paramtype2 = nil + end + + mod = "moreblocks" + stairsplus:register_all(mod, name, nodename, ndef) + core.register_alias_force("stairs:stair_" .. name, mod .. ":stair_" .. name) + core.register_alias_force("stairs:stair_outer_" .. name, mod .. ":stair_" .. name .. "_outer") + core.register_alias_force("stairs:stair_inner_" .. name, mod .. ":stair_" .. name .. "_inner") + core.register_alias_force("stairs:slab_" .. name, mod .. ":slab_" .. name) + end +end + +-- farming registrations +if core.get_modpath("farming") then + local farming_nodes = {"straw"} + for _, name in pairs(farming_nodes) do + local mod = "farming" + local nodename = mod .. ":" .. name + local ndef = table.copy(core.registered_nodes[nodename]) + ndef.sunlight_propagates = true + + mod = "moreblocks" + stairsplus:register_all(mod, name, nodename, ndef) + core.register_alias_force("stairs:stair_" .. name, mod .. ":stair_" .. name) + core.register_alias_force("stairs:stair_outer_" .. name, mod .. ":stair_" .. name .. "_outer") + core.register_alias_force("stairs:stair_inner_" .. name, mod .. ":stair_" .. name .. "_inner") + core.register_alias_force("stairs:slab_" .. name, mod .. ":slab_" .. name) + end +end + +-- wool registrations +if core.get_modpath("wool") then + local dyes = {"white", "grey", "black", "red", "yellow", "green", "cyan", + "blue", "magenta", "orange", "violet", "brown", "pink", + "dark_grey", "dark_green"} + for _, name in pairs(dyes) do + local mod = "wool" + local nodename = mod .. ":" .. name + local ndef = table.copy(core.registered_nodes[nodename]) + ndef.sunlight_propagates = true + + stairsplus:register_all(mod, name, nodename, ndef) + end +end + +-- basic_materials, keeping the original other-mod-oriented names +-- for backwards compatibility + +if core.get_modpath("basic_materials") then + stairsplus:register_all("technic","concrete","basic_materials:concrete_block",{ + description = S("Concrete"), + tiles = {"basic_materials_concrete_block.png",}, + groups = {cracky=1, level=2, concrete=1}, + sounds = moreblocks.node_sound_stone_defaults(), + }) + + core.register_alias("prefab:concrete_stair","technic:stair_concrete") + core.register_alias("prefab:concrete_slab","technic:slab_concrete") + + stairsplus:register_all("gloopblocks", "cement", "basic_materials:cement_block", { + description = S("Cement"), + tiles = {"basic_materials_cement_block.png"}, + groups = {cracky=2, not_in_creative_inventory=1}, + sounds = moreblocks.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("technic", "brass_block", "basic_materials:brass_block", { + description= S("Brass Block"), + groups={cracky=1, not_in_creative_inventory=1}, + tiles={"basic_materials_brass_block.png"}, + }) + +end + +-- Alias cuts of split_stone_tile_alt which was renamed checker_stone_tile. +stairsplus:register_alias_all("moreblocks", "split_stone_tile_alt", "moreblocks", "checker_stone_tile") + +-- The following LBM is necessary because the name stair_split_stone_tile_alt +-- conflicts with another node and so the alias for that specific node gets +-- ignored. +core.register_lbm({ + name = "moreblocks:fix_split_stone_tile_alt_name_collision", + nodenames = {"moreblocks:stair_split_stone_tile_alt"}, + action = function(pos, node) + core.set_node(pos, { + name = "moreblocks:stair_checker_stone_tile", + param2 = core.get_node(pos).param2 + + }) + core.log('action', "LBM replaced " .. node.name .. + " at " .. core.pos_to_string(pos)) + end, +}) diff --git a/mods/moreblocks/stairsplus/slabs.lua b/mods/moreblocks/stairsplus/slabs.lua new file mode 100644 index 0000000..45c197e --- /dev/null +++ b/mods/moreblocks/stairsplus/slabs.lua @@ -0,0 +1,43 @@ +--[[ +More Blocks: slab definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Node will be called :slab_ + +-- luacheck: no unused +local function register_slab(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_slab(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = moreblocks.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_slab_alias(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["slab"]) + for alternate, def in pairs(defs) do + core.register_alias(modname_old .. ":slab_" .. subname_old .. alternate, modname_new .. ":slab_" .. subname_new .. alternate) + end +end + +function stairsplus:register_slab_alias_force(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["slab"]) + for alternate, def in pairs(defs) do + core.register_alias_force(modname_old .. ":slab_" .. subname_old .. alternate, modname_new .. ":slab_" .. subname_new .. alternate) + end +end + +function stairsplus:register_slab(modname, subname, recipeitem, fields) + local defs = table.copy(stairsplus.defs["slab"]) + for alternate, shape in pairs(defs) do + stairsplus.register_single("slab", alternate, shape, modname, subname, recipeitem, fields) + end + + circular_saw.known_nodes[recipeitem] = {modname, subname} +end diff --git a/mods/moreblocks/stairsplus/slopes.lua b/mods/moreblocks/stairsplus/slopes.lua new file mode 100644 index 0000000..4b431e6 --- /dev/null +++ b/mods/moreblocks/stairsplus/slopes.lua @@ -0,0 +1,43 @@ +--[[ +More Blocks: slope definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Node will be called :slope_ + +-- luacheck: no unused +local function register_slope(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_slope(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = moreblocks.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_slope_alias(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["slope"]) + for alternate, def in pairs(defs) do + core.register_alias(modname_old .. ":slope_" .. subname_old .. alternate, modname_new .. ":slope_" .. subname_new .. alternate) + end +end + +function stairsplus:register_slope_alias_force(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["slope"]) + for alternate, def in pairs(defs) do + core.register_alias_force(modname_old .. ":slope_" .. subname_old .. alternate, modname_new .. ":slope_" .. subname_new .. alternate) + end +end + +function stairsplus:register_slope(modname, subname, recipeitem, fields) + local defs = table.copy(stairsplus.defs["slope"]) + for alternate, def in pairs(defs) do + stairsplus.register_single("slope", alternate, def, modname, subname, recipeitem, fields) + end + + circular_saw.known_nodes[recipeitem] = {modname, subname} +end diff --git a/mods/moreblocks/stairsplus/stairs.lua b/mods/moreblocks/stairsplus/stairs.lua new file mode 100644 index 0000000..b679c13 --- /dev/null +++ b/mods/moreblocks/stairsplus/stairs.lua @@ -0,0 +1,43 @@ +--[[ +More Blocks: stair definitions + +Copyright © 2011-2020 Hugo Locurcio and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Node will be called :stair_ + +-- luacheck: no unused +local function register_stair(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_stair(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = moreblocks.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_stair_alias(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["stair"]) + for alternate, def in pairs(defs) do + core.register_alias(modname_old .. ":stair_" .. subname_old .. alternate, modname_new .. ":stair_" .. subname_new .. alternate) + end +end + +function stairsplus:register_stair_alias_force(modname_old, subname_old, modname_new, subname_new) + local defs = table.copy(stairsplus.defs["stair"]) + for alternate, def in pairs(defs) do + core.register_alias_force(modname_old .. ":stair_" .. subname_old .. alternate, modname_new .. ":stair_" .. subname_new .. alternate) + end +end + +function stairsplus:register_stair(modname, subname, recipeitem, fields) + local defs = table.copy(stairsplus.defs["stair"]) + for alternate, def in pairs(defs) do + stairsplus.register_single("stair", alternate, def, modname, subname, recipeitem, fields) + end + + circular_saw.known_nodes[recipeitem] = {modname, subname} +end diff --git a/mods/moreblocks/textures/moreblocks_cactus_brick.png b/mods/moreblocks/textures/moreblocks_cactus_brick.png new file mode 100644 index 0000000..43d2479 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_cactus_brick.png differ diff --git a/mods/moreblocks/textures/moreblocks_cactus_checker.png b/mods/moreblocks/textures/moreblocks_cactus_checker.png new file mode 100644 index 0000000..79f2e32 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_cactus_checker.png differ diff --git a/mods/moreblocks/textures/moreblocks_checker_stone_tile.png b/mods/moreblocks/textures/moreblocks_checker_stone_tile.png new file mode 100644 index 0000000..7261586 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_checker_stone_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_circle_stone_bricks.png b/mods/moreblocks/textures/moreblocks_circle_stone_bricks.png new file mode 100644 index 0000000..d14057a Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circle_stone_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_circular_saw_bottom.png b/mods/moreblocks/textures/moreblocks_circular_saw_bottom.png new file mode 100644 index 0000000..1a67636 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circular_saw_bottom.png differ diff --git a/mods/moreblocks/textures/moreblocks_circular_saw_side.png b/mods/moreblocks/textures/moreblocks_circular_saw_side.png new file mode 100644 index 0000000..567082b Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circular_saw_side.png differ diff --git a/mods/moreblocks/textures/moreblocks_circular_saw_top.png b/mods/moreblocks/textures/moreblocks_circular_saw_top.png new file mode 100644 index 0000000..1b491da Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circular_saw_top.png differ diff --git a/mods/moreblocks/textures/moreblocks_clean_glass.png b/mods/moreblocks/textures/moreblocks_clean_glass.png new file mode 100644 index 0000000..b766956 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_clean_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_clean_glass_detail.png b/mods/moreblocks/textures/moreblocks_clean_glass_detail.png new file mode 100644 index 0000000..71414e8 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_clean_glass_detail.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_checker.png b/mods/moreblocks/textures/moreblocks_coal_checker.png new file mode 100644 index 0000000..181cb97 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_checker.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_coal_glass_stairsplus.png new file mode 100644 index 0000000..cc2e797 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_stone.png b/mods/moreblocks/textures/moreblocks_coal_stone.png new file mode 100644 index 0000000..1e514ed Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_stone.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_stone_bricks.png b/mods/moreblocks/textures/moreblocks_coal_stone_bricks.png new file mode 100644 index 0000000..08e87a7 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_stone_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_cobble_compressed.png b/mods/moreblocks/textures/moreblocks_cobble_compressed.png new file mode 100644 index 0000000..94d02b5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_cobble_compressed.png differ diff --git a/mods/moreblocks/textures/moreblocks_copperpatina.png b/mods/moreblocks/textures/moreblocks_copperpatina.png new file mode 100644 index 0000000..d4e98b0 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_copperpatina.png differ diff --git a/mods/moreblocks/textures/moreblocks_desert_cobble_compressed.png b/mods/moreblocks/textures/moreblocks_desert_cobble_compressed.png new file mode 100644 index 0000000..307b9b8 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_desert_cobble_compressed.png differ diff --git a/mods/moreblocks/textures/moreblocks_dirt_compressed.png b/mods/moreblocks/textures/moreblocks_dirt_compressed.png new file mode 100644 index 0000000..bdc8220 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_dirt_compressed.png differ diff --git a/mods/moreblocks/textures/moreblocks_empty_shelf.png b/mods/moreblocks/textures/moreblocks_empty_shelf.png new file mode 100644 index 0000000..bf29124 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_empty_shelf.png differ diff --git a/mods/moreblocks/textures/moreblocks_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_glass_stairsplus.png new file mode 100644 index 0000000..8e4cb98 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_glow_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_glow_glass_stairsplus.png new file mode 100644 index 0000000..db2831e Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glow_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_grey_bricks.png b/mods/moreblocks/textures/moreblocks_grey_bricks.png new file mode 100644 index 0000000..9839ca2 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_grey_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_checker.png b/mods/moreblocks/textures/moreblocks_iron_checker.png new file mode 100644 index 0000000..117cac2 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_checker.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_iron_glass_stairsplus.png new file mode 100644 index 0000000..799fbc4 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_stone.png b/mods/moreblocks/textures/moreblocks_iron_stone.png new file mode 100644 index 0000000..5a6e457 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_stone.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_stone_bricks.png b/mods/moreblocks/textures/moreblocks_iron_stone_bricks.png new file mode 100644 index 0000000..bc2ef2e Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_stone_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_junglestick.png b/mods/moreblocks/textures/moreblocks_junglestick.png new file mode 100644 index 0000000..7bc6bc4 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_junglestick.png differ diff --git a/mods/moreblocks/textures/moreblocks_obsidian_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_obsidian_glass_stairsplus.png new file mode 100644 index 0000000..3eb22d0 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_obsidian_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_plankstone.png b/mods/moreblocks/textures/moreblocks_plankstone.png new file mode 100644 index 0000000..b1a65c5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_plankstone.png differ diff --git a/mods/moreblocks/textures/moreblocks_plankstone_2.png b/mods/moreblocks/textures/moreblocks_plankstone_2.png new file mode 100644 index 0000000..953c2f5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_plankstone_2.png differ diff --git a/mods/moreblocks/textures/moreblocks_rope.png b/mods/moreblocks/textures/moreblocks_rope.png new file mode 100644 index 0000000..f86c07d Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_rope.png differ diff --git a/mods/moreblocks/textures/moreblocks_split_stone_tile.png b/mods/moreblocks/textures/moreblocks_split_stone_tile.png new file mode 100644 index 0000000..7af4fdd Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_split_stone_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_split_stone_tile_top.png b/mods/moreblocks/textures/moreblocks_split_stone_tile_top.png new file mode 100644 index 0000000..f3184a8 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_split_stone_tile_top.png differ diff --git a/mods/moreblocks/textures/moreblocks_stone_tile.png b/mods/moreblocks/textures/moreblocks_stone_tile.png new file mode 100644 index 0000000..c2083ea Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_stone_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_super_glow_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_super_glow_glass_stairsplus.png new file mode 100644 index 0000000..c9a2da6 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_super_glow_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_sweeper.png b/mods/moreblocks/textures/moreblocks_sweeper.png new file mode 100644 index 0000000..770b988 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_sweeper.png differ diff --git a/mods/moreblocks/textures/moreblocks_tar.png b/mods/moreblocks/textures/moreblocks_tar.png new file mode 100644 index 0000000..846d068 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_tar.png differ diff --git a/mods/moreblocks/textures/moreblocks_trap_box.png b/mods/moreblocks/textures/moreblocks_trap_box.png new file mode 100644 index 0000000..6d2aa10 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_trap_box.png differ diff --git a/mods/moreblocks/textures/moreblocks_trap_box_glass.png b/mods/moreblocks/textures/moreblocks_trap_box_glass.png new file mode 100644 index 0000000..77234d0 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_trap_box_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_tree_stairsplus.png b/mods/moreblocks/textures/moreblocks_tree_stairsplus.png new file mode 100644 index 0000000..bed0969 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_tree_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile.png b/mods/moreblocks/textures/moreblocks_wood_tile.png new file mode 100644 index 0000000..7d9a43c Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_center.png b/mods/moreblocks/textures/moreblocks_wood_tile_center.png new file mode 100644 index 0000000..035b1cb Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile_center.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_full.png b/mods/moreblocks/textures/moreblocks_wood_tile_full.png new file mode 100644 index 0000000..edfd5d2 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile_full.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_offset.png b/mods/moreblocks/textures/moreblocks_wood_tile_offset.png new file mode 100644 index 0000000..4379598 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile_offset.png differ diff --git a/mods/morebricks/LICENSE b/mods/morebricks/LICENSE new file mode 100644 index 0000000..4ae31cc --- /dev/null +++ b/mods/morebricks/LICENSE @@ -0,0 +1,24 @@ +License +------- + +The MIT License (MIT) +Copyright (C) 2019 CalebJ + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/morebricks/README.md b/mods/morebricks/README.md new file mode 100644 index 0000000..c08c206 --- /dev/null +++ b/mods/morebricks/README.md @@ -0,0 +1,2 @@ +# Morebricks +Adds more bricks, of course! diff --git a/mods/morebricks/depends.txt b/mods/morebricks/depends.txt new file mode 100644 index 0000000..9cf58c3 --- /dev/null +++ b/mods/morebricks/depends.txt @@ -0,0 +1,2 @@ +default +moreblocks \ No newline at end of file diff --git a/mods/morebricks/init.lua b/mods/morebricks/init.lua new file mode 100644 index 0000000..82416c0 --- /dev/null +++ b/mods/morebricks/init.lua @@ -0,0 +1,579 @@ +morebricks = {} + +local S + +if minetest.get_translator ~= nil then + S = minetest.get_translator(minetest.get_current_modname()) +else + S = function(str) + return(str) + end +end + +minetest.register_node ("morebricks:green", { + description = S("Green Brick Block"), + tiles = {"morebricks_green.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:green 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:green"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:green"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:blue", { + description = S("Blue Brick Block"), + tiles = {"morebricks_blue.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:blue 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:blue"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:blue"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:pink", { + description = S("Pink Brick Block"), + tiles = {"morebricks_pink.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:pink 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:pink"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:pink"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:violet", { + description = S("Violet Brick Block"), + tiles = {"morebricks_violet.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:violet 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:violet"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:violet"}, + {"", "", ""}, + } +}) + + +minetest.register_node ("morebricks:white", { + description = S("White Brick Block"), + tiles = {"morebricks_white.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:white 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:white"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:white"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:grey", { + description = S("Grey Brick Block"), + tiles = {"morebricks_grey.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:grey 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:grey"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:grey"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:black", { + description = S("Black Brick Block"), + tiles = {"morebricks_black.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:black_ 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:black"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:black"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:darkgrey", { + description = S("Dark-Grey Brick Block"), + tiles = {"morebricks_darkgrey.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:darkgrey 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:dark_grey"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:dark_grey"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:magenta", { + description = S("Magenta Brick Block"), + tiles = {"morebricks_magenta.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:magenta 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:magenta"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:magenta"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:yellow", { + description = S("Yellow Brick Block"), + tiles = {"morebricks_yellow.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:yellow 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:yellow"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:yellow"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:brown", { + description = S("Brown Brick Block"), + tiles = {"morebricks_brown.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:brown 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:brown"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:brown"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:orange", { + description = S("Orange Brick Block"), + tiles = {"morebricks_orange.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:orange 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:orange"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:orange"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:cyan", { + description = S("Cyan Brick Block"), + tiles = {"morebricks_cyan.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:cyan 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:cyan"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:cyan"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:darkgreen", { + description = S("Dark-Green Brick Block"), + tiles = {"morebricks_darkgreen.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:darkgreen 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:dark_green"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:dark_green"}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:gold", { + description = S("Gold Brick Block"), + tiles = {"morebricks_gold.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:gold 2", + recipe = { + {"default:gold_ingot", "default:gold_ingot", ""}, + {"default:gold_ingot", "default:gold_ingot", ""}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:copper", { + description = S("Copper Brick Block"), + tiles = {"morebricks_copper.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:copper 2", + recipe = { + {"default:copper_ingot", "default:copper_ingot", ""}, + {"default:copper_ingot", "default:copper_ingot", ""}, + {"", "", ""}, + } +}) + +minetest.register_node ("morebricks:steel", { + description = S("Steel Brick Block"), + tiles = {"morebricks_steel.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:steel 2", + recipe = { + {"default:steel_ingot", "default:steel_ingot", ""}, + {"default:steel_ingot", "default:steel_ingot", ""}, + {"", "", ""}, + } +}) + + + + +minetest.register_node ("morebricks:copperaged", { + description = S("Aged Copper Brick Block"), + tiles = {"morebricks_copperaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:copperaged 2", + recipe = { + {"default:copper_ingot", "default:copper_ingot", ""}, + {"default:copper_ingot", "default:copper_ingot", ""}, + {"", "default:dirt", ""}, + } +}) + + + + +minetest.register_node ("morebricks:cyanaged", { + description = S("Aged Cyan Brick Block"), + tiles = {"morebricks_cyanaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:cyanaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:cyan"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:cyan"}, + {"", "default:dirt", ""}, + } +}) + +minetest.register_node ("morebricks:greenaged", { + description = S("Aged Green Brick Block"), + tiles = {"morebricks_greenaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:greenaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:green"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:green"}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:greyaged", { + description = S("Aged Grey Brick Block"), + tiles = {"morebricks_greyaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:greyaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:grey"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:grey"}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:magentaaged", { + description = S("Aged Magenta Brick Block"), + tiles = {"morebricks_magentaaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:magentaaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:magenta"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:magenta"}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:pinkaged", { + description = S("Aged Pink Brick Block"), + tiles = {"morebricks_pinkaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:pinkaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:pink"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:pink"}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:orangeaged", { + description = S("Aged Orange Brick Block"), + tiles = {"morebricks_orangeaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:orangeaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:orange"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:orange"}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:steelaged", { + description = S("Aged Steel Brick Block"), + tiles = {"morebricks_steelaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:steelaged 3", + recipe = { + {"default:steel_ingot", "default:steel_ingot", ""}, + {"default:steel_ingot", "default:steel_ingot", ""}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:whiteaged", { + description = S("Aged White Brick Block"), + tiles = {"morebricks_whiteaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:whiteaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:white"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:white"}, + {"", "default:dirt", ""}, + } +}) + + +minetest.register_node ("morebricks:yellowaged", { + description = S("Aged Yellow Brick Block"), + tiles = {"morebricks_yellowaged.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 2, level = 1}, + light_source = 0, +}) + +minetest.register_craft({ + output = "morebricks:yellowaged 3", + recipe = { + {"default:clay_brick", "default:clay_brick", "bakedclay:yellow"}, + {"default:clay_brick", "default:clay_brick", "bakedclay:yellow"}, + {"", "default:dirt", ""}, + } +}) + + + +local brick = { + {"white", "White"}, + {"grey", "Grey"}, + {"copperaged", "Aged Copper"}, {"cyanaged", "Aged Cyan"}, {"greenaged", "Aged Green"}, {"magentaaged", "Aged Magenta"}, {"orangeaged", "Aged Orange"}, {"pinkaged", "Aged Pink"}, {"steelaged", "Aged Steel"}, {"whiteaged", "Aged White"}, {"yellowaged", "Aged Yellow"}, {"black", "Black"}, + + {"yellow", "Yellow"}, + {"green", "Green"}, + {"cyan", "Cyan"}, + {"blue", "Blue"}, + {"magenta", "Magenta"}, + {"orange", "Orange"}, + {"violet", "Violet"}, + {"brown", "Brown"}, + {"pink", "Pink"}, + {"darkgrey", "Dark-Grey"}, + {"darkgreen", "Dark-Green"}, {"gold", "Gold"}, {"copper", "Copper" +}, {"steel", "Steel"} } + +local stairs_mod = minetest.get_modpath("stairs") +local stairsplus_mod = minetest.get_modpath("moreblocks") + and minetest.global_exists("stairsplus") + +for _, brick in pairs(brick) do + + -- node definition + + minetest.register_node("morebricks:" .. brick[1], { + description = brick[2] .. " Brick Block", + tiles = {"morebricks_" .. brick[1] ..".png"}, + groups = {cracky = 3, bakedclay = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + -- register stairsplus stairs if found + if stairsplus_mod then + + stairsplus:register_all("morebricks", "morebricks_" .. brick[1], "morebricks:" .. brick[1], { + +description = brick[2] .. " Brick Block", + tiles = {"morebricks_" .. brick[1] .. ".png"}, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), + }) + + stairsplus:register_alias_all("morebricks", brick[1], "morebricks", "morebricks_" .. brick[1]) + minetest.register_alias("stairs:slab_morebricks_".. brick[1], "morebricks:slab_brick_block_" .. brick[1]) + minetest.register_alias("stairs:stair_morebricks_".. brick[1], "morebricks:stair_brick_block_" .. brick[1]) + + -- register all stair types for stairs redo + elseif stairs_mod and stairs.mod then + + stairs.register_all("morebricks_" .. brick[1], "morebricks:" .. brick[1], + {cracky = 3}, + {"morebricks_" .. brick[1] .. ".png"}, + brick[2] .. " Brick Block", + default.node_sound_stone_defaults()) + + +stairs.register_stair_and_slab("morebricks_".. brick[1], "bakedclay:".. brick[1], + {cracky = 3}, + {"morebricks_" .. brick[1] .. ".png"}, + brick[2] .. " Brick Block Stair", + brick[2] .. " Brick Block Slab", + default.node_sound_stone_defaults()) + end end \ No newline at end of file diff --git a/mods/morebricks/textures/.gitkeep b/mods/morebricks/textures/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/mods/morebricks/textures/morebricks_black.png b/mods/morebricks/textures/morebricks_black.png new file mode 100644 index 0000000..32b0eb8 Binary files /dev/null and b/mods/morebricks/textures/morebricks_black.png differ diff --git a/mods/morebricks/textures/morebricks_blue.png b/mods/morebricks/textures/morebricks_blue.png new file mode 100644 index 0000000..06b82ab Binary files /dev/null and b/mods/morebricks/textures/morebricks_blue.png differ diff --git a/mods/morebricks/textures/morebricks_brown.png b/mods/morebricks/textures/morebricks_brown.png new file mode 100644 index 0000000..5da7414 Binary files /dev/null and b/mods/morebricks/textures/morebricks_brown.png differ diff --git a/mods/morebricks/textures/morebricks_copper.png b/mods/morebricks/textures/morebricks_copper.png new file mode 100644 index 0000000..4a2eda2 Binary files /dev/null and b/mods/morebricks/textures/morebricks_copper.png differ diff --git a/mods/morebricks/textures/morebricks_copperaged.png b/mods/morebricks/textures/morebricks_copperaged.png new file mode 100644 index 0000000..22dcdd0 Binary files /dev/null and b/mods/morebricks/textures/morebricks_copperaged.png differ diff --git a/mods/morebricks/textures/morebricks_cyan.png b/mods/morebricks/textures/morebricks_cyan.png new file mode 100644 index 0000000..e102af2 Binary files /dev/null and b/mods/morebricks/textures/morebricks_cyan.png differ diff --git a/mods/morebricks/textures/morebricks_cyanaged.png b/mods/morebricks/textures/morebricks_cyanaged.png new file mode 100644 index 0000000..6d34407 Binary files /dev/null and b/mods/morebricks/textures/morebricks_cyanaged.png differ diff --git a/mods/morebricks/textures/morebricks_darkgreen.png b/mods/morebricks/textures/morebricks_darkgreen.png new file mode 100644 index 0000000..e0802b6 Binary files /dev/null and b/mods/morebricks/textures/morebricks_darkgreen.png differ diff --git a/mods/morebricks/textures/morebricks_darkgrey.png b/mods/morebricks/textures/morebricks_darkgrey.png new file mode 100644 index 0000000..95477a4 Binary files /dev/null and b/mods/morebricks/textures/morebricks_darkgrey.png differ diff --git a/mods/morebricks/textures/morebricks_gold.png b/mods/morebricks/textures/morebricks_gold.png new file mode 100644 index 0000000..483f0ca Binary files /dev/null and b/mods/morebricks/textures/morebricks_gold.png differ diff --git a/mods/morebricks/textures/morebricks_green.png b/mods/morebricks/textures/morebricks_green.png new file mode 100644 index 0000000..6a7c0aa Binary files /dev/null and b/mods/morebricks/textures/morebricks_green.png differ diff --git a/mods/morebricks/textures/morebricks_greenaged.png b/mods/morebricks/textures/morebricks_greenaged.png new file mode 100644 index 0000000..5a19091 Binary files /dev/null and b/mods/morebricks/textures/morebricks_greenaged.png differ diff --git a/mods/morebricks/textures/morebricks_grey.png b/mods/morebricks/textures/morebricks_grey.png new file mode 100644 index 0000000..25b6176 Binary files /dev/null and b/mods/morebricks/textures/morebricks_grey.png differ diff --git a/mods/morebricks/textures/morebricks_greyaged.png b/mods/morebricks/textures/morebricks_greyaged.png new file mode 100644 index 0000000..eab6997 Binary files /dev/null and b/mods/morebricks/textures/morebricks_greyaged.png differ diff --git a/mods/morebricks/textures/morebricks_magenta.png b/mods/morebricks/textures/morebricks_magenta.png new file mode 100644 index 0000000..a9da2da Binary files /dev/null and b/mods/morebricks/textures/morebricks_magenta.png differ diff --git a/mods/morebricks/textures/morebricks_magentaaged.png b/mods/morebricks/textures/morebricks_magentaaged.png new file mode 100644 index 0000000..fe2b826 Binary files /dev/null and b/mods/morebricks/textures/morebricks_magentaaged.png differ diff --git a/mods/morebricks/textures/morebricks_orange.png b/mods/morebricks/textures/morebricks_orange.png new file mode 100644 index 0000000..8a770cc Binary files /dev/null and b/mods/morebricks/textures/morebricks_orange.png differ diff --git a/mods/morebricks/textures/morebricks_orangeaged.png b/mods/morebricks/textures/morebricks_orangeaged.png new file mode 100644 index 0000000..b557b0d Binary files /dev/null and b/mods/morebricks/textures/morebricks_orangeaged.png differ diff --git a/mods/morebricks/textures/morebricks_pink.png b/mods/morebricks/textures/morebricks_pink.png new file mode 100644 index 0000000..6738a01 Binary files /dev/null and b/mods/morebricks/textures/morebricks_pink.png differ diff --git a/mods/morebricks/textures/morebricks_pinkaged.png b/mods/morebricks/textures/morebricks_pinkaged.png new file mode 100644 index 0000000..5830d8b Binary files /dev/null and b/mods/morebricks/textures/morebricks_pinkaged.png differ diff --git a/mods/morebricks/textures/morebricks_steel.png b/mods/morebricks/textures/morebricks_steel.png new file mode 100644 index 0000000..f8fce22 Binary files /dev/null and b/mods/morebricks/textures/morebricks_steel.png differ diff --git a/mods/morebricks/textures/morebricks_steelaged.png b/mods/morebricks/textures/morebricks_steelaged.png new file mode 100644 index 0000000..17bb48b Binary files /dev/null and b/mods/morebricks/textures/morebricks_steelaged.png differ diff --git a/mods/morebricks/textures/morebricks_violet.png b/mods/morebricks/textures/morebricks_violet.png new file mode 100644 index 0000000..0813389 Binary files /dev/null and b/mods/morebricks/textures/morebricks_violet.png differ diff --git a/mods/morebricks/textures/morebricks_white.png b/mods/morebricks/textures/morebricks_white.png new file mode 100644 index 0000000..37fcdf4 Binary files /dev/null and b/mods/morebricks/textures/morebricks_white.png differ diff --git a/mods/morebricks/textures/morebricks_whiteaged.png b/mods/morebricks/textures/morebricks_whiteaged.png new file mode 100644 index 0000000..47068df Binary files /dev/null and b/mods/morebricks/textures/morebricks_whiteaged.png differ diff --git a/mods/morebricks/textures/morebricks_yellow.png b/mods/morebricks/textures/morebricks_yellow.png new file mode 100644 index 0000000..b68b427 Binary files /dev/null and b/mods/morebricks/textures/morebricks_yellow.png differ diff --git a/mods/morebricks/textures/morebricks_yellowaged.png b/mods/morebricks/textures/morebricks_yellowaged.png new file mode 100644 index 0000000..3ae2754 Binary files /dev/null and b/mods/morebricks/textures/morebricks_yellowaged.png differ diff --git a/mods/moretrees/.github/workflows/luacheck.yml b/mods/moretrees/.github/workflows/luacheck.yml new file mode 100644 index 0000000..1d5241c --- /dev/null +++ b/mods/moretrees/.github/workflows/luacheck.yml @@ -0,0 +1,18 @@ + +name: luacheck + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: apt + run: sudo apt-get install -y luarocks + - name: luacheck install + run: luarocks install --local luacheck + - name: luacheck run + run: $HOME/.luarocks/bin/luacheck ./ \ No newline at end of file diff --git a/mods/moretrees/.gitignore b/mods/moretrees/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/mods/moretrees/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/mods/moretrees/.luacheckrc b/mods/moretrees/.luacheckrc new file mode 100644 index 0000000..199e53f --- /dev/null +++ b/mods/moretrees/.luacheckrc @@ -0,0 +1,28 @@ +unused_args = false +allow_defined_top = true + +exclude_files = {".luacheckrc"} + + +globals = { + "minetest", + "vector", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + "dump", + "moretrees", + "ethereal", +} + +read_globals = { + string = {fields = {"split"}}, + table = {fields = {"copy", "getn"}}, + + "stairsplus", + "stairs", + "doors", + "xcompat", +} diff --git a/mods/moretrees/LICENSE b/mods/moretrees/LICENSE new file mode 100644 index 0000000..08cda45 --- /dev/null +++ b/mods/moretrees/LICENSE @@ -0,0 +1,620 @@ +Minetest mod moretrees +====================== + +All source code: + © 2013, Vanessa Ezekowitz +Date & cocos palm code (date_palm.lua, cocos_palm.lua) + © 2016, Rogier +All date & date palm textures, date-based food, cocos flower & green coconuts, +and all poplar textures: + © 2016, Rogier + - Three of the date palm textures are modifications of existing moretrees textures + - The green coconuts are a modification of the brown coconut + - The date cake batter is a modification of the acorn muffin batter +All other sapling textures (textures/*_sapling.png): + © 2013, Tim Huppertz +All other textures: + © 2013, Vanessa Ezekowitz + +############################################################################### + +License for all code: LGPL 3.0 +License for all media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/moretrees/README.md b/mods/moretrees/README.md new file mode 100644 index 0000000..0bab3c3 --- /dev/null +++ b/mods/moretrees/README.md @@ -0,0 +1,12 @@ +More trees! + +This mod adds a whole bunch of new types of trees to the game + +Much of the code here came from cisoun's conifers mod and bas080's +jungle trees mod, and big contributions by RealBadAngel. + +Brought together into one mod and made L-systems compatible by Vanessa +Ezekowitz. + +Dependencies: `xcompat` +see mod.conf for more diff --git a/mods/moretrees/biome_defs.lua b/mods/moretrees/biome_defs.lua new file mode 100644 index 0000000..654ba69 --- /dev/null +++ b/mods/moretrees/biome_defs.lua @@ -0,0 +1,173 @@ + +-- TODO +-- Use biomes in the decoration definition depending on their heat_point humidity_point +-- instead of spawning it with a rather low fill_ratio everywhere +local ratio_abundant = 0.001 +local ratio_common = 0.0005 +local ratio_normal = 0.0003 +local ratio_uncommon = 0.0002 +local ratio_rare = 0.0001 +local ratio_very_rare = 0.00003 + +local coniferous_place_on = { + xcompat.materials.dirt_with_grass, + "default:dirt_with_coniferous_litter" +} + +moretrees.beech_biome = { + place_on = xcompat.materials.dirt_with_grass, + fill_ratio = ratio_normal, +} + +moretrees.palm_biome = { + place_on = xcompat.materials.sand, + min_elevation = -1, + max_elevation = 1, + fill_ratio = ratio_abundant, +} + +moretrees.date_palm_biome = { + place_on = xcompat.materials.desert_sand, + min_elevation = -1, + max_elevation = 8, + fill_ratio = ratio_common, +} + +moretrees.date_palm_biome_2 = { + place_on = xcompat.materials.desert_sand, + min_elevation = 9, + max_elevation = 30, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 1, + fill_ratio = ratio_abundant, +} + +moretrees.apple_tree_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 1, + max_elevation = 10, + biomes = {"deciduous_forest"}, + fill_ratio = ratio_rare, +} + +moretrees.oak_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 0, + max_elevation = 10, + fill_ratio = ratio_normal, +} + +moretrees.sequoia_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 0, + max_elevation = 10, + fill_ratio = ratio_rare, +} + +moretrees.birch_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 10, + max_elevation = 15, + fill_ratio = ratio_common, +} + +moretrees.willow_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = -5, + max_elevation = 5, + fill_ratio = ratio_uncommon, +} + +moretrees.rubber_tree_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = -5, + max_elevation = 8, + fill_ratio = ratio_normal, +} + +moretrees.jungletree_biome = { + place_on = { + xcompat.materials.dirt, + xcompat.materials.dirt_with_grass, + "woodsoils:dirt_with_leaves_1", + "woodsoils:grass_with_leaves_1", + "woodsoils:grass_with_leaves_2", + "default:dirt_with_rainforest_litter", + }, + min_elevation = 1, + spawn_by = minetest.get_modpath("default") and {"default:jungletree"} or nil, + num_spawn_by = minetest.get_modpath("default") and 1 or nil, + biomes = {"rainforest", "rainforest_swamp"}, +} + +moretrees.spruce_biome = { + place_on = coniferous_place_on, + min_elevation = 20, + fill_ratio = ratio_uncommon, +} + +moretrees.cedar_biome = { + place_on = coniferous_place_on, + min_elevation = 0, --Added to solve an issue where cedar trees would sometimes spawn deep underground + fill_ratio = ratio_rare, +} + + +-- Poplar requires a lot of water. +moretrees.poplar_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 0, + max_elevation = 50, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 3, + fill_ratio = ratio_abundant, +} + +-- Spawn an occasional poplar elsewhere. +moretrees.poplar_biome_2 = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 0, + max_elevation = 50, + fill_ratio = ratio_very_rare, +} + +-- Subterranean lakes provide enough water for poplars to grow +moretrees.poplar_biome_3 = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = -50, + max_elevation = 0, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 3, + fill_ratio = ratio_abundant, +} + +moretrees.poplar_small_biome = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 0, + max_elevation = 50, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 1, + fill_ratio = ratio_normal, +} + +moretrees.poplar_small_biome_2 = { + place_on = xcompat.materials.dirt_with_grass, + min_elevation = 0, + max_elevation = 50, + spawn_by = {xcompat.materials.water_source}, + num_spawn_by = 5, + fill_ratio = ratio_abundant, +} + + +moretrees.fir_biome = { + place_on = coniferous_place_on, + min_elevation = 25, + fill_ratio = ratio_normal, +} + +moretrees.fir_biome_snow = { + place_on = {"snow:dirt_with_snow", "snow:snow"}, + below_nodes = {xcompat.materials.dirt, xcompat.materials.dirt_with_grass, "snow:dirt_with_snow"}, + fill_ratio = ratio_normal, +} diff --git a/mods/moretrees/cocos_palm.lua b/mods/moretrees/cocos_palm.lua new file mode 100644 index 0000000..bf9b753 --- /dev/null +++ b/mods/moretrees/cocos_palm.lua @@ -0,0 +1,339 @@ +-- © 2016, Rogier +-- Translation support +local S = minetest.get_translator("moretrees") + +-- Some constants + +local coconut_drop_ichance = 8 + +-- Make the cocos palm fruit trunk a real trunk (it is generated as a fruit) +local trunk = minetest.registered_nodes["moretrees:palm_trunk"] +local ftrunk = {} +local gftrunk = {} +for k,v in pairs(trunk) do + ftrunk[k] = v + gftrunk[k] = v +end +ftrunk.tiles = {} +gftrunk.tiles = {} +for k,v in pairs(trunk.tiles) do + ftrunk.tiles[k] = v + gftrunk.tiles[k] = v +end +ftrunk.drop = "moretrees:palm_trunk" +gftrunk.drop = "moretrees:palm_trunk" +ftrunk.after_destruct = function(pos, oldnode) + local coconuts = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + {"group:moretrees_coconut"} + ) + for _,coconutpos in pairs(coconuts) do + -- minetest.dig_node(coconutpos) does not cause nearby coconuts to be dropped :-( ... + --minetest.dig_node(coconutpos) + local items = minetest.get_node_drops(minetest.get_node(coconutpos).name) + minetest.swap_node(coconutpos, {name = "air"}) + for _, itemname in pairs(items) do + minetest.add_item(coconutpos, itemname) + end + end +end +-- Make the different trunk types distinguishable (but barely) +ftrunk.tiles[1] = "moretrees_palm_trunk_top.png^[transformR90" +gftrunk.tiles[1] = "moretrees_palm_trunk_top.png^[transformR180" +gftrunk.description = gftrunk.description.." (gen)" +minetest.register_node("moretrees:palm_fruit_trunk", ftrunk) +minetest.register_node("moretrees:palm_fruit_trunk_gen", gftrunk) + +local coconut_regrow_abm_spec = { + nodenames = { "moretrees:palm_fruit_trunk" }, + interval = moretrees.coconut_flower_interval, + chance = moretrees.coconut_flower_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + local coconuts = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "group:moretrees_coconut" + ) + -- Expected growth interval increases exponentially with number of coconuts already hanging. + -- Also: if more coconuts are hanging, the chance of picking an empty spot decreases as well... + if math.random(2^#coconuts) <= 2 then + -- Grow in area of 3x3 round trunk + local dx=math.floor(math.random(3)-2) + local dz=math.floor(math.random(3)-2) + local coconutpos = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local coconutnode = minetest.get_node(coconutpos) + if coconutnode.name == "air" then + minetest.swap_node(coconutpos, {name="moretrees:coconut_0"}) + end + end + end +} +if moretrees.coconuts_regrow then + minetest.register_abm(coconut_regrow_abm_spec) +end + +-- Spawn initial coconuts + +-- Spawn initial coconuts +-- (Instead of coconuts, a generated-palm fruit trunk is generated with the tree. This +-- ABM converts the trunk to a regular fruit trunk, and spawns some coconuts) +minetest.register_abm({ + nodenames = { "moretrees:palm_fruit_trunk_gen" }, + interval = 6, + chance = 1, + min_y = -16, + max_y = 48, + label = "converts palm trunk to a regular fruit trunk, and spawns some coconuts", + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.swap_node(pos, {name="moretrees:palm_fruit_trunk"}) + local poslist = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "air" + ) + local genlist = {} + for k,v in pairs(poslist) do + genlist[k] = {x = math.random(100), pos = v} + end + table.sort(genlist, function(a, b) return a.x < b.x; end) + local count = 0 + for _, gen in pairs(genlist) do + minetest.swap_node(gen.pos, {name = "moretrees:coconut_3"}) + count = count + 1 + if count == 4 then + break + end + end + end, +}) + +-- Register coconuts, and make them regrow + +local coconut_growfn = function(pos, elapsed) + local node = minetest.get_node(pos) + local delay = moretrees.coconut_grow_interval + if not node then + return + elseif not moretrees.coconuts_regrow then + -- Regrowing has been turned off. Make coconust grow instantly + minetest.swap_node(pos, {name="moretrees:coconut_3"}) + return + elseif node.name == "moretrees:coconut_3" then + -- Drop coconuts (i.e. remove them), so that new coconuts can grow. + -- Coconuts will drop as items with a small chance + if math.random(coconut_drop_ichance) == 1 then + if moretrees.coconut_item_drop_ichance > 0 + and math.random(moretrees.coconut_item_drop_ichance) == 1 then + local items = minetest.get_node_drops(minetest.get_node(pos).name) + for _, itemname in pairs(items) do + minetest.add_item(pos, itemname) + end + end + minetest.swap_node(pos, {name = "air"}) + end + else + -- Grow coconuts to the next stage + local offset = string.len("moretrees:coconut_x") + local n = string.sub(node.name, offset) + minetest.swap_node(pos, {name=string.sub(node.name, 1, offset-1)..n+1}) + end + -- Don't catch up when elapsed time is large. Regular visits are needed for growth... + local timer = minetest.get_node_timer(pos) + timer:start(delay + math.random(moretrees.coconut_grow_interval)) +end + +local coconut_starttimer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local base_interval = moretrees.coconut_grow_interval * 2 / 3 + timer:set(base_interval + math.random(base_interval), elapsed or 0) +end + +for _,suffix in ipairs({"_0", "_1", "_2", "_3", ""}) do + local name + if suffix == "_0" then + name = S("Coconut Flower") + else + name = S("Coconut") + end + local drop = "" + local coco_group = 1 + local tile = "moretrees_coconut"..suffix..".png" + local timerfn = coconut_growfn + local constructfn = coconut_starttimer + if suffix == "_3" then + drop = "moretrees:coconut" + tile = "moretrees_coconut.png" + elseif suffix == "" then + drop = nil + coco_group = nil + timerfn = nil + constructfn = nil + end + local coconutdef = { + description = name, + tiles = {tile}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_coconut=coco_group }, + inventory_image = tile.."^[transformR180", + wield_image = tile.."^[transformR180", + sounds = xcompat.sounds.node_sound_default(), + drop = drop, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3} + }, + on_timer = timerfn, + on_construct = constructfn, + + } + minetest.register_node("moretrees:coconut"..suffix, coconutdef) +end + +-- convert exisiting cocos palms. This is a bit tricky... +-- Try to make sure that this is indeed a generated tree, and not manually-placed trunks and/or coconuts +if moretrees.coconuts_convert_existing_palms then + local spec = { + name = "moretrees:convert_existing_cocos_palms_to_regrow_coconuts", + nodenames = "moretrees:coconut", + action = function(pos, node, active_object_count, active_object_count_wider) + local trunks + local cvtrunks + local leaves + local coconuts + -- One regular trunk must be adjacent to the coconut + trunks = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks ~= 1 then + return + end + local tpos = trunks[1] + -- 1 or 2 other trunks must be one level below to the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y-1, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks < 1 or #trunks > 2 then + return + end + -- 1 or 2 other trunks must be two levels below to the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y-2, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks < 1 or #trunks > 2 then + return + end + -- 1 or 2 trunks must at the level of the trunk being converted. + cvtrunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #cvtrunks < 1 or #cvtrunks > 2 then + return + end + -- No trunks may be one level above the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, + "moretrees:palm_trunk" + ) + if #trunks ~= 0 then + return + end + -- Leaves must be one level above the trunk being converted. + leaves = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, + "moretrees:palm_leaves" + ) + if #leaves == 0 then + return + end + -- Leaves must be two levels above the trunk being converted. + leaves = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+2, z=tpos.z+1}, + "moretrees:palm_leaves" + ) + if #leaves == 0 then + return + end + -- No cocos fruit trunk may already be adjacent to the coconut + trunks = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "moretrees:palm_fruit_trunk" + ) + if #trunks ~= 0 then + return + end + -- No cocos fruit trunk may be adjacent to or below the trunk being converted. + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, + "moretrees:palm_fruit_trunk" + ) + if #trunks ~= 0 then + return + end + -- Convert trunk and all coconuts nearby. Maybe convert 2 trunks, just in case... + for _, tpos_1 in pairs(cvtrunks) do + minetest.swap_node(tpos_1, {name = "moretrees:palm_fruit_trunk"}) + coconuts = minetest.find_nodes_in_area( + {x=tpos_1.x-1, y=tpos_1.y, z=tpos_1.z-1}, + {x=tpos_1.x+1, y=tpos_1.y, z=tpos_1.z+1}, + "moretrees:coconut" + ) + for _, coconutpos in pairs(coconuts) do + minetest.swap_node(coconutpos, {name = "moretrees:coconut_3"}) + end + end + end, + } + if minetest.register_lbm then + minetest.register_lbm(spec) + else + spec.interval = 3691 + spec.chance = 10 + minetest.register_abm(spec) + end +end + +-- If regrowing was previously disabled, but is enabled now, make sure timers are started for existing coconuts +if moretrees.coconuts_regrow then + local spec = { + name = "moretrees:restart_coconut_regrow_timer", + nodenames = "group:moretrees_coconut", + action = function(pos, node, active_object_count, active_object_count_wider) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + coconut_starttimer(pos) + else + local timeout = timer:get_timeout() + local elapsed = timer:get_elapsed() + if timeout - elapsed > moretrees.coconut_grow_interval * 4/3 then + coconut_starttimer(pos, math.random(moretrees.coconut_grow_interval * 4/3)) + end + end + end, + } + if minetest.register_lbm then + minetest.register_lbm(spec) + else + spec.interval = 3659 + spec.chance = 10 + minetest.register_abm(spec) + end +end + diff --git a/mods/moretrees/crafts.lua b/mods/moretrees/crafts.lua new file mode 100644 index 0000000..918f37b --- /dev/null +++ b/mods/moretrees/crafts.lua @@ -0,0 +1,273 @@ +local S = minetest.get_translator("moretrees") + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + + if moretrees.enable_planks then + minetest.register_craft({ + type = "shapeless", + output = "moretrees:"..treename.."_planks 4", + recipe = { + "moretrees:"..treename.."_trunk" + } + }) + end + + minetest.register_craft({ + type = "fuel", + recipe = "moretrees:"..treename.."_sapling", + burntime = 10, + }) +end + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:rubber_tree_planks 4", + recipe = { + "moretrees:rubber_tree_trunk_empty" + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:moretrees_leaves", + burntime = 1, +}) + +-- Food recipes! + +minetest.register_craftitem("moretrees:coconut_milk", { + description = S("Coconut Milk"), + inventory_image = "moretrees_coconut_milk_inv.png", + wield_image = "moretrees_coconut_milk.png", + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = {vessel = 1}, +}) + +minetest.register_craftitem("moretrees:raw_coconut", { + description = S("Raw Coconut"), + inventory_image = "moretrees_raw_coconut.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:date", { + description = S("Date"), + inventory_image = "moretrees_date.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:date_nut_snack", { + description = S("Date & nut snack"), + inventory_image = "moretrees_date_nut_snack.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:date_nut_batter", { + description = S("Date-nut cake batter"), + inventory_image = "moretrees_date_nut_batter.png", +}) + +minetest.register_craftitem("moretrees:date_nut_cake", { + description = S("Date-nut cake"), + inventory_image = "moretrees_date_nut_cake.png", + on_use = minetest.item_eat(32), +}) + +minetest.register_craftitem("moretrees:date_nut_bar", { + description = S("Date-nut energy bar"), + inventory_image = "moretrees_date_nut_bar.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:acorn_muffin_batter", { + description = S("Acorn Muffin batter"), + inventory_image = "moretrees_acorn_muffin_batter.png", +}) + +minetest.register_craftitem("moretrees:acorn_muffin", { + description = S("Acorn Muffin"), + inventory_image = "moretrees_acorn_muffin.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:spruce_nuts", { + description = S("Roasted Spruce Cone Nuts"), + inventory_image = "moretrees_spruce_nuts.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:cedar_nuts", { + description = S("Roasted Cedar Cone Nuts"), + inventory_image = "moretrees_cedar_nuts.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:fir_nuts", { + description = S("Roasted Fir Cone Nuts"), + inventory_image = "moretrees_fir_nuts.png", + on_use = minetest.item_eat(1), +}) + +for i in ipairs(moretrees.cutting_tools) do + local tool = moretrees.cutting_tools[i] + minetest.register_craft({ + type = "shapeless", + output = "moretrees:coconut_milk", + recipe = { + "moretrees:coconut", + "vessels:drinking_glass", + tool + }, + replacements = { + { "moretrees:coconut", "moretrees:raw_coconut" }, + } + }) +end + +-- give tool back with wear preserved +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if (itemstack:get_name() == "moretrees:coconut_milk") then + for i, j in pairs(old_craft_grid) do + -- find tool used to do the craft + local ocg_name = j:get_name() + if ((ocg_name ~= "") and (ocg_name ~= "moretrees:coconut") and (ocg_name ~= "vessels:drinking_glass")) then + -- abort if using cutting board + if minetest.get_item_group(ocg_name, "food_cutting_board") == 1 then + return + end + -- create a new tool and set wear + local t = ItemStack(ocg_name) + local w = j:get_wear() + -- works if tool used is an axe + local uses = j:get_tool_capabilities().groupcaps.choppy.uses or 0 + if (w == 0 and uses ~= 0) then + -- tool has never been used + -- use tool once + t:set_wear(65535/(9*(uses - 1))) + else + -- set wear back + t:set_wear(w) + -- use tool once + if (uses ~= 0) then + t:add_wear(65535/(9*(uses - 1))) + end + end + -- add to craft inventory + craft_inv:add_item("craft", t) + end + end + end +end) + +-- coconut milk using food_cutting_board from farming redo +if minetest.registered_items["farming:cutting_board"] then + minetest.register_craft({ + type = "shapeless", + output = "moretrees:coconut_milk", + recipe = { + "moretrees:coconut", + "vessels:drinking_glass", + "group:food_cutting_board", + }, + replacements = { + { "moretrees:coconut", "moretrees:raw_coconut" }, + { "group:food_cutting_board", "farming:cutting_board" }, + } + }) +end + + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:date_nut_snack", + recipe = { + "moretrees:date", + "moretrees:date", + "moretrees:date", + "moretrees:spruce_nuts", + "moretrees:cedar_nuts", + "moretrees:fir_nuts", + } +}) + +-- The date-nut cake is an exceptional food item due to its highly +-- concentrated nature (32 food units). Because of that, it requires +-- many different ingredients, and, starting from the base ingredients +-- found or harvested in nature, it requires many steps to prepare. +local flour +if minetest.registered_nodes["farming:flour"] then + flour = "farming:flour" +else + flour = "moretrees:acorn_muffin_batter" +end +minetest.register_craft({ + type = "shapeless", + output = "moretrees:date_nut_batter", + recipe = { + "moretrees:date_nut_snack", + "moretrees:date_nut_snack", + "moretrees:date_nut_snack", + "moretrees:coconut_milk", + "moretrees:date_nut_snack", + "moretrees:raw_coconut", + "moretrees:coconut_milk", + flour, + "moretrees:raw_coconut", + }, + replacements = { + { "moretrees:coconut_milk", "vessels:drinking_glass 2" } + } +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:date_nut_cake", + recipe = "moretrees:date_nut_batter", +}) + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:date_nut_bar 8", + recipe = {"moretrees:date_nut_cake"}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:acorn_muffin_batter", + recipe = { + "moretrees:acorn", + "moretrees:acorn", + "moretrees:acorn", + "moretrees:acorn", + "moretrees:coconut_milk", + }, + replacements = { + { "moretrees:coconut_milk", "vessels:drinking_glass" } + } +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:acorn_muffin 4", + recipe = "moretrees:acorn_muffin_batter", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:spruce_nuts 4", + recipe = "moretrees:spruce_cone", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:cedar_nuts 4", + recipe = "moretrees:cedar_cone", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:fir_nuts 4", + recipe = "moretrees:fir_cone", +}) + + diff --git a/mods/moretrees/date_palm.lua b/mods/moretrees/date_palm.lua new file mode 100644 index 0000000..3b4261a --- /dev/null +++ b/mods/moretrees/date_palm.lua @@ -0,0 +1,770 @@ +-- Date palms. +-- +-- Date palms grow in hot and dry desert, but they require water. This makes them +-- a bit harder to find. If found in the middle of the desert, their presence +-- indicates a water source below the surface. +-- +-- As an additional feature (which can be disabled), dates automatically regrow after +-- harvesting (provided a male tree is sufficiently nearby). +-- If regrowing is enabled, then ripe dates will not hang forever. Most will disappear +-- (e.g. eaten by birds, ...), and a small fraction will drop as items. + +-- © 2016, Rogier + +local S = minetest.get_translator("moretrees") + +-- Some constants + +local dates_drop_ichance = 4 +local stems_drop_ichance = 4 +local flowers_wither_ichance = 3 + +-- implementation + +local dates_regrow_prob +if moretrees.dates_regrow_unpollinated_percent <= 0 then + dates_regrow_prob = 0 +elseif moretrees.dates_regrow_unpollinated_percent >= 100 then + dates_regrow_prob = 1 +else + dates_regrow_prob = 1 - math.pow(moretrees.dates_regrow_unpollinated_percent/100, 1/flowers_wither_ichance) +end + +-- Make the date palm fruit trunk a real trunk (it is generated as a fruit) +local trunk = minetest.registered_nodes["moretrees:date_palm_trunk"] +local ftrunk = {} +local fftrunk = {} +local mftrunk = {} +for k,v in pairs(trunk) do + ftrunk[k] = v +end +ftrunk.tiles = {} +for k,v in pairs(trunk.tiles) do + ftrunk.tiles[k] = v +end +ftrunk.drop = "moretrees:date_palm_trunk" +ftrunk.after_destruct = function(pos, oldnode) + local dates = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, + {x=pos.x+2, y=pos.y, z=pos.z+2}, + {"group:moretrees_dates"} + ) + for _,datespos in pairs(dates) do + -- minetest.dig_node(datespos) does not cause nearby dates to be dropped :-( ... + local items = minetest.get_node_drops(minetest.get_node(datespos).name) + minetest.swap_node(datespos, {name = "air"}) + for _, itemname in pairs(items) do + minetest.add_item(datespos, itemname) + end + end +end +for k,v in pairs(ftrunk) do + mftrunk[k] = v + fftrunk[k] = v +end +fftrunk.tiles = {} +mftrunk.tiles = {} +for k,v in pairs(trunk.tiles) do + fftrunk.tiles[k] = v + mftrunk.tiles[k] = v +end +-- Make the different types of trunk distinguishable (but not too easily) +ftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR180" +ftrunk.description = ftrunk.description.." (gen)" +fftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR90" +mftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR-90" +minetest.register_node("moretrees:date_palm_fruit_trunk", ftrunk) +minetest.register_node("moretrees:date_palm_ffruit_trunk", fftrunk) +minetest.register_node("moretrees:date_palm_mfruit_trunk", mftrunk) + +-- ABM to grow new date blossoms +local date_regrow_abm_spec = { + nodenames = { "moretrees:date_palm_ffruit_trunk", "moretrees:date_palm_mfruit_trunk" }, + interval = moretrees.dates_flower_interval, + chance = moretrees.dates_flower_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + local dates = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, + "group:moretrees_dates" + ) + + -- New blossom interval increases exponentially with number of dates already hanging + -- In addition: if more dates are hanging, the chance of picking an empty spot decreases as well... + if math.random(2^#dates) <= 2 then + -- Grow in area of 5x5 round trunk; higher probability in 3x3 area close to trunk + local dx=math.floor((math.random(50)-18)/16) + local dz=math.floor((math.random(50)-18)/16) + local datepos = {x=pos.x+dx, y=pos.y, z=pos.z+dz} + local datenode = minetest.get_node(datepos) + if datenode.name == "air" then + if node.name == "moretrees:date_palm_ffruit_trunk" then + minetest.swap_node(datepos, {name="moretrees:dates_f0"}) + else + minetest.swap_node(datepos, {name="moretrees:dates_m0"}) + end + end + end + end +} +if moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0 then + minetest.register_abm(date_regrow_abm_spec) +end + +-- Choose male or female palm, and spawn initial dates +-- (Instead of dates, a dates fruit trunk is generated with the tree. This +-- ABM converts the trunk to a female or male fruit trunk, and spawns some +-- hanging dates) +minetest.register_abm({ + nodenames = { "moretrees:date_palm_fruit_trunk" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local type + if math.random(100) <= moretrees.dates_female_percent then + type = "f" + minetest.swap_node(pos, {name="moretrees:date_palm_ffruit_trunk"}) + else + type = "m" + minetest.swap_node(pos, {name="moretrees:date_palm_mfruit_trunk"}) + end + local dates1 = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "air" + ) + for _,genpos in pairs(dates1) do + if math.random(100) <= 20 then + if type == "m" then + minetest.swap_node(genpos, {name = "moretrees:dates_n"}) + else + minetest.swap_node(genpos, {name = "moretrees:dates_f4"}) + end + end + end + local dates2 = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, + {x=pos.x+2, y=pos.y, z=pos.z+2}, + "air" + ) + for _,genpos in pairs(dates2) do + if math.random(100) <= 5 then + if type == "m" then + minetest.swap_node(genpos, {name = "moretrees:dates_n"}) + else + minetest.swap_node(genpos, {name = "moretrees:dates_f4"}) + end + end + end + end, +}) + +-- Dates growing functions. + +-- This is a bit complex, as the purpose is to find male flowers at horizontal distances of over +-- 100 nodes. As searching such a large area is time consuming, this is optimized in four ways: +-- - The search result (the locations of male trees) is cached, so that it can be used again +-- - Only 1/9th of the desired area is searched at a time. A new search is only performed if no male +-- flowers are found in the previously searched parts. +-- - Search results are shared with other female palms nearby. +-- - If previous searches for male palms have consumed too much CPU time, the search is skipped +-- (This means no male palms will be found, and the pollination of the flowers affected will be +-- delayed. If this happens repeatedly, eventually, the female flowers will wither...) +-- A caching method was selected that is suited for the case where most date trees are long-lived, +-- and where the number of trees nearby is limited: +-- - Locations of male palms are stored as metadata for every female palm. This means that a player +-- visiting a remote area with some date palms will not cause extensive searches for male palms as +-- long overdue blossoming ABMs are triggered for every date palm. +-- - Even when male palms *are* cut down, a cache refill will only be performed if the cached results do not +-- contain a male palm with blossoms. +-- The method will probably perform suboptimally: +-- - If female palms are frequently chopped down and replanted. +-- Freshly grown palms will need to search for male palms again +-- (this is mitigated by the long blossoming interval, which increases the chance that search +-- results have already been shared) +-- - If an area contains a large number of male and female palms. +-- In this area, every female palm will have an almost identical list of male palm locations +-- as metadata. +-- - If all male palms within range of a number of female palms have been chopped down (with possibly +-- new ones planted). Although an attempt was made to share search results in this case as well, +-- a number of similar searches will unavoidably be performed by the different female palms. +-- - If no male palms are in range of a female palm. In that case, there will be frequent searches +-- for newly-grown male palms. + +-- Search statistics - used to limit the search load. +local sect_search_stats = {} -- Search statistics - server-wide +local function reset_sect_search_stats() + sect_search_stats.count = 0 -- # of searches + sect_search_stats.skip = 0 -- # of times skipped + sect_search_stats.sum = 0 -- total time spent + sect_search_stats.min = 999999999 -- min time spent + sect_search_stats.max = 0 -- max time spent +end +reset_sect_search_stats() +sect_search_stats.last_us = 0 -- last time a search was done (microseconds, max: 2^32) +sect_search_stats.last_s = 0 -- last time a search was done (system time in seconds) + +-- Find male trunks in one section (=1/9 th) of the searchable area. +-- sect is -4 to 4, where 0 is the center section +local function find_fruit_trunks_near(ftpos, sect) + local r = moretrees.dates_pollination_distance + 2 * math.sqrt(2) + local sect_hr = math.floor(r / 3 + 0.9999) + local sect_vr = math.floor(r / 2 + 0.9999) + local t0us = minetest.get_us_time() + local t0s = os.time() + + -- Compute elapsed time since last search. + -- Unfortunately, the time value wraps after about 71 minutes (2^32 microseconds), + -- so it must be corrected to obtain the actual elapsed time. + if t0us < sect_search_stats.last_us then + -- Correct a simple wraparound. + -- This is not sufficient, as the time value may have wrapped more than once... + sect_search_stats.last_us = sect_search_stats.last_us - 2^32 + end + if t0s - sect_search_stats.last_s > 2^32/1000000 then + -- One additional correction is enough for our purposes. + -- For exact results, more corrections may be needed though... + -- (and even not applying this correction at all would still only yield + -- a minimal risk of a non-serious miscalculation...) + sect_search_stats.last_us = sect_search_stats.last_us - 2^32 + end + + -- Skip the search if it is consuming too much CPU time + if sect_search_stats.count > 0 and moretrees.dates_blossom_search_iload > 0 + and sect_search_stats.sum / sect_search_stats.count > moretrees.dates_blossom_search_time_treshold + and t0us - sect_search_stats.last_us < moretrees.dates_blossom_search_iload + * (sect_search_stats.sum / sect_search_stats.count) then + sect_search_stats.skip = sect_search_stats.skip + 1 + return nil + end + + local basevec = { x = ftpos.x + 2 * sect.x * sect_hr, + y = ftpos.y, + z = ftpos.z + 2 * sect.z * sect_hr} + -- find_nodes_in_area is limited to 82^3, make sure to not overrun it + local sizevec = { x = sect_hr, y = sect_vr, z = sect_hr } + if sect_hr * sect_hr * sect_vr > 41^3 then + sizevec = vector.apply(sizevec, function(a) return math.min(a, 41) end) + end + + local all_palms = minetest.find_nodes_in_area( + vector.subtract(basevec, sizevec), + vector.add(basevec, sizevec), + {"moretrees:date_palm_mfruit_trunk", "moretrees:date_palm_ffruit_trunk"}) + + -- Collect different palms in separate lists. + local female_palms = {} + local male_palms = {} + local all_male_palms = {} + for _, pos in pairs(all_palms) do + if pos.x ~= ftpos.x or pos.y ~= ftpos.y or pos.z ~= ftpos.z then + local node = minetest.get_node(pos) + if node and node.name == "moretrees:date_palm_ffruit_trunk" then + table.insert(female_palms,pos) + elseif node then + table.insert(all_male_palms,pos) + -- In sector 0, all palms are of interest. + -- In other sectors, forget about palms that are too far away. + if sect == 0 then + table.insert(male_palms,pos) + else + local ssq = 0 + for _, c in pairs({"x", "z"}) do + local dc = pos[c] - ftpos[c] + ssq = ssq + dc * dc + end + if math.sqrt(ssq) <= r then + table.insert(male_palms,pos) + end + end + end + end + end + + -- Update search statistics + local t1us = minetest.get_us_time() + if t1us < t0us then + -- Wraparound. Assume the search lasted less than 2^32 microseconds (~71 min) + -- (so no need to apply another correction) + t0us = t0us - 2^32 + end + sect_search_stats.last_us = t0us + sect_search_stats.last_s = t0s + sect_search_stats.count = sect_search_stats.count + 1 + sect_search_stats.sum = sect_search_stats.sum + t1us-t0us + if t1us - t0us < sect_search_stats.min then + sect_search_stats.min = t1us - t0us + end + if t1us - t0us > sect_search_stats.max then + sect_search_stats.max = t1us - t0us + end + + return male_palms, female_palms, all_male_palms +end + +local function dates_print_search_stats(log) + local stats + if sect_search_stats.count > 0 then + stats = string.format("Male date tree searching stats: searches: %d/%d: average: %d µs (%d..%d)", + sect_search_stats.count, sect_search_stats.count + sect_search_stats.skip, + sect_search_stats.sum/sect_search_stats.count, sect_search_stats.min, sect_search_stats.max) + else + stats = string.format("Male date tree searching stats: searches: 0/0: average: (no searches yet)") + end + if log then + minetest.log("action", "[moretrees] " .. stats) + end + return true, stats +end + +minetest.register_chatcommand("dates_stats", { + description = "Print male date palm search statistics", + params = "|chat|log|reset", + privs = { server = true }, + func = function(name, param) + param = string.lower(param:gsub("%s+", "")) + if param == "" or param == "chat" then + return dates_print_search_stats(false) + elseif param == "log" then + return dates_print_search_stats(true) + elseif param == "reset" then + reset_sect_search_stats() + return true + else + return false, "Invalid subcommand; expected: '' or 'chat' or 'log' or 'reset'" + end + end, +}) + +-- Find the female trunk near the female flowers to be pollinated +local function find_female_trunk(fbpos) + local trunks = minetest.find_nodes_in_area({x=fbpos.x-2, y=fbpos.y, z=fbpos.z-2}, + {x=fbpos.x+2, y=fbpos.y, z=fbpos.z+2}, + "moretrees:date_palm_ffruit_trunk") + local ftpos + local d = 99 + for x, pos in pairs(trunks) do + local ssq = 0 + for _, c in pairs({"x", "z"}) do + local dc = pos[c] - fbpos[c] + ssq = ssq + dc * dc + end + if math.sqrt(ssq) < d then + ftpos = pos + d = math.sqrt(ssq) + end + end + return ftpos +end + +-- Find male blossom near a male trunk, +-- the male blossom must be in range of a specific female blossom as well +local function find_male_blossom_near_trunk(fbpos, mtpos) + local r = moretrees.dates_pollination_distance + local blossoms = minetest.find_nodes_in_area({x=mtpos.x-2, y=mtpos.y, z=mtpos.z-2}, + {x=mtpos.x+2, y=mtpos.y, z=mtpos.z+2}, + "moretrees:dates_m0") + for x, mbpos in pairs(blossoms) do + local ssq = 0 + for _, c in pairs({"x", "z"}) do + local dc = mbpos[c] - fbpos[c] + ssq = ssq + dc * dc + end + if math.sqrt(ssq) <= r then + return mbpos + end + end + +end + +-- Find a male blossom in range of a specific female blossom, +-- using a nested list of male blossom positions +local function find_male_blossom_in_mpalms(ftpos, fbpos, mpalms) + -- Process the elements of mpalms.sect (index -4 .. 4) in random order + -- First, compute the order in which the sectors will be searched + local sect_index = {} + local sect_rnd = {} + for i = -4,4 do + local n = math.random(1023) + sect_index[n] = i + table.insert(sect_rnd, n) + end + table.sort(sect_rnd) + + -- Search the sectors + local sect_old = 0 + local sect_time = minetest.get_gametime() + for _, n in pairs(sect_rnd) do + -- Record the oldest sector, so that it can be searched if no male + -- blossoms were found + if not mpalms.sect_time[sect_index[n]] then + sect_old = sect_index[n] + sect_time = 0 + elseif mpalms.sect_time[sect_index[n]] < sect_time then + sect_old = sect_index[n] + sect_time = mpalms.sect_time[sect_index[n]] + end + if mpalms.sect[sect_index[n]] and #mpalms.sect[sect_index[n]] then + for px, mtpos in pairs(mpalms.sect[sect_index[n]]) do + local node = minetest.get_node(mtpos) + if node and node.name == "moretrees:date_palm_mfruit_trunk" then + local mbpos = find_male_blossom_near_trunk(fbpos, mtpos) + if mbpos then + return mbpos + end + elseif node and node.name ~= "ignore" then + -- no more male trunk here. + mpalms.sect[sect_index[n]][px] = nil + end + end + end + end + return nil, sect_old +end + +-- Find a male blossom in range of a specific female blossom, +-- using the cache associated with the given female trunk +-- If necessary, recompute part of the cache +local last_search_result = {} +local function find_male_blossom_with_ftrunk(fbpos,ftpos) + local meta = minetest.get_meta(ftpos) + local mpalms + local cache_changed = true + + -- Load cache. If distance has changed, start with empty cache instead. + local mpalms_dist = meta:get_int("male_palms_dist") + if mpalms_dist and mpalms_dist == moretrees.dates_pollination_distance then + mpalms = meta:get_string("male_palms") + if mpalms and mpalms ~= "" then + mpalms = minetest.deserialize(mpalms) + cache_changed = false + end + end + if not mpalms or not mpalms.sect then + mpalms = {} + mpalms.sect = {} + mpalms.sect_time = {} + meta:set_int("male_palms_dist", moretrees.dates_pollination_distance) + cache_changed = true + end + local fpalms_list + local all_mpalms_list + local sector0_searched = false + + -- Always make sure that sector 0 is cached + if not mpalms.sect[0] then + mpalms.sect[0], fpalms_list, all_mpalms_list = find_fruit_trunks_near(ftpos, {x = 0, z = 0}) + mpalms.sect_time[0] = minetest.get_gametime() + sector0_searched = true + cache_changed = true + last_search_result.female = fpalms_list + last_search_result.male = all_mpalms_list + end + + -- Find male palms + local mbpos, sect_old = find_male_blossom_in_mpalms(ftpos, fbpos, mpalms) + + -- If not found, (re)generate the cache for an additional sector. But don't search it yet (for performance reasons) + -- (Use the globally cached results if possible) + if not mbpos and not sector0_searched then + if not mpalms.sect_time[0] or mpalms.sect_time[0] == 0 or math.random(3) == 1 then + -- Higher probability of re-searching the center sector + sect_old = 0 + end + -- Use globally cached result if possible + mpalms.sect[sect_old] = nil + if sect_old == 0 and mpalms.sect_time[0] and mpalms.sect_time[0] > 0 + and last_search_result.male and #last_search_result.male then + for _, pos in pairs(last_search_result.female) do + if pos.x == ftpos.x and pos.y == ftpos.y and pos.z == ftpos.z then + mpalms.sect[sect_old] = last_search_result.male + -- Next time, don't use the cached result + mpalms.sect_time[sect_old] = nil + cache_changed = true + end + end + end + -- Else do a new search + if not mpalms.sect[sect_old] then + mpalms.sect[sect_old], fpalms_list, all_mpalms_list = find_fruit_trunks_near( + ftpos, + {x = (sect_old + 4) % 3 - 1, z = (sect_old + 4) / 3 - 1} + ) + cache_changed = true + if sect_old == 0 then + -- Save the results if it is sector 0 + -- (chance of reusing results from another sector are smaller) + last_search_result.female = fpalms_list + last_search_result.male = all_mpalms_list + end + if mpalms.sect[sect_old] then + mpalms.sect_time[sect_old] = minetest.get_gametime() + else + mpalms.sect_time[sect_old] = nil + end + end + end + + -- Share search results with other female trunks in the same area + -- Note that the list of female trunks doesn't (shouldn't :-) contain the current female trunk. + if fpalms_list and #fpalms_list and #all_mpalms_list then + local all_mpalms = {} + all_mpalms.sect = {} + all_mpalms.sect_time = {} + all_mpalms.sect[0] = all_mpalms_list + -- Don't set sect_time[0], so that the cached sector will be re-searched soon (if necessary) + local all_mpalms_serialized = minetest.serialize(all_mpalms) + for _, pos in pairs(fpalms_list) do + local fmeta = minetest.get_meta(pos) + local fdist = fmeta:get_int("male_palms_dist") + if not fdist or fdist ~= moretrees.dates_pollination_distance then + fmeta:set_string("male_palms", all_mpalms_serialized) + fmeta:set_int("male_palms_dist", moretrees.dates_pollination_distance) + end + end + end + + -- Save cache. + if cache_changed then + meta:set_string("male_palms", minetest.serialize(mpalms)) + end + + return mbpos +end + +-- Find a male blossom in range of a specific female blossom +local function find_male_blossom(fbpos) + local ftpos = find_female_trunk(fbpos) + if ftpos then + return find_male_blossom_with_ftrunk(fbpos, ftpos) + end + return nil +end + +-- Growing function for dates +local dates_growfn = function(pos, elapsed) + local node = minetest.get_node(pos) + local delay = moretrees.dates_grow_interval + local action + if not node then + return + elseif not moretrees.dates_regrow_pollinated and dates_regrow_prob == 0 then + -- Regrowing of dates is disabled. + if string.find(node.name, "moretrees:dates_f") then + minetest.swap_node(pos, {name="moretrees:dates_f4"}) + elseif string.find(node.name, "moretrees:dates_m") then + minetest.swap_node(pos, {name="moretrees:dates_n"}) + else + minetest.swap_node(pos, {name = "air"}) + end + return + elseif node.name == "moretrees:dates_f0" and math.random(100) <= 100 * dates_regrow_prob then + -- Dates grow unpollinated + minetest.swap_node(pos, {name="moretrees:dates_f1"}) + action = "nopollinate" + elseif node.name == "moretrees:dates_f0" and moretrees.dates_regrow_pollinated and find_male_blossom(pos) then + -- Pollinate flowers + minetest.swap_node(pos, {name="moretrees:dates_f1"}) + action = "pollinate" + elseif string.match(node.name, "0$") then + -- Make female unpollinated and male flowers last a bit longer + if math.random(flowers_wither_ichance) == 1 then + if node.name == "moretrees:dates_f0" then + minetest.swap_node(pos, {name="moretrees:dates_fn"}) + else + minetest.swap_node(pos, {name="moretrees:dates_n"}) + end + action = "wither" + else + action = "nowither" + end + elseif node.name == "moretrees:dates_f4" then + -- Remove dates, and optionally drop them as items + if math.random(dates_drop_ichance) == 1 then + if moretrees.dates_item_drop_ichance > 0 and math.random(moretrees.dates_item_drop_ichance) == 1 then + local items = minetest.get_node_drops(minetest.get_node(pos).name) + for _, itemname in pairs(items) do + minetest.add_item(pos, itemname) + end + end + minetest.swap_node(pos, {name="moretrees:dates_n"}) + action = "drop" + else + action = "nodrop" + end + elseif string.match(node.name, "n$") then + -- Remove stems. + if math.random(stems_drop_ichance) == 1 then + minetest.swap_node(pos, {name = "air"}) + return "stemdrop" + end + action = "nostemdrop" + else + -- Grow dates + local offset = 18 + local n = string.sub(node.name, offset) + minetest.swap_node(pos, {name=string.sub(node.name, 1, offset-1)..n+1}) + action = "grow" + end + -- Don't catch up when elapsed time is large. Regular visits are needed for growth... + local timer = minetest.get_node_timer(pos) + timer:start(delay + math.random(moretrees.dates_grow_interval)) + return action +end + +--[[ +-- Alternate growth function for dates. +-- It calls the primary growth function, but also measures CPU time consumed. +-- Use this function to analyze date growing performance. +local stat = {} +stat.count = 0 +local dates_growfn_profiling = function(pos, elapsed) + local t0 = minetest.get_us_time() + local action = dates_growfn(pos, elapsed) + local t1 = minetest.get_us_time() + if t1 < t0 then + t1 = t1 + 2^32 + end + stat.count = stat.count + 1 + if not stat[action] then + stat[action] = {} + stat[action].count = 0 + stat[action].sum = 0 + stat[action].min = 9999999999 + stat[action].max = 0 + end + stat[action].count = stat[action].count + 1 + stat[action].sum = stat[action].sum + t1-t0 + if t1-t0 < stat[action].min then + stat[action].min = t1-t0 + end + if t1-t0 > stat[action].max then + stat[action].max = t1-t0 + end + + if stat.count % 10 == 0 then + io.write(".") + io.flush() + end + if stat.count % 100 == 0 then + print(string.format("Date grow statistics %5d:", stat.count)) + local sum = 0 + local count = 0 + if sect_search_stats.count > 0 and stat.pollinate and stat.pollinate.count > 0 then + print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", + "search", sect_search_stats.count, + 100*sect_search_stats.count/stat.pollinate.count, + sect_search_stats.sum/sect_search_stats.count, + sect_search_stats.min, sect_search_stats.max)) + else + print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", + "search", sect_search_stats.count, + 0, 0, 0, 0)) + end + for action,data in pairs(stat) do + if action ~= "count" then + count = count + data.count + sum = sum + data.sum + print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", + action, data.count, + 100*data.count/stat.count, data.sum/data.count, + data.min, data.max)) + end + end + print(string.format("\t%-12s: %6d ( 100%%): %6dus", + "TOTAL", count, sum/count)) + end +end +--]] + +-- Register dates + +local dates_starttimer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local base_interval = moretrees.dates_grow_interval * 2 / 3 + timer:set(base_interval + math.random(base_interval), elapsed or 0) +end + +local dates_drop = { + items = { + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }}, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 2 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 5 }, + {items = { "moretrees:date" }, rarity = 20 }, + {items = { "moretrees:date" }, rarity = 20 }, + {items = { "moretrees:date" }, rarity = 20 }, + {items = { "moretrees:date" }, rarity = 20 }, + } +} + +for _,suffix in ipairs({"f0", "f1", "f2", "f3", "f4", "m0", "fn", "n"}) do + local name + if suffix == "f0" or suffix == "m0" then + name = S("Date Flowers") + elseif suffix == "n" or suffix == "fn" then + name = S("Date Stem") + else + name = S("Dates") + end + local dropfn = suffix == "f4" and dates_drop or "" + local datedef = { + description = name, + tiles = {"moretrees_dates_"..suffix..".png"}, + visual_scale = 2, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_dates=1 }, + inventory_image = "moretrees_dates_"..suffix..".png^[transformR0", + wield_image = "moretrees_dates_"..suffix..".png^[transformR90", + sounds = xcompat.sounds.node_sound_default(), + drop = dropfn, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.3, -0.3, 0.3, 3.5, 0.3} + }, + on_timer = dates_growfn, + on_construct = (moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0) + and dates_starttimer, + + } + minetest.register_node("moretrees:dates_"..suffix, datedef) +end + +-- If regrowing was previously disabled, but is enabled now, make sure timers are started for existing dates +if moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0 then + local spec = { + name = "moretrees:restart_dates_regrow_timer", + nodenames = "group:moretrees_dates", + action = function(pos, node, active_object_count, active_object_count_wider) + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + dates_starttimer(pos) + else + local timeout = timer:get_timeout() + local elapsed = timer:get_elapsed() + if timeout - elapsed > moretrees.dates_grow_interval * 4/3 then + dates_starttimer(pos, math.random(moretrees.dates_grow_interval * 4/3)) + end + end + end, + } + if minetest.register_lbm then + minetest.register_lbm(spec) + else + spec.interval = 3557 + spec.chance = 10 + minetest.register_abm(spec) + end +end + diff --git a/mods/moretrees/init.lua b/mods/moretrees/init.lua new file mode 100644 index 0000000..6982a0d --- /dev/null +++ b/mods/moretrees/init.lua @@ -0,0 +1,364 @@ +-- More trees! 2013-04-07 +-- +-- This mod adds more types of trees to the game +-- +-- Some of the node definitions and textures came from cisoun's conifers mod +-- and bas080's jungle trees mod. +-- +-- Brought together into one mod and made L-systems compatible by Vanessa +-- Ezekowitz. +-- +-- Firs and Jungle tree axioms/rules by Vanessa Dannenberg, with the +-- latter having been tweaked by RealBadAngel, most other axioms/rules written +-- by RealBadAngel. +-- + +moretrees = {} + +local S = minetest.get_translator("moretrees") + +if minetest.get_modpath("default") then + minetest.override_item("default:sapling", { + description = S("Sapling") + }) + + minetest.override_item("default:tree", { + description = S("Tree") + }) + + minetest.override_item("default:wood", { + description = S("Wooden Planks") + }) + + minetest.override_item("default:leaves", { + description = S("Leaves") + }) + + minetest.override_item("default:fence_wood", { + description = S("Wooden Fence") + }) + + minetest.override_item("default:fence_rail_wood", { + description = S("Wooden Fence Rail") + }) +end + +if minetest.get_modpath("doors") then + minetest.override_item("doors:gate_wood_closed", { + description = S("Wooden Fence Gate") + }) + + minetest.override_item("doors:gate_wood_open", { + description = S("Wooden Fence Gate") + }) +end + + +-- Read the default config file (and if necessary, copy it to the world folder). + +local worldpath=minetest.get_worldpath() +local modpath=minetest.get_modpath("moretrees") + +dofile(modpath.."/settings.lua") + +if io.open(worldpath.."/moretrees_settings.txt","r") then + io.close() + dofile(worldpath.."/moretrees_settings.txt") +end + +-- Validate that if ethereal exists, that it's version is greater than 20220424. +-- Lower versions of ethereal clear registered biomes and decorations during +-- initialization which results in lost content from this mod (and others) +-- depending on where they are in the mod load order. +minetest.register_on_mods_loaded(function() + if minetest.global_exists("ethereal") then + local ethereal_ver = tonumber(ethereal.version) + if (ethereal_ver and ethereal_ver < 20220424) then + error("[moretrees] The version of ethereal detected can result " .. + "in parts of this mod and others disappearing due to mod " .. + "load order. Please update ethereal."); + end + end +end) + +-- infinite stacks checking + +if minetest.get_modpath("unified_inventory") or not + minetest.settings:get_bool("creative_mode") then + moretrees.expect_infinite_stacks = false +else + moretrees.expect_infinite_stacks = true +end + +-- tables, load other files + +moretrees.cutting_tools = { + "default:axe_mese", + xcompat.materials.axe_steel, + xcompat.materials.axe_diamond, + xcompat.materials.axe_bronze, + "glooptest:axe_alatro", + "glooptest:axe_arol", + "moreores:axe_mithril", + "moreores:axe_silver", + "titanium:axe", +} + +dofile(modpath.."/tree_models.lua") +dofile(modpath.."/node_defs.lua") +dofile(modpath.."/date_palm.lua") +dofile(modpath.."/cocos_palm.lua") +dofile(modpath.."/biome_defs.lua") +dofile(modpath.."/saplings.lua") +dofile(modpath.."/crafts.lua") + +-- tree spawning setup +moretrees.spawn_beech_object = moretrees.beech_model +moretrees.spawn_apple_tree_object = moretrees.apple_tree_model +moretrees.spawn_oak_object = moretrees.oak_model +moretrees.spawn_sequoia_object = moretrees.sequoia_model +moretrees.spawn_palm_object = moretrees.palm_model +moretrees.spawn_date_palm_object = moretrees.date_palm_model +moretrees.spawn_cedar_object = moretrees.cedar_model +moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model +moretrees.spawn_willow_object = moretrees.willow_model +moretrees.spawn_birch_object = "moretrees.grow_birch" +moretrees.spawn_spruce_object = "moretrees.grow_spruce" +moretrees.spawn_jungletree_object = "moretrees.grow_jungletree" +moretrees.spawn_fir_object = "moretrees.grow_fir" +moretrees.spawn_fir_snow_object = "moretrees.grow_fir_snow" +moretrees.spawn_poplar_object = moretrees.poplar_model +moretrees.spawn_poplar_small_object = moretrees.poplar_small_model + +local deco_ids = {} + +function translate_biome_defs(def, treename, index) + if not index then index = 1 end + local deco_def = { + name = treename .. "_" .. index, + deco_type = "simple", + place_on = def.place_on, + sidelen = 16, + fill_ratio = def.fill_ratio or 0.001, + --biomes eventually? + y_min = def.min_elevation, + y_max = def.max_elevation, + spawn_by = def.spawn_by, + num_spawn_by = def.num_spawn_by, + decoration = "moretrees:"..treename.."_sapling_ongen" + } + + deco_ids[#deco_ids+1] = treename .. ("_" .. index or "_1") + + return deco_def +end + +minetest.register_decoration(translate_biome_defs(moretrees.beech_biome, "beech")) +minetest.register_decoration(translate_biome_defs(moretrees.apple_tree_biome, "apple_tree")) +minetest.register_decoration(translate_biome_defs(moretrees.oak_biome, "oak")) +minetest.register_decoration(translate_biome_defs(moretrees.sequoia_biome, "sequoia")) +minetest.register_decoration(translate_biome_defs(moretrees.palm_biome, "palm")) +minetest.register_decoration(translate_biome_defs(moretrees.date_palm_biome, "date_palm", 1)) +minetest.register_decoration(translate_biome_defs(moretrees.date_palm_biome_2, "date_palm", 2)) +minetest.register_decoration(translate_biome_defs(moretrees.cedar_biome, "cedar")) +minetest.register_decoration(translate_biome_defs(moretrees.rubber_tree_biome, "rubber_tree")) +minetest.register_decoration(translate_biome_defs(moretrees.willow_biome, "willow")) +minetest.register_decoration(translate_biome_defs(moretrees.birch_biome, "birch")) +minetest.register_decoration(translate_biome_defs(moretrees.spruce_biome, "spruce")) +if minetest.get_modpath("default") then + minetest.register_decoration(translate_biome_defs(moretrees.jungletree_biome, "jungletree")) +end +minetest.register_decoration(translate_biome_defs(moretrees.fir_biome, "fir", 1)) +if minetest.get_modpath("snow") then + minetest.register_decoration(translate_biome_defs(moretrees.fir_biome_snow, "fir", 2)) +end +minetest.register_decoration(translate_biome_defs(moretrees.poplar_biome, "poplar", 1)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_biome_2, "poplar", 2)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_biome_3, "poplar", 3)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_small_biome, "poplar_small", 4)) +minetest.register_decoration(translate_biome_defs(moretrees.poplar_small_biome_2, "poplar_small", 5)) + +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +minetest.register_on_mods_loaded(function() + for k, v in pairs(deco_ids) do + deco_ids[k] = minetest.get_decoration_id(v) + end + minetest.set_gen_notify("decoration", deco_ids) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + for _, id in pairs(deco_ids) do + local deco_locations = g["decoration#" .. id] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + local timer = minetest.get_node_timer({x=pos.x, y=pos.y+1, z=pos.z}) + timer:start(math.random(2,10)) + end +end) + +-- Code to spawn a birch tree + +function moretrees.grow_birch(pos) + minetest.swap_node(pos, {name = "air"}) + if math.random(1,2) == 1 then + minetest.spawn_tree(pos, moretrees.birch_model1) + else + minetest.spawn_tree(pos, moretrees.birch_model2) + end +end + +-- Code to spawn a spruce tree + +function moretrees.grow_spruce(pos) + minetest.swap_node(pos, {name = "air"}) + if math.random(1,2) == 1 then + minetest.spawn_tree(pos, moretrees.spruce_model1) + else + minetest.spawn_tree(pos, moretrees.spruce_model2) + end +end + +-- Code to spawn jungle trees + +moretrees.jt_axiom1 = "FFFA" +moretrees.jt_rules_a1 = "FFF[&&-FBf[&&&Ff]^^^Ff][&&+FBFf[&&&FFf]^^^Ff][&&---FBFf[&&&Ff]^^^Ff][&&+++FBFf[&&&Ff]^^^Ff]F/A" +moretrees.jt_rules_b1 = "[-Ff&f][+Ff&f]B" + +moretrees.jt_axiom2 = "FFFFFA" +-- luacheck: no max line length +moretrees.jt_rules_a2 = "FFFFF[&&-FFFBF[&&&FFff]^^^FFf][&&+FFFBFF[&&&FFff]^^^FFf][&&---FFFBFF[&&&FFff]^^^FFf][&&+++FFFBFF[&&&FFff]^^^FFf]FF/A" +moretrees.jt_rules_b2 = "[-FFf&ff][+FFf&ff]B" + +moretrees.ct_rules_a1 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" +moretrees.ct_rules_b1 = "[-FBf][+FBf]" + +moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" +moretrees.ct_rules_b2 = "[-fB][+fB]" + +function moretrees.grow_jungletree(pos) + local r1 = math.random(2) + local r2 = math.random(3) + if r1 == 1 then + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" + else + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_yellow" + end + moretrees.jungletree_model.leaves2_chance = math.random(25, 75) + + if r2 == 1 then + moretrees.jungletree_model.trunk_type = "single" + moretrees.jungletree_model.iterations = 2 + moretrees.jungletree_model.axiom = moretrees.jt_axiom1 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a1 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b1 + elseif r2 == 2 then + moretrees.jungletree_model.trunk_type = "double" + moretrees.jungletree_model.iterations = 4 + moretrees.jungletree_model.axiom = moretrees.jt_axiom2 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 + elseif r2 == 3 then + moretrees.jungletree_model.trunk_type = "crossed" + moretrees.jungletree_model.iterations = 4 + moretrees.jungletree_model.axiom = moretrees.jt_axiom2 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 + end + + minetest.swap_node(pos, {name = "air"}) + local leaves = minetest.find_nodes_in_area( + {x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, + xcompat.materials.apple_leaves + ) + for leaf in ipairs(leaves) do + minetest.swap_node(leaves[leaf], {name = "air"}) + end + minetest.spawn_tree(pos, moretrees.jungletree_model) +end + +-- code to spawn fir trees + +function moretrees.grow_fir(pos) + if math.random(2) == 1 then + moretrees.fir_model.leaves="moretrees:fir_leaves" + else + moretrees.fir_model.leaves="moretrees:fir_leaves_bright" + end + if math.random(2) == 1 then + moretrees.fir_model.rules_a = moretrees.ct_rules_a1 + moretrees.fir_model.rules_b = moretrees.ct_rules_b1 + else + moretrees.fir_model.rules_a = moretrees.ct_rules_a2 + moretrees.fir_model.rules_b = moretrees.ct_rules_b2 + end + + moretrees.fir_model.iterations = 7 + moretrees.fir_model.random_level = 5 + + minetest.swap_node(pos, {name = "air"}) + local leaves = minetest.find_nodes_in_area( + {x = pos.x, y = pos.y, z = pos.z}, + {x = pos.x, y = pos.y+5, z = pos.z}, + xcompat.materials.apple_leaves + ) + for leaf in ipairs(leaves) do + minetest.swap_node(leaves[leaf], {name = "air"}) + end + minetest.spawn_tree(pos,moretrees.fir_model) +end + +-- same thing, but a smaller version that grows only in snow biomes + +function moretrees.grow_fir_snow(pos) + if math.random(2) == 1 then + moretrees.fir_model.leaves="moretrees:fir_leaves" + else + moretrees.fir_model.leaves="moretrees:fir_leaves_bright" + end + if math.random(2) == 1 then + moretrees.fir_model.rules_a = moretrees.ct_rules_a1 + moretrees.fir_model.rules_b = moretrees.ct_rules_b1 + else + moretrees.fir_model.rules_a = moretrees.ct_rules_a2 + moretrees.fir_model.rules_b = moretrees.ct_rules_b2 + end + + moretrees.fir_model.iterations = 2 + moretrees.fir_model.random_level = 2 + + minetest.swap_node(pos, {name = "air"}) + local leaves = minetest.find_nodes_in_area( + {x = pos.x, y = pos.y, z = pos.z}, + {x = pos.x, y = pos.y+5, z = pos.z}, + xcompat.materials.apple_leaves + ) + for leaf in ipairs(leaves) do + minetest.swap_node(leaves[leaf], {name = "air"}) + end + minetest.spawn_tree(pos,moretrees.fir_model) +end + +if moretrees.grow_legacy_saplings then + minetest.register_lbm({ + name = "moretrees:grow_ongen_saplings", + label = "Grow legacy ongen saplings", + nodenames = {"group:moretrees_ongen"}, + run_at_every_load = true, + action = function(pos) + minetest.log("info", "[moretrees] Starting growth timer for legacy ongen sapling at "..minetest.pos_to_string(pos, 0)) + minetest.get_node_timer(pos):start(math.random(2, 10)) + end + }) +end + +minetest.log("info", "[moretrees] Loading done") diff --git a/mods/moretrees/locale/moretrees.cs.tr b/mods/moretrees/locale/moretrees.cs.tr new file mode 100644 index 0000000..06a094d --- /dev/null +++ b/mods/moretrees/locale/moretrees.cs.tr @@ -0,0 +1,219 @@ +# textdomain: moretrees + + +### cocos_palm.lua ### + +Coconut=Kokos +Coconut Flower=Kokosový květ + +### crafts.lua ### + +Acorn Muffin=Žaludový muffin +Acorn Muffin batter=Těsto na žaludový muffin +Coconut Milk=Kokosové mléko +Date=Datle +Date & nut snack=Tyčinka z datlí a ořechů +Date-nut cake=Datlo-ořechový dort +Date-nut cake batter=Těsto na datlo-ořechový dort +Date-nut energy bar=Datlo-ořechová energetická tyčinka +Raw Coconut=Čerstvý kokos +Roasted Cedar Cone Nuts=Šiška +Roasted Fir Cone Nuts=Šiška +Roasted Spruce Cone Nuts=Šiška + +### date_palm.lua ### + +Date Flowers=Datlový květ +Date Stem=Stopka datle +Dates=Datle + +### node_defs.lua ### + +@1 (fast growth)=@1 (rychlý růst) +Acorn=Žalud +Apple Tree=Jabloň +Apple Tree Fence=Plot z dřeva jabloně +Apple Tree Fence Gate=Brána plotu z dřeva jabloně +Apple Tree Fence Rail=Madlo plotu z dřeva jabloně +Apple Tree Leaves=Listí jabloně +Apple Tree Planks=Jabloňová prkna +Apple Tree Planks Slab=Půlblok z jabloňových prken +Apple Tree Planks Stair=Schody z jabloňových prken +Apple Tree Sapling=Sazenice jabloně +Apple Tree Trunk=Kmen jabloně +Apple Tree Trunk Slab=Půlblok z kmene jabloně +Apple Tree Trunk Stair=Schody z kmene jabloně +Beech Tree=Buk +Beech Tree Fence=Plot z bukového dřeva +Beech Tree Fence Gate=Brána plotu z bukového dřeva +Beech Tree Fence Rail=Madlo plotu z bukového dřeva +Beech Tree Leaves=Listí buku +Beech Tree Planks=Buková prkna +Beech Tree Planks Slab=Půlblok z bukových prken +Beech Tree Planks Stair=Schody z bukových prken +Beech Tree Sapling=Sazenice buku +Beech Tree Trunk=Kmen buku +Beech Tree Trunk Slab=Půlblok z kmene buku +Beech Tree Trunk Stair=Schody z kmene buku +Birch Tree=Bříza +Birch Tree Fence=Plot z březového dřeva +Birch Tree Fence Gate=Brána plotu z březového dřeva +Birch Tree Fence Rail=Madlo plotu z březového dřeva +Birch Tree Leaves=Březové listí +Birch Tree Planks=Březová prkna +Birch Tree Planks Slab=Půlblok z březových prken +Birch Tree Planks Stair=Schody z březových prken +Birch Tree Sapling=Sazenice břízy +Birch Tree Trunk=Kmen břízy +Birch Tree Trunk Slab=Půlblok z kmene břízy +Birch Tree Trunk Stair=Schody z kmene břízy +Cedar Cone=Šiška cedru +Cedar Tree=Cedr +Cedar Tree Fence=Plot z cedrového dřeva +Cedar Tree Fence Gate=Brána plotu z cedrového dřeva +Cedar Tree Fence Rail=Madlo plotu z cedrového dřeva +Cedar Tree Leaves=Jehličí cedru +Cedar Tree Planks=Prkna z cedrového dřeva +Cedar Tree Planks Slab=Půlblok z prken z cedrového dřeva +Cedar Tree Planks Stair=Schody z prken z cedrového dřeva +Cedar Tree Sapling=Sazenice cedru +Cedar Tree Trunk=Kmen cedru +Cedar Tree Trunk Slab=Půlblok z kmene cedru +Cedar Tree Trunk Stair=Schody z kmene cedru +Date Palm Tree=Datlovník +Date Palm Tree Fence=Plot z dřeva datlovníku +Date Palm Tree Fence Gate=Brána plotu z dřeva datlovníku +Date Palm Tree Fence Rail=Madlo plotu z dřeva datlovníku +Date Palm Tree Leaves=Listí datlovníku +Date Palm Tree Planks=Prkna z dřeva datlovníku +Date Palm Tree Planks Slab=Půlblok z prken z dřeva datlovníku +Date Palm Tree Planks Stair=Schody z prken z dřeva datlovníku +Date Palm Tree Sapling=Sazenice datlovníku +Date Palm Tree Trunk=Kmen datlovníku +Date Palm Tree Trunk Slab=Půlblok z kmene datlovníku +Date Palm Tree Trunk Stair=Schody z kmene datlovníku +Douglas Fir=Douglaska +Douglas Fir Fence=Plot z dřeva douglasky +Douglas Fir Fence Gate=Brána plotu z dřeva douglasky +Douglas Fir Fence Rail=Madlo plotu z dřeva douglasky +Douglas Fir Leaves=Jehličí douglasky +Douglas Fir Leaves (Bright)=Listí douglasky (světlé) +Douglas Fir Planks=Prkna z dřeva douglasky +Douglas Fir Planks Slab=Půlblok z prken z dřeva douglasky +Douglas Fir Planks Stair=Schody z prken z dřeva douglasky +Douglas Fir Sapling=Sazenice douglasky +Douglas Fir Trunk=Kmen douglasky +Douglas Fir Trunk Slab=Půlblok z kmene douglasky +Douglas Fir Trunk Stair=Schody z kmene douglasky +Fir Cone=Šiška jedle +Giant Sequoia=Sekvoje +Giant Sequoia Fence=Sekvojový plot +Giant Sequoia Fence Gate=Brána sekvojového plotu +Giant Sequoia Fence Rail=Madlo sekvojového plotu +Giant Sequoia Leaves=Jehličí sekvoje +Giant Sequoia Planks=Sekvojová prkna +Giant Sequoia Planks Slab=Půlblok ze sekvojových prken +Giant Sequoia Planks Stair=Schody ze sekvojových prken +Giant Sequoia Sapling=Sazenice sekvoje +Giant Sequoia Trunk=Kmen sekvoje +Giant Sequoia Trunk Slab=Půlblok z kmene sekvoje +Giant Sequoia Trunk Stair=Schody z kmene sekvoje +Jungle Tree=Strom z džungle +Jungle Tree Fence=Plot ze stromu z džungle +Jungle Tree Fence Gate=Brána plotu z dřeva stromu z džungle +Jungle Tree Fence Rail=Madlo plotu z dřeva stromu z džungle +Jungle Tree Leaves=Listí stromu z džungle +Jungle Tree Leaves (@1)=Listí (@1) +Jungle Tree Planks=Prkna z dřeva ze stromu z džungle +Jungle Tree Planks Slab=Půlblok z prken z dřeva ze stromu z džungle +Jungle Tree Planks Stair=Schody z prken z dřeva ze stromu z džungle +Jungle Tree Sapling=Sazenice stromu z džungle +Jungle Tree Trunk=Kmen stromu z džungle +Jungle Tree Trunk Slab=Půlblok z kmene stromu z džungle +Jungle Tree Trunk Stair=Schody z kmene stromu z džungle +Oak Tree=Dub +Oak Tree Fence=Dubový plot +Oak Tree Fence Gate=Brána dubového plotu +Oak Tree Fence Rail=Madlo dubového plotu +Oak Tree Leaves=Dubové listí +Oak Tree Planks=Dubová prkna +Oak Tree Planks Slab=Půlblok z dubových prken +Oak Tree Planks Stair=Schody z dubových prken +Oak Tree Sapling=Sazenice dubu +Oak Tree Trunk=Kmen dubu +Oak Tree Trunk Slab=Půlblok z kmene dubu +Oak Tree Trunk Stair=Schody z kmene dubu +Palm Tree=Palma +Palm Tree Fence=Plot z palmy +Palm Tree Fence Gate=Brána plotu z palmového dřeva +Palm Tree Fence Rail=Madlo plotu z palmového dřeva +Palm Tree Leaves=Listí palmy +Palm Tree Planks=Palmová prkna +Palm Tree Planks Slab=Půlblok z palmových prken +Palm Tree Planks Stair=Schody z palmových prken +Palm Tree Sapling=Sazenice palmy +Palm Tree Trunk=Kmen palmy +Palm Tree Trunk Slab=Půlblok z kmene palmy +Palm Tree Trunk Stair=Schody z kmene palmy +Poplar Tree=Topol +Poplar Tree Fence=Plot z topolového dřeva +Poplar Tree Fence Gate=Brána plotu z topolového dřeva +Poplar Tree Fence Rail=Madlo plotu z topolového dřeva +Poplar Tree Leaves=Topolové listí +Poplar Tree Planks=Topolová prkna +Poplar Tree Planks Slab=Půlblok z topolových prken +Poplar Tree Planks Stair=Schody z topolových prken +Poplar Tree Sapling=Sazenice topolu +Poplar Tree Trunk=Kmen topolu +Poplar Tree Trunk Slab=Půlblok z kmene topolu +Poplar Tree Trunk Stair=Schody z kmene topolu +Red=červená +Rubber Tree=Kaučukovník +Rubber Tree Fence=Plot z kaučukovníku +Rubber Tree Fence Gate=Brána plotu z kaučukovníku +Rubber Tree Fence Rail=Madlo plotu z kaučukovníku +Rubber Tree Leaves=Listí kaučukovníku +Rubber Tree Planks=Prkna z kaučukovníku +Rubber Tree Planks Slab=Půlblok z prken z kaučukovníku +Rubber Tree Planks Stair=Schody z prken z kaučukovníku +Rubber Tree Sapling=Sazenice kaučukovníku +Rubber Tree Trunk=Kmen kaučukovníku +Rubber Tree Trunk (Empty)=Kmen kaučukovníku (prázdný) +Rubber Tree Trunk Slab=Půlblok z kmene kaučukovníku +Rubber Tree Trunk Stair=Schody z kmene kaučukovníku +Small poplar Tree Sapling=Sazenice kaučukovníku +Spruce Cone=Šiška smrku +Spruce Tree=Smrk +Spruce Tree Fence=Smrkový plot +Spruce Tree Fence Gate=Brána smrkového plotu +Spruce Tree Fence Rail=Madlo smrkového plotu +Spruce Tree Leaves=Smrkové jehličí +Spruce Tree Planks=Smrková prkna +Spruce Tree Planks Slab=Půlblok ze smrkových prken +Spruce Tree Planks Stair=Schody ze smrkových prken +Spruce Tree Sapling=Sazenice smrku +Spruce Tree Trunk=Kmen smrku +Spruce Tree Trunk Slab=Půlblok z kmene smrku +Spruce Tree Trunk Stair=Schody z kmene smrku +Willow Tree=Vrba +Willow Tree Fence=Plot z dřeva vrby +Willow Tree Fence Gate=Brána plotu z dřeva vrby +Willow Tree Fence Rail=Madlo plotu z dřeva vrby +Willow Tree Leaves=Listí vrby +Willow Tree Planks=Prkna z vrby +Willow Tree Planks Slab=Půlblok z prken z vrby +Willow Tree Planks Stair=Schody z prken z vrby +Willow Tree Sapling=Sazenice vrby +Willow Tree Trunk=Kmen vrby +Willow Tree Trunk Slab=Půlblok z kmene vrby +Willow Tree Trunk Stair=Schody z kmene vrby +Yellow=Žlutá + +# init.lua +Sapling=Sazenice +Tree=Strom +Wooden Planks=Dřevěná prkna +Leaves=Listí +Wooden Fence=Dřevěný plot +Wooden Fence Rail=Madlo dřevěného plotu +Wooden Fence Gate=Brána dřevěného plotu diff --git a/mods/moretrees/locale/moretrees.de.tr b/mods/moretrees/locale/moretrees.de.tr new file mode 100644 index 0000000..844761c --- /dev/null +++ b/mods/moretrees/locale/moretrees.de.tr @@ -0,0 +1,220 @@ +# textdomain: moretrees +# Translation by Xanthin, heavygale and Wuzzy + + +### cocos_palm.lua ### + +Coconut=Kokosnuss +Coconut Flower=Kokosnussblüte + +### crafts.lua ### + +Acorn Muffin=Eichelmuffin +Acorn Muffin batter=Eichelmuffinteig +Coconut Milk=Kokosnussmilch +Date=Dattel +Date & nut snack=Dattel-und-Nuss-Snack +Date-nut cake=Dattel-Nuss-Kuchen +Date-nut cake batter=Dattel-Nuss-Kuchenteig +Date-nut energy bar=Dattel-Nuss-Energieriegel +Raw Coconut=Kokosnussfleisch +Roasted Cedar Cone Nuts=Geröstete Zedernzapfenkerne +Roasted Fir Cone Nuts=Geröstete Tannenzapfenkerne +Roasted Spruce Cone Nuts=Geröstete Fichtenzapfenkerne + +### date_palm.lua ### + +Date Flowers=Dattelblüten +Date Stem=Dattelstängel +Dates=Datteln + +### node_defs.lua ### + +@1 (fast growth)=@1 (schnelles Wachstum) +Acorn=Eichel +Apple Tree=Apfelbaum +Apple Tree Fence=Apfelbaumzaun +Apple Tree Fence Gate=Apfelbaumzauntor +Apple Tree Fence Rail=Apfelbaumzaungeländer +Apple Tree Leaves=Apfelbaumblätter +Apple Tree Planks=Apfelbaumplanken +Apple Tree Planks Slab=Apfelbaumplankenplatte +Apple Tree Planks Stair=Apfelbaumplankentreppe +Apple Tree Sapling=Apfelbaumsetzling +Apple Tree Trunk=Apfelbaumstamm +Apple Tree Trunk Slab=Apfelbaumstammplatte +Apple Tree Trunk Stair=Apfelbaumstammtreppe +Beech Tree=Buche +Beech Tree Fence=Buchenholzzaun +Beech Tree Fence Gate=Buchenholzzaunzor +Beech Tree Fence Rail=Buchenholzzaungeländer +Beech Tree Leaves=Buchenblätter +Beech Tree Planks=Buchenholzplanken +Beech Tree Planks Slab=Buchenholzplatte +Beech Tree Planks Stair=Buchenholztreppe +Beech Tree Sapling=Buchensetzling +Beech Tree Trunk=Buchenstamm +Beech Tree Trunk Slab=Buchenstammplatte +Beech Tree Trunk Stair=Buchenstammtreppe +Birch Tree=Birke +Birch Tree Fence=Birkenholzzaun +Birch Tree Fence Gate=Birkenholzzauntor +Birch Tree Fence Rail=Birkenholzzaungeländer +Birch Tree Leaves=Birkenblätter +Birch Tree Planks=Birkenplanken +Birch Tree Planks Slab=Birkenholzplatte +Birch Tree Planks Stair=Birkeholztreppe +Birch Tree Sapling=Birkensetzling +Birch Tree Trunk=Birkenstamm +Birch Tree Trunk Slab=Birkenstammplatte +Birch Tree Trunk Stair=Birkenstammtreppe +Cedar Cone=Zedernzapfen +Cedar Tree=Zeder +Cedar Tree Fence=Zedernholzzaun +Cedar Tree Fence Gate=Zedernholzzauntor +Cedar Tree Fence Rail=Zedernholzzaungeländer +Cedar Tree Leaves=Zederblätter +Cedar Tree Planks=Zedernholzplanken +Cedar Tree Planks Slab=Zedernholzplatte +Cedar Tree Planks Stair=Zedernholztreppe +Cedar Tree Sapling=Zedersetzling +Cedar Tree Trunk=Zederstamm +Cedar Tree Trunk Slab=Zederstammplatte +Cedar Tree Trunk Stair=Zederstammtreppe +Date Palm Tree=Dattelpalme +Date Palm Tree Fence=Dattelpalmenzaun +Date Palm Tree Fence Gate=Dattelpalmenzauntor +Date Palm Tree Fence Rail=Dattelpalmenzaungeländer +Date Palm Tree Leaves=Dattelpalmblätter +Date Palm Tree Planks=Dattelpalmenplanken +Date Palm Tree Planks Slab=Dattelpalmenplatte +Date Palm Tree Planks Stair=Dattelpalmentreppe +Date Palm Tree Sapling=Dattelpalmensetzling +Date Palm Tree Trunk=Dattelpalmenstamm +Date Palm Tree Trunk Slab=Dattelpalmenstammplatte +Date Palm Tree Trunk Stair=Dattelpalmenstammtreppe +Douglas Fir=Douglasie +Douglas Fir Fence=Douglasienzaun +Douglas Fir Fence Gate=Douglasienzauntor +Douglas Fir Fence Rail=Douglasienzaungeländer +Douglas Fir Leaves=Douglasiennadeln +Douglas Fir Leaves (Bright)=Douglasiennadeln (hell) +Douglas Fir Planks=Douglasienplanken +Douglas Fir Planks Slab=Douglasienplatte +Douglas Fir Planks Stair=Douglasientreppe +Douglas Fir Sapling=Douglasiensetzling +Douglas Fir Trunk=Douglasienstamm +Douglas Fir Trunk Slab=Douglasienstammplatte +Douglas Fir Trunk Stair=Douglasienstammtreppe +Fir Cone=Tannenzapfen +Giant Sequoia=Riesenmammutbaum +Giant Sequoia Fence=Riesenmammutbaumzaun +Giant Sequoia Fence Gate=Riesenmammutbaumzauntor +Giant Sequoia Fence Rail=Riesenmammutbaumzaungeländer +Giant Sequoia Leaves=Riesenmammutbaumblätter +Giant Sequoia Planks=Riesenmammutbaumplanken +Giant Sequoia Planks Slab=Riesenmammutbaumplatte +Giant Sequoia Planks Stair=Riesenmammutbaumtreppe +Giant Sequoia Sapling=Riesenmammutbaumsetzling +Giant Sequoia Trunk=Riesenmammutbaumstamm +Giant Sequoia Trunk Slab=Riesenmammutbaumstammplatte +Giant Sequoia Trunk Stair=Riesenmammutbaumstammtreppe +Jungle Tree=Dschungelbaum +Jungle Tree Fence=Dschungelbaumzaun +Jungle Tree Fence Gate=Dschungelbaumzauntor +Jungle Tree Fence Rail=Dschungelbaumzaungeländer +Jungle Tree Leaves=Dschungelbaumblätter +Jungle Tree Leaves (@1)=Dschungelbaumblätter (@1) +Jungle Tree Planks=Dschungelholzplanken +Jungle Tree Planks Slab=Dschungelholzplatte +Jungle Tree Planks Stair=Dschungelholztreppe +Jungle Tree Sapling=Dschungelbaumsetzling +Jungle Tree Trunk=Dschungelbaumstamm +Jungle Tree Trunk Slab=Dschungelbaumstammplatte +Jungle Tree Trunk Stair=Dschungelbaumstammtreppe +Oak Tree=Eiche +Oak Tree Fence=Eichenholzzaun +Oak Tree Fence Gate=Eichenholzzauntor +Oak Tree Fence Rail=Eichenholzzaungeländer +Oak Tree Leaves=Eichenblätter +Oak Tree Planks=Eichenplanken +Oak Tree Planks Slab=Eichenholzplatte +Oak Tree Planks Stair=Eichenholztreppe +Oak Tree Sapling=Eichensetzling +Oak Tree Trunk=Eichenstamm +Oak Tree Trunk Slab=Eichenstammplatte +Oak Tree Trunk Stair=Eichenstammtreppe +Palm Tree=Palme +Palm Tree Fence=Palmholzzaun +Palm Tree Fence Gate=Palmholzzauntor +Palm Tree Fence Rail=Palmholzzaungeländer +Palm Tree Leaves=Palmblätter +Palm Tree Planks=Palmenplanken +Palm Tree Planks Slab=Palmholzplatte +Palm Tree Planks Stair=Palmholztreppe +Palm Tree Sapling=Palmensetzling +Palm Tree Trunk=Palmenstamm +Palm Tree Trunk Slab=Palmenstammplatte +Palm Tree Trunk Stair=Palmenstammtreppe +Poplar Tree=Pappel +Poplar Tree Fence=Pappelholzzaun +Poplar Tree Fence Gate=Pappelholzzauntor +Poplar Tree Fence Rail=Pappelholzzaungeländer +Poplar Tree Leaves=Pappelblätter +Poplar Tree Planks=Pappelholzplanken +Poplar Tree Planks Slab=Pappelholzsplatte +Poplar Tree Planks Stair=Pappelholztreppe +Poplar Tree Sapling=Pappelsetzling +Poplar Tree Trunk=Pappelstamm +Poplar Tree Trunk Slab=Pappelstammplatte +Poplar Tree Trunk Stair=Pappelstammtreppe +Red=rot +Rubber Tree=Gummibaum +Rubber Tree Fence=Gummibaumzaun +Rubber Tree Fence Gate=Gummibaumzauntor +Rubber Tree Fence Rail=Gummibaumzaungeländer +Rubber Tree Leaves=Gummibaumblätter +Rubber Tree Planks=Gummibaumplanken +Rubber Tree Planks Slab=Gummibaumplatte +Rubber Tree Planks Stair=Gummibaumtreppe +Rubber Tree Sapling=Gummibaumsetzling +Rubber Tree Trunk=Gummibaumstamm +Rubber Tree Trunk (Empty)=Gummibaumstamm (leer) +Rubber Tree Trunk Slab=Gummibaumstammplatte +Rubber Tree Trunk Stair=Gummibaumstammtreppe +Small poplar Tree Sapling=Kleiner Pappelsetzling +Spruce Cone=Fichtenzapfen +Spruce Tree=Fichte +Spruce Tree Fence=Fichtenholzzaun +Spruce Tree Fence Gate=Fichtenholzzaun +Spruce Tree Fence Rail=Fichtenholzzaungeländer +Spruce Tree Leaves=Fichtennadeln +Spruce Tree Planks=Fichtenplanken +Spruce Tree Planks Slab=Fichtenholzplatte +Spruce Tree Planks Stair=Fichtenholztreppe +Spruce Tree Sapling=Fichtensetzling +Spruce Tree Trunk=Fichtenstamm +Spruce Tree Trunk Slab=Fichtenstammplatte +Spruce Tree Trunk Stair=Fichtenstammtreppe +Willow Tree=Weide +Willow Tree Fence=Weidenholzzaun +Willow Tree Fence Gate=Weidenholzzauntor +Willow Tree Fence Rail=Weidenholzzaungeländer +Willow Tree Leaves=Weidenblätter +Willow Tree Planks=Weidenplanken +Willow Tree Planks Slab=Weidenholzplatte +Willow Tree Planks Stair=Weidenholztreppe +Willow Tree Sapling=Weidensetzling +Willow Tree Trunk=Weidenstamm +Willow Tree Trunk Slab=Weidenstammplatte +Willow Tree Trunk Stair=Weidenstammtreppe +Yellow=gelb + +# init.lua +Sapling=Setzling +Tree=Baum +Wooden Planks=Holzplanken +Leaves=Blätter +Wooden Fence=Holzzaun +Wooden Fence Rail=Holzzaungeländer +Wooden Fence Gate=Holzzauntor diff --git a/mods/moretrees/locale/moretrees.es.tr b/mods/moretrees/locale/moretrees.es.tr new file mode 100644 index 0000000..e758392 --- /dev/null +++ b/mods/moretrees/locale/moretrees.es.tr @@ -0,0 +1,220 @@ +# textdomain: moretrees +# Translation by Carlos Barraza, improvements by David Leal. + + +### cocos_palm.lua ### + +Coconut=Coco +Coconut Flower=Flor de Coco + +### crafts.lua ### + +Acorn Muffin=Mollete de Bellota +Acorn Muffin batter= Masa de Mollete de Bellota +Coconut Milk=Leche de Coco +Date=Datilera +Date & nut snack=Datilera y Nueces +Date-nut cake=Pastel de Datilera +Date-nut cake batter=Pasta de torta de Datilera +Date-nut energy bar=Barra energetica de Datilera +Raw Coconut=Coco Crudo +Roasted Cedar Cone Nuts=Coco de Álamo Tostado +Roasted Fir Cone Nuts=Cono de Abeto Tostado +Roasted Spruce Cone Nuts=Cono de Picea Tostado + +### date_palm.lua ### + +Date Flowers=Flores de Datilera +Date Stem=Tallo de Datilera +Dates=Datilera + +### node_defs.lua ### + +@1 (fast growth)=@1 (crecimiento rápido) +Acorn=Bellota +Apple Tree=Árbol de manzana +Apple Tree Fence=Valla de manzano +Apple Tree Fence Gate=Puerta de Valla de Manzano +Apple Tree Fence Rail=Riel de Valla de Manzano +Apple Tree Leaves=Hojas de Árbol de Manzana +Apple Tree Planks=Madera de Árbol de Manzana +Apple Tree Planks Slab=Losa de Tablones de Manzano +Apple Tree Planks Stair=Escalera de Tablones de Manzano +Apple Tree Sapling=Retoño de Árbol de Manzana +Apple Tree Trunk=Tronco de Árbol de Manzana +Apple Tree Trunk Slab=Losa de Tronco de Manzano +Apple Tree Trunk Stair=Escalera de Tronco de Manzano +Beech Tree=Haya +Beech Tree Fence=Valla de Haya +Beech Tree Fence Gate=Puerta de Valla de Haya +Beech Tree Fence Rail=Riel de Valla de Haya +Beech Tree Leaves=Hojas de Arbol de Haya +Beech Tree Planks=Madera de Arbol de Haya +Beech Tree Planks Slab=Losa de Tablones de Haya +Beech Tree Planks Stair=Escalera de Tablones de Haya +Beech Tree Sapling=Retoño de Árbol de Haya +Beech Tree Trunk=Tronco de Árbol de Haya +Beech Tree Trunk Slab=Losa de Tronco de Haya +Beech Tree Trunk Stair=Escalera de Tronco de Haya +Birch Tree=Abedul +Birch Tree Fence=Valla de Abedul +Birch Tree Fence Gate=Puerta de Valla de Abedul +Birch Tree Fence Rail=Riel de Valla de Abedul +Birch Tree Leaves=Hojas de Arbol de Abedul +Birch Tree Planks=Madera de Arbol de Abedul +Birch Tree Planks Slab=Losa de Tablones de Abedul +Birch Tree Planks Stair=Escalera de Tablones de Abedul +Birch Tree Sapling=Retoño de Árbol de Abedul +Birch Tree Trunk=Tronco de Árbol de Abedul +Birch Tree Trunk Slab=Losa de Tronco de Abedul +Birch Tree Trunk Stair=Escalera de Tronco de Abedul +Cedar Cone=Coco de Álamo +Cedar Tree=Árbol de Cedro +Cedar Tree Fence=Valla de Árbol de Cedro +Cedar Tree Fence Gate=Puerta de Valla de Árbol de Cedro +Cedar Tree Fence Rail=Riel de Valla de Árbol de Cedro +Cedar Tree Leaves=Hojas de Árbol de Cedro +Cedar Tree Planks=Madera de Árbol de Cedro +Cedar Tree Planks Slab=Losa de Tablones de Árbol de Cedro +Cedar Tree Planks Stair=Escalera de Tablones de Árbol de Cedro +Cedar Tree Sapling=Retoño de Árbol de Cedro +Cedar Tree Trunk=Tronco de Árbol de Cedro +Cedar Tree Trunk Slab=Losa de Tronco de Árbol de Cedro +Cedar Tree Trunk Stair=Escalera de Tronco de Árbol de Cedro +Date Palm Tree=Palmera Datilera +Date Palm Tree Fence=Valla de Palmera Datilera +Date Palm Tree Fence Gate=Puerta de Valla de Palmera Datilera +Date Palm Tree Fence Rail=Riel de Valla de Palmera Datilera +Date Palm Tree Leaves=Hojas de Palmera Datilera +Date Palm Tree Planks=Madera de Palmera Datilera +Date Palm Tree Planks Slab=Losa de Tablones de Palmera Datilera +Date Palm Tree Planks Stair=Escalera de Tablones de Palmera Datilera +Date Palm Tree Sapling=Retoño de Palmera Datilera +Date Palm Tree Trunk=Tronco de Palmera Datilera +Date Palm Tree Trunk Slab=Losa de Tronco de Palmera Datilera +Date Palm Tree Trunk Stair=Escalera de Tronco de Palmera Datilera +Douglas Fir=Árbol de Abeto de Douglas +Douglas Fir Fence=Valla de Árbol de Abeto de Douglas +Douglas Fir Fence Gate=Puerta de Valla de Árbol de Abeto de Douglas +Douglas Fir Fence Rail=Riel de Valla de Árbol de Abeto de Douglas +Douglas Fir Leaves=Hojas de Árbol de Abeto de Douglas +Douglas Fir Leaves (Bright)=Hojas de Árbol de Abeto de Douglas (Brillante) +Douglas Fir Planks=Madera de Árbol de Abeto de Douglas +Douglas Fir Planks Slab=Losa de Tablones de Árbol de Abeto de Douglas +Douglas Fir Planks Stair=Escalera de Tablones de Árbol de Abeto de Douglas +Douglas Fir Sapling=Retoño de Árbol de Abeto de Douglas +Douglas Fir Trunk=Tronco de Árbol de Abeto de Douglas +Douglas Fir Trunk Slab=Losa de Tronco de Árbol de Abeto de Douglas +Douglas Fir Trunk Stair=Escalera de Tronco de Árbol de Abeto de Douglas +Fir Cone=Coco de Abeto +Giant Sequoia=Secuoya Gigante +Giant Sequoia Fence=Valla de Secuoya Gigante +Giant Sequoia Fence Gate=Puerta de Valla de Secuoya Gigante +Giant Sequoia Fence Rail=Riel de Valla de Secuoya Gigante +Giant Sequoia Leaves=Hojas de Secuoya Gigante +Giant Sequoia Planks=Madera de Secuoya Gigante +Giant Sequoia Planks Slab=Losa de Tablones de Secuoya Gigante +Giant Sequoia Planks Stair=Escalera de Tablones de Secuoya Gigante +Giant Sequoia Sapling=Retoño de Árbol de Secuoya Gigante +Giant Sequoia Trunk=Tronco de Secuoya Gigante +Giant Sequoia Trunk Slab=Losa de Tronco de Secuoya Gigante +Giant Sequoia Trunk Stair=Escalera de Tronco de Secuoya Gigante +Jungle Tree=Árbol de la Selva +Jungle Tree Fence=Valla de Árbol de la Selva +Jungle Tree Fence Gate=Puerta de Valla de Árbol de la Selva +Jungle Tree Fence Rail=Riel de Valla de Árbol de la Selva +Jungle Tree Leaves=Hojas de Árbol de la Selva +Jungle Tree Leaves (@1)=Hojas de Árbol de la Selva (@1) +Jungle Tree Planks=Madera de Árbol de la Selva +Jungle Tree Planks Slab=Losa de Tablones de Árbol de la Selva +Jungle Tree Planks Stair=Escalera de Tablones de Árbol de la Selva +Jungle Tree Sapling=Retoño de Árbol de la Selva +Jungle Tree Trunk=Tronco de Árbol de Árbol de la Selva +Jungle Tree Trunk Slab=Losa de Tronco de Árbol de la Selva +Jungle Tree Trunk Stair=Escalera de Tronco de Árbol de la Selva +Oak Tree=Árbol de Roble +Oak Tree Fence=Valla de Árbol de Roble +Oak Tree Fence Gate=Puerta de Valla de Árbol de Roble +Oak Tree Fence Rail=Riel de Valla de Árbol de Roble +Oak Tree Leaves=Hojas de Árbol de Roble +Oak Tree Planks=Madera de Árbol de Roble +Oak Tree Planks Slab=Losa de Tablones de Árbol de Roble +Oak Tree Planks Stair=Escalera de Tablones de Árbol de Roble +Oak Tree Sapling=Retoño de Árbol de Roble +Oak Tree Trunk=Tronco de Árbol de Roble +Oak Tree Trunk Slab=Losa de Tronco de Árbol de Roble +Oak Tree Trunk Stair=Escalera de Tronco de Árbol de Roble +Palm Tree=Palmera +Palm Tree Fence=Valla de Palmera +Palm Tree Fence Gate=Puerta de Valla de Palmera +Palm Tree Fence Rail=Riel de Valla de Palmera +Palm Tree Leaves=Hojas de Palmera +Palm Tree Planks=Madera de Palmera +Palm Tree Planks Slab=Losa de Tablones de Palmera +Palm Tree Planks Stair=Escalera de Tablones de Palmera +Palm Tree Sapling=Retoño de Palmera +Palm Tree Trunk=Tronco de Palmera +Palm Tree Trunk Slab=Losa de Troncos de Palmera +Palm Tree Trunk Stair=Escalera de Troncos de Palmera +Poplar Tree=Árbol de Alamo +Poplar Tree Fence=Valla de Árbol de Alamo +Poplar Tree Fence Gate=Puerta de Valla de Árbol de Alamo +Poplar Tree Fence Rail=Riel de Valla de Árbol de Alamo +Poplar Tree Leaves=Hojas de Arbol de Alamo +Poplar Tree Planks=Madera de Árbol de Alamo +Poplar Tree Planks Slab=Losa de Tablones de Árbol de Alamo +Poplar Tree Planks Stair=Escalera de Tablones de Árbol de Alamo +Poplar Tree Sapling=Retoño de Árbol de Alamo +Poplar Tree Trunk=Tronco de Árbol de Alamo +Poplar Tree Trunk Slab=Losa de Tronco de Árbol de Alamo +Poplar Tree Trunk Stair=Escalera de Tronco de Árbol de Alamo +Red=Rojo +Rubber Tree=Árbol del Caucho +Rubber Tree Fence=Valla de Árbol del Caucho +Rubber Tree Fence Gate=Puerta de Valla de Árbol del Caucho +Rubber Tree Fence Rail=Riel de Valla de Árbol del Caucho +Rubber Tree Leaves=Hojas de Árbol de Árbol del Caucho +Rubber Tree Planks=Madera de Árbol de Árbol del Caucho +Rubber Tree Planks Slab=Losa de Tablones de Árbol del Caucho +Rubber Tree Planks Stair=Escalera de Tablones de Árbol del Caucho +Rubber Tree Sapling=Retoño de Árbol de Árbol del Caucho +Rubber Tree Trunk=Tronco de Árbol de Árbol del Caucho +Rubber Tree Trunk (Empty)=Tronco de Árbol del Caucho (Vacío) +Rubber Tree Trunk Slab=Losa de Tronco de Árbol del Caucho +Rubber Tree Trunk Stair=Escalera de Tronco de Árbol del Caucho +Small poplar Tree Sapling=Pequeño Retoño de Álamo +Spruce Cone=Coco de Picea +Spruce Tree=Árbol de Abeto +Spruce Tree Fence=Valla de Árbol de Abeto +Spruce Tree Fence Gate=Puerta de Valla de Árbol de Abeto +Spruce Tree Fence Rail=Riel de Valla de Árbol de Abeto +Spruce Tree Leaves=Hojas de Árbol de Abeto +Spruce Tree Planks=Madera de Árbol de Abeto +Spruce Tree Planks Slab=Losa de Tablones de Árbol de Abeto +Spruce Tree Planks Stair=Escalera de Tablones de Árbol de Abeto +Spruce Tree Sapling=Retoño de Árbol de Abeto +Spruce Tree Trunk=Tronco de Árbol de Abeto +Spruce Tree Trunk Slab=Losa de Tronco de Árbol de Abeto +Spruce Tree Trunk Stair=Escalera de Tronco de Árbol de Abeto +Willow Tree=Árbol de Sauce +Willow Tree Fence=Valla de Árbol de Sauce +Willow Tree Fence Gate=Puerta de Valla de Árbol de Sauce +Willow Tree Fence Rail=Riel de Valla de Árbol de Sauce +Willow Tree Leaves=Hojas de Árbol de Sauce +Willow Tree Planks=Madera de Árbol de Sauce +Willow Tree Planks Slab=Losa de Tablones de Árbol de Sauce +Willow Tree Planks Stair=Escalera de Tablones de Árbol de Sauce +Willow Tree Sapling=Retoño de Árbol de Sauce +Willow Tree Trunk=Tronco de Árbol de Sauce +Willow Tree Trunk Slab=Losa de Tronco de Árbol de Sauce +Willow Tree Trunk Stair=Escalera de Tronco de Árbol de Sauce +Yellow=Amarillo + +# init.lua +Sapling=Retoño +Tree=Árbol +Wooden Planks=Tablones +Leaves=Hojas +Wooden Fence=Valla +Wooden Fence Rail=Riel de Valla +Wooden Fence Gate=Puerta de Valla diff --git a/mods/moretrees/locale/moretrees.fr.tr b/mods/moretrees/locale/moretrees.fr.tr new file mode 100644 index 0000000..d03d7ab --- /dev/null +++ b/mods/moretrees/locale/moretrees.fr.tr @@ -0,0 +1,220 @@ +# textdomain: moretrees +# Translation by Yoan31 and Louis Royer + + +### cocos_palm.lua ### + +Coconut=Noix de coco +Coconut Flower=Fleur de coco + +### crafts.lua ### + +Acorn Muffin=Muffins au gland +Acorn Muffin batter=Pate à muffins au Gland +Coconut Milk=Lait de coco +Date=Datte +Date & nut snack=Collation aux dattes et aux noix +Date-nut cake=Gâteau datte-noix +Date-nut cake batter=Pâte à gâteau datte-noix +Date-nut energy bar=Barre énergétique datte-noix +Raw Coconut=Noix de coco crue +Roasted Cedar Cone Nuts=Noix de pomme de pin roties +Roasted Fir Cone Nuts=Noix de cône de sapin roties +Roasted Spruce Cone Nuts=Noix de cône de sapin roties + +### date_palm.lua ### + +Date Flowers=Fleurs de datte +Date Stem=Tige de datte +Dates=Dattes + +### node_defs.lua ### + +@1 (fast growth)=@1 (croissance rapide) +Acorn=Gland +Apple Tree=Pommier +Apple Tree Fence=Barrière en bois de pommier +Apple Tree Fence Gate=Porte de clôture en bois de pommier +Apple Tree Fence Rail=Clôture en bois de pommier +Apple Tree Leaves=Feuilles de pommier +Apple Tree Planks=Planches de pommier +Apple Tree Planks Slab=Dalle en bois de pommier +Apple Tree Planks Stair=Escaliers en bois de pommier +Apple Tree Sapling=Pousse d'arbre de pommier +Apple Tree Trunk=Tronc d'arbre de pommier +Apple Tree Trunk Slab=Dalle en tronc de pommier +Apple Tree Trunk Stair=Escalier en tronc de pommier +Beech Tree=Hêtre +Beech Tree Fence=Barrière en bois de hêtre +Beech Tree Fence Gate=Porte de clôture en bois de hêtre +Beech Tree Fence Rail=Clôture en bois de hêtre +Beech Tree Leaves=Feuilles de hêtre +Beech Tree Planks=Planches de hêtre +Beech Tree Planks Slab=Dalle en bois de hêtre +Beech Tree Planks Stair=Escalier en bois de hêtre +Beech Tree Sapling=Pousse d'arbre de hêtre +Beech Tree Trunk=Tronc d'arbre de hêtre +Beech Tree Trunk Slab=Dalle en tronc de hêtre +Beech Tree Trunk Stair=Escalier en tronc de hêtre +Birch Tree=Bouleau +Birch Tree Fence=Barrière en bois de bouleau +Birch Tree Fence Gate=Porte de clôture en bois de bouleau +Birch Tree Fence Rail=Clôture en bois de bouleau +Birch Tree Leaves=Feuilles de bouleau +Birch Tree Planks=Planches d'arbre de bouleau +Birch Tree Planks Slab=Dalle en bois de bouleau +Birch Tree Planks Stair=Escalier en bois de bouleau +Birch Tree Sapling=Pousse d'arbre de bouleau +Birch Tree Trunk=Tronc d'arbre de bouleau +Birch Tree Trunk Slab=Dalle en tronc de bouleau +Birch Tree Trunk Stair=Escalier en tronc de bouleau +Cedar Cone=Pomme de pin +Cedar Tree=Pin +Cedar Tree Fence=Barrière en bois de pin +Cedar Tree Fence Gate=Porte de clôture en bois de pin +Cedar Tree Fence Rail=Clôture en bois de pin +Cedar Tree Leaves=Feuilles de pin +Cedar Tree Planks=Planches d'arbre de pin +Cedar Tree Planks Slab=Dalle en bois de pin +Cedar Tree Planks Stair=Escalier en bois de pin +Cedar Tree Sapling=Pousse d'arbre de pin +Cedar Tree Trunk=Tronc d'arbre de pin +Cedar Tree Trunk Slab=Dalle en tronc de pin +Cedar Tree Trunk Stair=Escalier en tronc de pin +Date Palm Tree=Dattier +Date Palm Tree Fence=Barrière en bois de dattier +Date Palm Tree Fence Gate=Porte de clôture en bois de dattier +Date Palm Tree Fence Rail=Clôture en bois de dattier +Date Palm Tree Leaves=Feuille de dattier +Date Palm Tree Planks=Planches de dattier +Date Palm Tree Planks Slab=Dalle en bois de dattier +Date Palm Tree Planks Stair=Escalier en bois de dattier +Date Palm Tree Sapling=Pousse de dattier +Date Palm Tree Trunk=Tronc de dattier +Date Palm Tree Trunk Slab=Dalle en tronc de dattier +Date Palm Tree Trunk Stair=Escalier en tronc de dattier +Douglas Fir=Sapin de Douglas +Douglas Fir Fence=Barrière en bois de sapin de Douglas +Douglas Fir Fence Gate=Porte de clôture en bois de sapin de Douglas +Douglas Fir Fence Rail=Clôture en bois de sapin de Douglas +Douglas Fir Leaves=Feuilles de sapin de Douglas +Douglas Fir Leaves (Bright)=Feuille de sapin de Douglas (brillant) +Douglas Fir Planks=Planches de sapin de Douglas +Douglas Fir Planks Slab=Dalle en bois de sapin de Douglas +Douglas Fir Planks Stair=Escalier en bois de sapin de Douglas +Douglas Fir Sapling=Pousse de sapin de Douglas +Douglas Fir Trunk=Tronc de sapin de Douglas +Douglas Fir Trunk Slab=Dalle en tronc de sapin de Douglas +Douglas Fir Trunk Stair=Escalier en tronc de sapin de Douglas +Fir Cone=Pomme de sapin +Giant Sequoia=Séquoia géant +Giant Sequoia Fence=Barrière en bois de séquoia géant +Giant Sequoia Fence Gate=Porte de clôture en bois de séquoia géant +Giant Sequoia Fence Rail=Clôture en bois de séquoia géant +Giant Sequoia Leaves=Feuilles de séquoia géant +Giant Sequoia Planks=Planches de séquoia géant +Giant Sequoia Planks Slab=Dalle en bois de séquoia géant +Giant Sequoia Planks Stair=Escalier en bois de séquoia géant +Giant Sequoia Sapling=Pousse de séquoia géant +Giant Sequoia Trunk=Tronc de séquoia géant +Giant Sequoia Trunk Slab=Dalle en tronc de séquoia géant +Giant Sequoia Trunk Stair=Escalier en tronc de séquoia géant +Jungle Tree=Arbre de la jungle +Jungle Tree Fence=Barrière en bois d'arbre de la jungle +Jungle Tree Fence Gate=Porte de clôture en bois d'arbre de la jungle +Jungle Tree Fence Rail=Clôture en bois d'arbre de la jungle +Jungle Tree Leaves=Feuilles d'arbre de la jungle +Jungle Tree Leaves (@1)=Feuilles d'arbre de la jungle (@1) +Jungle Tree Planks=Planches d'arbre de la jungle +Jungle Tree Planks Slab=Dalle en bois d'arbre de la jungle +Jungle Tree Planks Stair=Escalier en bois d'arbre de la jungle +Jungle Tree Sapling=Pousse d'arbre de la jungle +Jungle Tree Trunk=Tronc d'arbre de la jungle +Jungle Tree Trunk Slab=Dalle en tronc d'arbre de la jungle +Jungle Tree Trunk Stair=Escalier en tronc d'arbre de la jungle +Oak Tree=Chêne +Oak Tree Fence=Barrière en bois de chêne +Oak Tree Fence Gate=Porte de clôture en bois de chêne +Oak Tree Fence Rail=Clôture en bois de chêne +Oak Tree Leaves=Feuilles de chêne +Oak Tree Planks=Planches de chêne +Oak Tree Planks Slab=Dalle en bois de chêne +Oak Tree Planks Stair=Escalier en bois de chêne +Oak Tree Sapling=Pousse d'arbre de chêne +Oak Tree Trunk=Tronc d'arbre de chêne +Oak Tree Trunk Slab=Dalle en tronc de chêne +Oak Tree Trunk Stair=Escalier en tronc de chêne +Palm Tree=Palmier +Palm Tree Fence=Barrière en bois de palmier +Palm Tree Fence Gate=Porte de clôture en bois de palmier +Palm Tree Fence Rail=Clôture en bois de palmier +Palm Tree Leaves=Feuilles de palmier +Palm Tree Planks=Planches de palmier +Palm Tree Planks Slab=Dalle en bois de palmier +Palm Tree Planks Stair=Escalier en bois de palmier +Palm Tree Sapling=Pousse d'arbre de palmier +Palm Tree Trunk=Tronc d'arbre de palmier +Palm Tree Trunk Slab=Dalle en tronc de palmier +Palm Tree Trunk Stair=Escalier en tronc de palmier +Poplar Tree=Peuplier +Poplar Tree Fence=Barrière en bois de peuplier +Poplar Tree Fence Gate=Porte de clôture en bois de peuplier +Poplar Tree Fence Rail=Clôture en bois de peuplier +Poplar Tree Leaves=Feuilles de peuplier +Poplar Tree Planks=Plances de peuplier +Poplar Tree Planks Slab=Dalle en bois de peuplier +Poplar Tree Planks Stair=Escalier en bois de peuplier +Poplar Tree Sapling=Pousse de peuplier +Poplar Tree Trunk=Tronc de peuplier +Poplar Tree Trunk Slab=Dalle en tronc de peuplier +Poplar Tree Trunk Stair=Escalier en tronc de peuplier +Red=rouge +Rubber Tree=Arbre à caoutchouc +Rubber Tree Fence=Barrière en bois d'arbre à caoutchouc +Rubber Tree Fence Gate=Porte de clôture en bois d'arbre à caoutchouc +Rubber Tree Fence Rail=Clôture en bois d'arbre à caoutchouc +Rubber Tree Leaves=Feuilles d'arbre à caoutchouc +Rubber Tree Planks=Planches d'arbre à caoutchouc +Rubber Tree Planks Slab=Dalle en bois d'arbre à caoutchouc +Rubber Tree Planks Stair=Escalier en bois d'arbre à caoutchouc +Rubber Tree Sapling=Pousse d'arbre à caoutchouc +Rubber Tree Trunk=Tronc d'arbre a caoutchouc +Rubber Tree Trunk (Empty)=Tronc d'arbre à caoutchouc (vide) +Rubber Tree Trunk Slab=Dalle en tronc d'arbre à caoutchouc +Rubber Tree Trunk Stair=Escalier en tronc d'arbre à caoutchouc +Small poplar Tree Sapling=Pousse de petit peuplier +Spruce Cone=Cône de sapin +Spruce Tree=Épicéa +Spruce Tree Fence=Barrière en bois d'épicéa +Spruce Tree Fence Gate=Porte de clôture en bois d'épicéa +Spruce Tree Fence Rail=Clôture en bois d'épicéa +Spruce Tree Leaves=Feuilles d'épicéa +Spruce Tree Planks=Planches d'arbre d'épicéa +Spruce Tree Planks Slab=Dalle en bois d'épicéa +Spruce Tree Planks Stair=Escalier en bois d'épicéa +Spruce Tree Sapling=Pousse d'arbre d'épicéa +Spruce Tree Trunk=Tronc d'arbre d'épicéa +Spruce Tree Trunk Slab=Dalle en tronc d'épicéa +Spruce Tree Trunk Stair=Escalier en tronc d'épicéa +Willow Tree=Saule +Willow Tree Fence=Barrière en bois de saule +Willow Tree Fence Gate=Porte de clôture en bois de saule +Willow Tree Fence Rail=Clôture en bois de saule +Willow Tree Leaves=Feuilles de saule +Willow Tree Planks=Planches de saule +Willow Tree Planks Slab=Dalle en bois de saule +Willow Tree Planks Stair=Escalier en bois de saule +Willow Tree Sapling=Pousse de saule +Willow Tree Trunk=Tronc d'arbre de saule +Willow Tree Trunk Slab=Dalle en tronc de saule +Willow Tree Trunk Stair=Escalier en tronc de saule +Yellow=jaune + +# init.lua +Sapling=Jeune Arbre +Tree=Arbre +Wooden Planks=Planches +Leaves=Feuilles +Wooden Fence=Barrière en bois +Wooden Fence Rail=Rail de clôture en bois +Wooden Fence Gate=Porte de clôture en bois diff --git a/mods/moretrees/locale/moretrees.ru.tr b/mods/moretrees/locale/moretrees.ru.tr new file mode 100644 index 0000000..fcebaa9 --- /dev/null +++ b/mods/moretrees/locale/moretrees.ru.tr @@ -0,0 +1,219 @@ +# textdomain: moretrees + + +### cocos_palm.lua ### + +Coconut=Кокос +Coconut Flower=Цветок кокоса + +### crafts.lua ### + +Acorn Muffin=Маффин с желудями +Acorn Muffin batter=Тесто для маффина с желудями +Coconut Milk=Кокосовое молоко +Date=Финик +Date & nut snack=Закуска из фиников и орехов +Date-nut cake=Финиково-ореховый пирог +Date-nut cake batter=Тесто для финиково-орехового пирога +Date-nut energy bar=Финиково-ореховый батончик +Raw Coconut=Сырой кокос +Roasted Cedar Cone Nuts=Жареные кедровые орешки +Roasted Fir Cone Nuts=Жареные орешки пихты +Roasted Spruce Cone Nuts=Жареные еловые орешки + +### date_palm.lua ### + +Date Flowers=Цветки фиников +Date Stem=Стебель финика +Dates=Финики + +### node_defs.lua ### + +@1 (fast growth)=@1 (бестрый рост) +Acorn=Желудь +Apple Tree=Яблоня +Apple Tree Fence=Яблоневый забор +Apple Tree Fence Gate=Яблоневые ворота +Apple Tree Fence Rail=Яблоневые перила +Apple Tree Leaves=Листья яблони +Apple Tree Planks=Яблоневые доски +Apple Tree Planks Slab=Яблоневые доски (плита) +Apple Tree Planks Stair=Яблоневые доски (ступени) +Apple Tree Sapling=Саженец яблони +Apple Tree Trunk=Ствол яблони +Apple Tree Trunk Slab=Ствол яблони (плита) +Apple Tree Trunk Stair=Ствол яблони (ступени) +Beech Tree=Бук +Beech Tree Fence=Забор из бука +Beech Tree Fence Gate=Ворота из бука +Beech Tree Fence Rail=Перила из бука +Beech Tree Leaves=Листья бука +Beech Tree Planks=Доски из бука +Beech Tree Planks Slab=Доски из бука (плита) +Beech Tree Planks Stair=Доски из бука (ступени) +Beech Tree Sapling=Саженец бука +Beech Tree Trunk=Ствол бука +Beech Tree Trunk Slab=Ствол бука (плита) +Beech Tree Trunk Stair=Ствол бука (ступени) +Birch Tree=Береза +Birch Tree Fence=Березовый забор +Birch Tree Fence Gate=Березовые ворота +Birch Tree Fence Rail=Березовые перила +Birch Tree Leaves=Березовые листья +Birch Tree Planks=Березовые доски +Birch Tree Planks Slab=Березовые доски (плита) +Birch Tree Planks Stair=Березовые доски (ступени) +Birch Tree Sapling=Саженец березы +Birch Tree Trunk=Ствол березы +Birch Tree Trunk Slab=Ствол березы (плита) +Birch Tree Trunk Stair=Ствол березы (ступени) +Cedar Cone=Кедровая шишка +Cedar Tree=Кедр +Cedar Tree Fence=Забор из кедра +Cedar Tree Fence Gate=Ворота из кедра +Cedar Tree Fence Rail=Перила из кедра +Cedar Tree Leaves=Кедровая хвоя +Cedar Tree Planks=Доски из кедра +Cedar Tree Planks Slab=Доски из кедра (плита) +Cedar Tree Planks Stair=Доски из кедра (ступени) +Cedar Tree Sapling=Саженец кедра +Cedar Tree Trunk=Ствол кедра +Cedar Tree Trunk Slab=Ствол кедра (плита) +Cedar Tree Trunk Stair=Ствол кедра (ступени) +Date Palm Tree=Финиковая пальма +Date Palm Tree Fence=Забор из финиковой пальмы +Date Palm Tree Fence Gate=Ворота из финиковой пальмы +Date Palm Tree Fence Rail=Перила из финиковой пальмы +Date Palm Tree Leaves=Листья финиковой пальмы +Date Palm Tree Planks=Доски из финиковой пальмы +Date Palm Tree Planks Slab=Доски из финиковой пальмы (плита) +Date Palm Tree Planks Stair=Доски из финиковой пальмы (ступени) +Date Palm Tree Sapling=Саженец финиковой пальмы +Date Palm Tree Trunk=Ствол финиковой пальмы +Date Palm Tree Trunk Slab=Ствол финиковой пальмы (плита) +Date Palm Tree Trunk Stair=Ствол финиковой пальмы (ступени) +Douglas Fir=Дугласова пихта +Douglas Fir Fence=Забор из дугласовой пихты +Douglas Fir Fence Gate=Ворота из дугласовой пихты +Douglas Fir Fence Rail=Перила из дугласовой пихты +Douglas Fir Leaves=Хвоя дугласовой пихты +Douglas Fir Leaves (Bright)=Листья дугласовой пихты (яркие) +Douglas Fir Planks=Доски из дугласовой пихты +Douglas Fir Planks Slab=Доски из дугласовой пихты (плита) +Douglas Fir Planks Stair=Доски из дугласовой пихты (ступени) +Douglas Fir Sapling=Саженец дугласовой пихты +Douglas Fir Trunk=Ствол дугласовой пихты +Douglas Fir Trunk Slab=Ствол дугласовой пихты (плита) +Douglas Fir Trunk Stair=Ствол дугласовой пихты (ступени) +Fir Cone=Пихтовая шишка +Giant Sequoia=Гигантская секвойя +Giant Sequoia Fence=Забор из гигантской секвойи +Giant Sequoia Fence Gate=Ворота из гигантской секвойи +Giant Sequoia Fence Rail=Перила из гигантской секвойи +Giant Sequoia Leaves=Хвоя гигантской секвойи +Giant Sequoia Planks=Доски из гигантской секвойи +Giant Sequoia Planks Slab=Доски из гигантской секвойи (плита) +Giant Sequoia Planks Stair=Доски из гигантской секвойи (ступени) +Giant Sequoia Sapling=Саженец гигантской секвойи +Giant Sequoia Trunk=Ствол гигантской секвойи +Giant Sequoia Trunk Slab=Ствол гигантской секвойи (плита) +Giant Sequoia Trunk Stair=Ствол гигантской секвойи (ступени) +Jungle Tree=Тропическое дерево +Jungle Tree Fence=Забор из тропического дерева +Jungle Tree Fence Gate=Ворота из тропического дерева +Jungle Tree Fence Rail=Перила из тропического дерева +Jungle Tree Leaves=Листья тропического дерева +Jungle Tree Leaves (@1)=Листья тропического дерева (@1) +Jungle Tree Planks=Доски из тропического дерева +Jungle Tree Planks Slab=Доски из тропического дерева (плита) +Jungle Tree Planks Stair=Доски из тропического дерева (ступени) +Jungle Tree Sapling=Саженец тропического дерева +Jungle Tree Trunk=Ствол тропического дерева +Jungle Tree Trunk Slab=Ствол тропического дерева (плита) +Jungle Tree Trunk Stair=Ствол тропического дерева (ступени) +Oak Tree=Дуб +Oak Tree Fence=Дубовый забор +Oak Tree Fence Gate=Дубовые ворота +Oak Tree Fence Rail=Дубовые перила +Oak Tree Leaves=Листья дуба +Oak Tree Planks=Дубовые доски +Oak Tree Planks Slab=Дубовые доски (плита) +Oak Tree Planks Stair=Дубовые доски (ступени) +Oak Tree Sapling=Саженец дуба +Oak Tree Trunk=Ствол дуба +Oak Tree Trunk Slab=Ствол дуба (плита) +Oak Tree Trunk Stair=Ствол дуба (ступени) +Palm Tree=Пальма +Palm Tree Fence=Пальмовый забор +Palm Tree Fence Gate=Пальмовые ворота +Palm Tree Fence Rail=Пальмовые перила +Palm Tree Leaves=Листья пальмы +Palm Tree Planks=Пальмовые доски +Palm Tree Planks Slab=Пальмовые доски (плита) +Palm Tree Planks Stair=Пальмовые доски (ступени) +Palm Tree Sapling=Саженец пальмы +Palm Tree Trunk=Ствол пальмы +Palm Tree Trunk Slab=Ствол пальмы (плита) +Palm Tree Trunk Stair=Ствол пальмы (ступени) +Poplar Tree=Тополь +Poplar Tree Fence=Забор из тополя +Poplar Tree Fence Gate=Ворота из тополя +Poplar Tree Fence Rail=Перила из тополя +Poplar Tree Leaves=Листья тополя +Poplar Tree Planks=Доски из тополя +Poplar Tree Planks Slab=Доски из тополя (плита) +Poplar Tree Planks Stair=Доски из тополя (ступени) +Poplar Tree Sapling=Саженец тополя +Poplar Tree Trunk=Ствол тополя +Poplar Tree Trunk Slab=Ствол тополя (плита) +Poplar Tree Trunk Stair=Ствол тополя (ступени) +Red=красные +Rubber Tree=Каучуковое дерево +Rubber Tree Fence=Забор из каучукового дерева +Rubber Tree Fence Gate=Ворота из каучукового дерева +Rubber Tree Fence Rail=Перила из каучукового дерева +Rubber Tree Leaves=Листья каучукового дерева +Rubber Tree Planks=Доски из каучукового дерева +Rubber Tree Planks Slab=Доски из каучукового дерева (плита) +Rubber Tree Planks Stair=Доски из каучукового дерева (ступени) +Rubber Tree Sapling=Саженец каучукового дерева +Rubber Tree Trunk=Ствол каучукового дерева +Rubber Tree Trunk (Empty)=Ствол каучукового дерева (пусто) +Rubber Tree Trunk Slab=Ствол каучукового дерева (плита) +Rubber Tree Trunk Stair=Ствол каучукового дерева (ступени) +Small poplar Tree Sapling=Малы саженец тополя +Spruce Cone=Еловая шишка +Spruce Tree=Ель +Spruce Tree Fence=Еловый забор +Spruce Tree Fence Gate=Еловые ворота +Spruce Tree Fence Rail=Еловые перила +Spruce Tree Leaves=Еловая хвоя +Spruce Tree Planks=Еловые доски +Spruce Tree Planks Slab=Еловые доски (плита) +Spruce Tree Planks Stair=Еловые доски (ступени) +Spruce Tree Sapling=Саженец ели +Spruce Tree Trunk=Ствол ели +Spruce Tree Trunk Slab=Ствол ели (плита) +Spruce Tree Trunk Stair=Ствол ели (ступени) +Willow Tree=Ива +Willow Tree Fence=Ивовый забор +Willow Tree Fence Gate=Ивовые ворота +Willow Tree Fence Rail=Ивовые перила +Willow Tree Leaves=Листья ивы +Willow Tree Planks=Ивовые доски +Willow Tree Planks Slab=Ивовые доски (плита) +Willow Tree Planks Stair=Ивовые доски (ступени) +Willow Tree Sapling=Саженец ивы +Willow Tree Trunk=Ствол ивы +Willow Tree Trunk Slab=Ствол ивы (плита) +Willow Tree Trunk Stair=Ствол ивы (ступени) +Yellow=желтые + +# init.lua +Sapling=Саженец +Tree=Дерево +Wooden Planks=Деревянные доски +Leaves=Листья +Wooden Fence=Деревянный забор +Wooden Fence Rail=Деревянные перила +Wooden Fence Gate=Деревянные ворота diff --git a/mods/moretrees/locale/template.txt b/mods/moretrees/locale/template.txt new file mode 100644 index 0000000..d10e8ea --- /dev/null +++ b/mods/moretrees/locale/template.txt @@ -0,0 +1,219 @@ +# textdomain: moretrees + + +### cocos_palm.lua ### + +Coconut= +Coconut Flower= + +### crafts.lua ### + +Acorn Muffin= +Acorn Muffin batter= +Coconut Milk= +Date= +Date & nut snack= +Date-nut cake= +Date-nut cake batter= +Date-nut energy bar= +Raw Coconut= +Roasted Cedar Cone Nuts= +Roasted Fir Cone Nuts= +Roasted Spruce Cone Nuts= + +### date_palm.lua ### + +Date Flowers= +Date Stem= +Dates= + +### node_defs.lua ### + +@1 (fast growth)= +Acorn= +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves= +Apple Tree Planks= +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling= +Apple Tree Trunk= +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves= +Beech Tree Planks= +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling= +Beech Tree Trunk= +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves= +Birch Tree Planks= +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling= +Birch Tree Trunk= +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone= +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves= +Cedar Tree Planks= +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling= +Cedar Tree Trunk= +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks= +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk= +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves= +Douglas Fir Leaves (Bright)= +Douglas Fir Planks= +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling= +Douglas Fir Trunk= +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone= +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves= +Giant Sequoia Planks= +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling= +Giant Sequoia Trunk= +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree= +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves= +Jungle Tree Leaves (@1)= +Jungle Tree Planks= +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling= +Jungle Tree Trunk= +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves= +Oak Tree Planks= +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling= +Oak Tree Trunk= +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves= +Palm Tree Planks= +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling= +Palm Tree Trunk= +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves= +Poplar Tree Planks= +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling= +Poplar Tree Trunk= +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red= +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves= +Rubber Tree Planks= +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling= +Rubber Tree Trunk= +Rubber Tree Trunk (Empty)= +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone= +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves= +Spruce Tree Planks= +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling= +Spruce Tree Trunk= +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves= +Willow Tree Planks= +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling= +Willow Tree Trunk= +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow= + +# init.lua +Sapling= +Tree= +Wooden Planks= +Leaves= +Wooden Fence= +Wooden Fence Rail= +Wooden Fence Gate= diff --git a/mods/moretrees/mod.conf b/mods/moretrees/mod.conf new file mode 100644 index 0000000..bbbcc4c --- /dev/null +++ b/mods/moretrees/mod.conf @@ -0,0 +1,4 @@ +name = moretrees +depends = xcompat +optional_depends = doors, stairs, moreblocks, farming, default, vessels +min_minetest_version = 5.2.0 diff --git a/mods/moretrees/node_defs.lua b/mods/moretrees/node_defs.lua new file mode 100644 index 0000000..381ea01 --- /dev/null +++ b/mods/moretrees/node_defs.lua @@ -0,0 +1,784 @@ +local S = minetest.get_translator("moretrees") + +moretrees.avoidnodes = {} + +local jungle_sapling_texture = minetest.get_modpath("default") and "default_junglesapling.png" + or "moretrees_cedar_sapling.png" + +moretrees.treelist = { + {"beech", S("Beech Tree")}, + {"apple_tree", S("Apple Tree")}, + {"oak", S("Oak Tree"), "acorn", S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"sequoia", S("Giant Sequoia")}, + {"birch", S("Birch Tree")}, + {"palm", S("Palm Tree"), "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, + {"date_palm", S("Date Palm Tree"), "date_palm_fruit_trunk",S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 }, + {"spruce", S("Spruce Tree"), "spruce_cone", S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"cedar", S("Cedar Tree"), "cedar_cone", S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"poplar", S("Poplar Tree")}, + {"poplar_small", S("Poplar Tree")}, + {"willow", S("Willow Tree")}, + {"rubber_tree", S("Rubber Tree")}, + {"fir", S("Douglas Fir"), "fir_cone", S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"jungletree", S("Jungle Tree"), nil, nil, nil, nil, jungle_sapling_texture }, +} + +moretrees.treedesc = { + beech = { + trunk = S("Beech Tree Trunk"), + planks = S("Beech Tree Planks"), + sapling = S("Beech Tree Sapling"), + leaves = S("Beech Tree Leaves"), + trunk_stair = S("Beech Tree Trunk Stair"), + trunk_slab = S("Beech Tree Trunk Slab"), + planks_stair = S("Beech Tree Planks Stair"), + planks_slab = S("Beech Tree Planks Slab"), + fence = S("Beech Tree Fence"), + fence_rail = S("Beech Tree Fence Rail"), + fence_gate = S("Beech Tree Fence Gate"), + }, + apple_tree = { + trunk = S("Apple Tree Trunk"), + planks = S("Apple Tree Planks"), + sapling = S("Apple Tree Sapling"), + leaves = S("Apple Tree Leaves"), + trunk_stair = S("Apple Tree Trunk Stair"), + trunk_slab = S("Apple Tree Trunk Slab"), + planks_stair = S("Apple Tree Planks Stair"), + planks_slab = S("Apple Tree Planks Slab"), + fence = S("Apple Tree Fence"), + fence_rail = S("Apple Tree Fence Rail"), + fence_gate = S("Apple Tree Fence Gate"), + }, + oak = { + trunk = S("Oak Tree Trunk"), + planks = S("Oak Tree Planks"), + sapling = S("Oak Tree Sapling"), + leaves = S("Oak Tree Leaves"), + trunk_stair = S("Oak Tree Trunk Stair"), + trunk_slab = S("Oak Tree Trunk Slab"), + planks_stair = S("Oak Tree Planks Stair"), + planks_slab = S("Oak Tree Planks Slab"), + fence = S("Oak Tree Fence"), + fence_rail = S("Oak Tree Fence Rail"), + fence_gate = S("Oak Tree Fence Gate"), + }, + sequoia = { + trunk = S("Giant Sequoia Trunk"), + planks = S("Giant Sequoia Planks"), + sapling = S("Giant Sequoia Sapling"), + leaves = S("Giant Sequoia Leaves"), + trunk_stair = S("Giant Sequoia Trunk Stair"), + trunk_slab = S("Giant Sequoia Trunk Slab"), + planks_stair = S("Giant Sequoia Planks Stair"), + planks_slab = S("Giant Sequoia Planks Slab"), + fence = S("Giant Sequoia Fence"), + fence_rail = S("Giant Sequoia Fence Rail"), + fence_gate = S("Giant Sequoia Fence Gate"), + }, + birch = { + trunk = S("Birch Tree Trunk"), + planks = S("Birch Tree Planks"), + sapling = S("Birch Tree Sapling"), + leaves = S("Birch Tree Leaves"), + trunk_stair = S("Birch Tree Trunk Stair"), + trunk_slab = S("Birch Tree Trunk Slab"), + planks_stair = S("Birch Tree Planks Stair"), + planks_slab = S("Birch Tree Planks Slab"), + fence = S("Birch Tree Fence"), + fence_rail = S("Birch Tree Fence Rail"), + fence_gate = S("Birch Tree Fence Gate"), + }, + palm = { + trunk = S("Palm Tree Trunk"), + planks = S("Palm Tree Planks"), + sapling = S("Palm Tree Sapling"), + leaves = S("Palm Tree Leaves"), + trunk_stair = S("Palm Tree Trunk Stair"), + trunk_slab = S("Palm Tree Trunk Slab"), + planks_stair = S("Palm Tree Planks Stair"), + planks_slab = S("Palm Tree Planks Slab"), + fence = S("Palm Tree Fence"), + fence_rail = S("Palm Tree Fence Rail"), + fence_gate = S("Palm Tree Fence Gate"), + }, + date_palm = { + trunk = S("Date Palm Tree Trunk"), + planks = S("Date Palm Tree Planks"), + sapling = S("Date Palm Tree Sapling"), + leaves = S("Date Palm Tree Leaves"), + trunk_stair = S("Date Palm Tree Trunk Stair"), + trunk_slab = S("Date Palm Tree Trunk Slab"), + planks_stair = S("Date Palm Tree Planks Stair"), + planks_slab = S("Date Palm Tree Planks Slab"), + fence = S("Date Palm Tree Fence"), + fence_rail = S("Date Palm Tree Fence Rail"), + fence_gate = S("Date Palm Tree Fence Gate"), + }, + spruce = { + trunk = S("Spruce Tree Trunk"), + planks = S("Spruce Tree Planks"), + sapling = S("Spruce Tree Sapling"), + leaves = S("Spruce Tree Leaves"), + trunk_stair = S("Spruce Tree Trunk Stair"), + trunk_slab = S("Spruce Tree Trunk Slab"), + planks_stair = S("Spruce Tree Planks Stair"), + planks_slab = S("Spruce Tree Planks Slab"), + fence = S("Spruce Tree Fence"), + fence_rail = S("Spruce Tree Fence Rail"), + fence_gate = S("Spruce Tree Fence Gate"), + }, + cedar = { + trunk = S("Cedar Tree Trunk"), + planks = S("Cedar Tree Planks"), + sapling = S("Cedar Tree Sapling"), + leaves = S("Cedar Tree Leaves"), + trunk_stair = S("Cedar Tree Trunk Stair"), + trunk_slab = S("Cedar Tree Trunk Slab"), + planks_stair = S("Cedar Tree Planks Stair"), + planks_slab = S("Cedar Tree Planks Slab"), + fence = S("Cedar Tree Fence"), + fence_rail = S("Cedar Tree Fence Rail"), + fence_gate = S("Cedar Tree Fence Gate"), + }, + poplar = { + trunk = S("Poplar Tree Trunk"), + planks = S("Poplar Tree Planks"), + sapling = S("Poplar Tree Sapling"), + leaves = S("Poplar Tree Leaves"), + trunk_stair = S("Poplar Tree Trunk Stair"), + trunk_slab = S("Poplar Tree Trunk Slab"), + planks_stair = S("Poplar Tree Planks Stair"), + planks_slab = S("Poplar Tree Planks Slab"), + fence = S("Poplar Tree Fence"), + fence_rail = S("Poplar Tree Fence Rail"), + fence_gate = S("Poplar Tree Fence Gate"), + }, + poplar_small = { + sapling = S("Small poplar Tree Sapling"), + }, + willow = { + trunk = S("Willow Tree Trunk"), + planks = S("Willow Tree Planks"), + sapling = S("Willow Tree Sapling"), + leaves = S("Willow Tree Leaves"), + trunk_stair = S("Willow Tree Trunk Stair"), + trunk_slab = S("Willow Tree Trunk Slab"), + planks_stair = S("Willow Tree Planks Stair"), + planks_slab = S("Willow Tree Planks Slab"), + fence = S("Willow Tree Fence"), + fence_rail = S("Willow Tree Fence Rail"), + fence_gate = S("Willow Tree Fence Gate"), + }, + rubber_tree = { + trunk = S("Rubber Tree Trunk"), + planks = S("Rubber Tree Planks"), + sapling = S("Rubber Tree Sapling"), + leaves = S("Rubber Tree Leaves"), + trunk_stair = S("Rubber Tree Trunk Stair"), + trunk_slab = S("Rubber Tree Trunk Slab"), + planks_stair = S("Rubber Tree Planks Stair"), + planks_slab = S("Rubber Tree Planks Slab"), + fence = S("Rubber Tree Fence"), + fence_rail = S("Rubber Tree Fence Rail"), + fence_gate = S("Rubber Tree Fence Gate"), + }, + fir = { + trunk = S("Douglas Fir Trunk"), + planks = S("Douglas Fir Planks"), + sapling = S("Douglas Fir Sapling"), + leaves = S("Douglas Fir Leaves"), + trunk_stair = S("Douglas Fir Trunk Stair"), + trunk_slab = S("Douglas Fir Trunk Slab"), + planks_stair = S("Douglas Fir Planks Stair"), + planks_slab = S("Douglas Fir Planks Slab"), + fence = S("Douglas Fir Fence"), + fence_rail = S("Douglas Fir Fence Rail"), + fence_gate = S("Douglas Fir Fence Gate"), + }, + jungletree = { + trunk = S("Jungle Tree Trunk"), + planks = S("Jungle Tree Planks"), + sapling = S("Jungle Tree Sapling"), + leaves = S("Jungle Tree Leaves"), + trunk_stair = S("Jungle Tree Trunk Stair"), + trunk_slab = S("Jungle Tree Trunk Slab"), + planks_stair = S("Jungle Tree Planks Stair"), + planks_slab = S("Jungle Tree Planks Slab"), + fence = S("Jungle Tree Fence"), + fence_rail = S("Jungle Tree Fence Rail"), + fence_gate = S("Jungle Tree Fence Gate"), + }, +} + + +-- local dirs1 = { 21, 20, 23, 22, 21 } +local dirs2 = { 12, 9, 18, 7, 12 } +-- local dirs3 = { 14, 11, 16, 5, 14 } + +local moretrees_new_leaves_drawtype = "allfaces_optional" +local moretrees_plantlike_leaves_visual_scale = 1 + +if moretrees.plantlike_leaves then + moretrees_new_leaves_drawtype = "plantlike" + moretrees_plantlike_leaves_visual_scale = math.sqrt(2) +end + +-- redefine default leaves to handle plantlike and/or leaf decay options + +if minetest.get_modpath("default") and moretrees.plantlike_leaves then + minetest.override_item(xcompat.materials.apple_leaves, { + inventory_image = minetest.inventorycube("default_leaves.png"), + drawtype = "plantlike", + visual_scale = math.sqrt(2) + }) +end + +-- redefine default jungle leaves for same + +if minetest.get_modpath("default") and moretrees.plantlike_leaves then + minetest.override_item(xcompat.materials.jungle_leaves, { + inventory_image = minetest.inventorycube("default_jungleleaves.png"), + drawtype = "plantlike", + visual_scale = math.sqrt(2) + }) +end + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + local fruit = moretrees.treelist[i][3] + local fruitdesc = moretrees.treelist[i][4] + local selbox = moretrees.treelist[i][5] + local vscale = moretrees.treelist[i][6] + + local saptex = moretrees.treelist[i][7] + + -- player will get a sapling with 1/100 chance + -- player will get leaves only if he/she gets no saplings, + -- this is because max_items is 1 + + local droprarity = 100 + local decay = moretrees.leafdecay_radius + + if treename == "palm" then + droprarity = 20 + decay = moretrees.palm_leafdecay_radius + elseif treename == "date_palm" then + decay = moretrees.date_palm_leafdecay_radius + end + + -- dont register planks/nodes for trees from default and small varients for trees + local split_tn = treename:split("_") + if treename ~= "jungletree" and treename ~= "pine" and split_tn[2]~="small" then + + saptex = "moretrees_"..treename.."_sapling.png" + + minetest.register_node("moretrees:"..treename.."_trunk", { + description = moretrees.treedesc[treename].trunk, + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = xcompat.sounds.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + }) + + if moretrees.enable_planks then + minetest.register_node("moretrees:"..treename.."_planks", { + description = moretrees.treedesc[treename].planks, + tiles = {"moretrees_"..treename.."_wood.png"}, + is_ground_content = false, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = xcompat.sounds.node_sound_wood_defaults(), + }) + end + + local moretrees_leaves_inventory_image = nil + local moretrees_new_leaves_waving = nil + + if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_"..treename.."_leaves.png") + else + moretrees_new_leaves_waving = 1 + end + + minetest.register_node("moretrees:"..treename.."_leaves", { + description = moretrees.treedesc[treename].leaves, + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + tiles = { "moretrees_"..treename.."_leaves.png" }, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 1}, + sounds = xcompat.sounds.node_sound_leaves_defaults(), + + drop = { + max_items = 1, + items = { + {items = {"moretrees:"..treename.."_sapling"}, rarity = droprarity }, + {items = {"moretrees:"..treename.."_leaves"} } + } + }, + }) + + if minetest.get_modpath("moreblocks") then + + stairsplus:register_all( + "moretrees", + treename.."_trunk", + "moretrees:"..treename.."_trunk", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + description = moretrees.treedesc[treename].trunk, + drop = treename.."_trunk", + } + ) + + if moretrees.enable_planks then + stairsplus:register_all( + "moretrees", + treename.."_planks", + "moretrees:"..treename.."_planks", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, + tiles = { "moretrees_"..treename.."_wood.png" }, + description = moretrees.treedesc[treename].planks, + drop = treename.."_planks", + } + ) + end + elseif minetest.get_modpath("stairs") then + stairs.register_stair_and_slab( + "moretrees_"..treename.."_trunk", + "moretrees:"..treename.."_trunk", + { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2 }, + { "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + moretrees.treedesc[treename].trunk_stair, + moretrees.treedesc[treename].trunk_slab, + xcompat.sounds.node_sound_wood_defaults() + ) + + if moretrees.enable_planks then + stairs.register_stair_and_slab( + "moretrees_"..treename.."_planks", + "moretrees:"..treename.."_planks", + { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 }, + { "moretrees_"..treename.."_wood.png" }, + moretrees.treedesc[treename].planks_stair, + moretrees.treedesc[treename].planks_slab, + xcompat.sounds.node_sound_wood_defaults() + ) + end + + end + + if minetest.get_modpath("default") and moretrees.enable_planks then + local planks_name = "moretrees:" .. treename .. "_planks" + local planks_tile = "moretrees_" .. treename .. "_wood.png" + default.register_fence("moretrees:" .. treename .. "_fence", { + description = moretrees.treedesc[treename].fence, + texture = planks_tile, + inventory_image = "default_fence_overlay.png^" .. planks_tile .. + "^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^" .. planks_tile .. + "^default_fence_overlay.png^[makealpha:255,126,126", + material = planks_name, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = xcompat.sounds.node_sound_wood_defaults() + }) + default.register_fence_rail("moretrees:" .. treename .. "_fence_rail", { + description = moretrees.treedesc[treename].fence_rail, + texture = planks_tile, + inventory_image = "default_fence_rail_overlay.png^" .. planks_tile .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^" .. planks_tile .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126", + material = planks_name, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = xcompat.sounds.node_sound_wood_defaults() + }) + if minetest.global_exists("doors") then + doors.register_fencegate("moretrees:" .. treename .. "_gate", { + description = moretrees.treedesc[treename].fence_gate, + texture = planks_tile, + material = planks_name, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + }) + end + end + end + + -- the default game provides jungle tree and pine saplings. + if treename~="jungletree" and treename ~= "pine" then + local regular_groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1} + if minetest.settings:get_bool("creative_mode", false) then + regular_groups["not_in_creative_inventory"]=1 + end + + minetest.register_node("moretrees:"..treename.."_sapling", { + description = moretrees.treedesc[treename].sapling, + drawtype = "plantlike", + tiles = {split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex}, + inventory_image = split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex, + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = regular_groups, + sounds = xcompat.sounds.node_sound_default(), + on_place = function(itemstack, placer, pointed_thing) + itemstack = xcompat.functions.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(300) + end, + on_timer = function(pos, elapsed) + if moretrees.can_grow(pos, treename) then + --moretrees["grow_" .. treename](pos) + minetest.set_node(pos, {name="air"}) + if type(moretrees["spawn_" .. treename .. "_object"])=="string" then + local split = moretrees["spawn_" .. treename .. "_object"]:split(".") + moretrees[split[2]](pos) + else + minetest.spawn_tree(pos, moretrees["spawn_" .. treename .. "_object"]) + end + else + minetest.get_node_timer(pos):start(300) + end + end, + }) + end + + local ongen_groups = { + snappy = 2, + dig_immediate = 3, + flammable = 2, + attached_node = 1, + sapling = 1, + moretrees_ongen = 1, + not_in_creative_inventory = 1 + } + if minetest.settings:get_bool("creative_mode", false) then + ongen_groups["not_in_creative_inventory"]=nil + end + minetest.register_node("moretrees:"..treename.."_sapling_ongen", { + description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling), + drawtype = "plantlike", + tiles = {split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex,}, + inventory_image = split_tn[2] and split_tn[2]=="small" and "moretrees_" .. treename .. "_sapling.png" or saptex, + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = ongen_groups, + sounds = xcompat.sounds.node_sound_default(), + drop = "moretrees:"..treename.."_sapling", + on_place = function(itemstack, placer, pointed_thing) + itemstack = xcompat.functions.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling_ongen", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_timer = function(pos, elapsed) + if moretrees.can_grow(pos, treename) then + --moretrees["grow_" .. treename](pos) + minetest.set_node(pos, {name="air"}) + if type(moretrees["spawn_" .. treename .. "_object"])=="string" then + local split = moretrees["spawn_" .. treename .. "_object"]:split(".") + moretrees[split[2]](pos) + else + minetest.spawn_tree(pos, moretrees["spawn_" .. treename .. "_object"]) + end + else + minetest.get_node_timer(pos):start(300) + end + end, + }) + + local fruitname = nil + if fruit then + fruitname = "moretrees:"..fruit + minetest.register_node(fruitname, { + description = fruitdesc, + drawtype = "plantlike", + tiles = { "moretrees_"..fruit..".png" }, + inventory_image = "moretrees_"..fruit..".png^[transformR180", + wield_image = "moretrees_"..fruit..".png^[transformR180", + visual_scale = vscale, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = selbox + }, + groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1, leafdecay = 1, leafdecay_drop = 1}, + sounds = xcompat.sounds.node_sound_default(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "moretrees:"..fruit, param2 = 1}) + end + end + }) + end + + if treename ~= "jungletree" + and treename ~= "poplar_small" + and treename ~= "pine" + and minetest.get_modpath("default") then + default.register_leafdecay({ + trunks = { "moretrees:"..treename.."_trunk" }, + leaves = { "moretrees:"..treename.."_leaves", fruitname }, + radius = decay, + }) + end + + minetest.register_abm({ + nodenames = { "moretrees:"..treename.."_trunk_sideways" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + local nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir}) + end, + }) + + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk") + + if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling") + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling_ongen") + end +end + +-- poplar saplings leaves +local poplar_leaves_drop = minetest.registered_nodes["moretrees:poplar_leaves"].drop +minetest.override_item("moretrees:poplar_leaves", { + drop = { + max_items = poplar_leaves_drop.max_items, + items = { + {items = {"moretrees:poplar_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, + {items = {"moretrees:poplar_small_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, + {items = {"moretrees:poplar_leaves"} } + } + } +}) + +-- Extra nodes for jungle trees: + +local jungleleaves = {"yellow","red"} +local jungleleavesnames = {S("Yellow"), S("Red")} +for color = 1, #jungleleaves do + local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color] + + local moretrees_leaves_inventory_image = nil + + if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_jungletree_leaves_"..jungleleaves[color]..".png") + else + moretrees_new_leaves_waving = 1 + end + + minetest.register_node(leave_name, { + description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]), + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + tiles = {"moretrees_jungletree_leaves_"..jungleleaves[color]..".png"}, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, + drop = minetest.get_modpath("default") and { + max_items = 1, + items = { + {items = {"default:junglesapling"}, rarity = 100 }, + {items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } + } + } or nil, + sounds = xcompat.sounds.node_sound_leaves_defaults(), + }) +end + +-- To get Moretrees to generate its own jungle trees among the default mapgen +-- we need our own copy of that node, which moretrees will match against. + +if minetest.get_modpath("default") then + local jungle_tree = table.copy(minetest.registered_nodes["default:jungletree"]) + jungle_tree.drop = "default:jungletree" + minetest.register_node("moretrees:jungletree_trunk", jungle_tree) + + default.register_leafdecay({ + trunks = { "default:jungletree", "moretrees:jungletree_trunk" }, + leaves = { xcompat.materials.jungle_leaves, "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_red" }, + radius = moretrees.leafdecay_radius, + }) +end + +-- Extra needles for firs + +local moretrees_leaves_inventory_image = nil + +if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_fir_leaves_bright.png") +end + +minetest.register_node("moretrees:fir_leaves_bright", { + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + description = S("Douglas Fir Leaves (Bright)"), + tiles = { "moretrees_fir_leaves_bright.png" }, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, + drop = { + max_items = 1, + items = { + {items = {'moretrees:fir_sapling'}, rarity = 100 }, + {items = {'moretrees:fir_leaves_bright'} } + } + }, + sounds = xcompat.sounds.node_sound_leaves_defaults() +}) + +if minetest.get_modpath("default") then + default.register_leafdecay({ + trunks = { "moretrees:fir_trunk" }, + leaves = { "moretrees:fir_leaves", "moretrees:fir_leaves_bright" }, + radius = moretrees.leafdecay_radius, + }) +end + + +if minetest.get_modpath("default") and moretrees.enable_redefine_apple then + local appledef = table.copy(minetest.registered_nodes["default:apple"]) + appledef.groups.attached_node = 1 + minetest.register_node(":default:apple", appledef) +end + +table.insert(moretrees.avoidnodes, "default:jungletree") +table.insert(moretrees.avoidnodes, "default:pine_tree") +table.insert(moretrees.avoidnodes, "default:acacia_tree") +table.insert(moretrees.avoidnodes, "moretrees:fir_trunk") +table.insert(moretrees.avoidnodes, "default:tree") + +if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "snow:sapling_pine") + table.insert(moretrees.avoidnodes, "default:junglesapling") + table.insert(moretrees.avoidnodes, "default:pine_sapling") +end + +-- "empty" (tapped) rubber tree nodes + +minetest.register_node("moretrees:rubber_tree_trunk_empty", { + description = S("Rubber Tree Trunk (Empty)"), + tiles = { + "moretrees_rubber_tree_trunk_top.png", + "moretrees_rubber_tree_trunk_top.png", + "moretrees_rubber_tree_trunk_empty.png" + }, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = xcompat.sounds.node_sound_wood_defaults(), + paramtype2 = "facedir", + is_ground_content = false, + on_place = minetest.rotate_node, +}) + +minetest.register_abm({ + nodenames = { "moretrees:rubber_tree_trunk_empty_sideways" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + local nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir}) + end, +}) + +-- For compatibility with old nodes, recently-changed nodes, and default nodes + +minetest.register_alias("technic:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming_plus:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming:rubber_tree_full", "moretrees:rubber_tree_trunk") + +minetest.register_alias("technic:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming_plus:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming:rubber_leaves", "moretrees:rubber_tree_leaves") + +minetest.register_alias("technic:rubber_tree_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming_plus:rubber_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming:rubber_sapling", "moretrees:rubber_tree_sapling") + +minetest.register_alias("moretrees:conifer_trunk", "moretrees:fir_trunk") +minetest.register_alias("moretrees:conifer_trunk_sideways", "moretrees:fir_trunk_sideways") +minetest.register_alias("moretrees:conifer_leaves", "moretrees:fir_leaves") +minetest.register_alias("moretrees:conifer_leaves_bright", "moretrees:fir_leaves_bright") +minetest.register_alias("moretrees:conifer_sapling", "moretrees:fir_sapling") + +minetest.register_alias("conifers:trunk", "moretrees:fir_trunk") +minetest.register_alias("conifers:trunk_reversed", "moretrees:fir_trunk_sideways") +minetest.register_alias("conifers:leaves", "moretrees:fir_leaves") +minetest.register_alias("conifers:leaves_special", "moretrees:fir_leaves_bright") +minetest.register_alias("conifers:sapling", "moretrees:fir_sapling") + +minetest.register_alias("moretrees:jungletree_sapling", "default:junglesapling") +minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") +minetest.register_alias("moretrees:jungletree_planks", "default:junglewood") +minetest.register_alias("moretrees:jungletree_leaves_green", xcompat.materials.jungle_leaves) + +minetest.register_alias("moretrees:acacia_trunk", "default:acacia_tree") +minetest.register_alias("moretrees:acacia_planks", "default:acacia_wood") +minetest.register_alias("moretrees:acacia_sapling", "default:acacia_sapling") +minetest.register_alias("moretrees:acacia_leaves", "default:acacia_leaves") + +minetest.register_alias("moretrees:pine_trunk", "moretrees:cedar_trunk") +minetest.register_alias("moretrees:pine_planks", "moretrees:cedar_planks") +minetest.register_alias("moretrees:pine_sapling", "moretrees:cedar_sapling") +minetest.register_alias("moretrees:pine_leaves", "moretrees:cedar_leaves") +minetest.register_alias("moretrees:pine_cone", "moretrees:cedar_cone") +minetest.register_alias("moretrees:pine_nuts", "moretrees:cedar_nuts") +minetest.register_alias("moretrees:pine_sapling_ongen", "moretrees:cedar_sapling_ongen") + +minetest.register_alias("moretrees:dates", "moretrees:dates_f4") diff --git a/mods/moretrees/saplings.lua b/mods/moretrees/saplings.lua new file mode 100644 index 0000000..32ef7a8 --- /dev/null +++ b/mods/moretrees/saplings.lua @@ -0,0 +1,105 @@ +-- sapling growth +-- these tables only affect hand-placed saplings +-- mapgen-placed always use their biome def settings, which are much more +-- limited, in the interest of speed. + +local dirt_surfaces = { + set = true, + [xcompat.materials.dirt] = true, + [xcompat.materials.dirt_with_grass] = true, + ["default:dirt_with_dry_grass"] = true, + ["default:dirt_with_coniferous_litter"] = true, + ["default:dirt_with_rainforest_litter"] = true, + ["woodsoils:dirt_with_leaves_1"] = true, + ["woodsoils:dirt_with_leaves_2"] = true, + ["woodsoils:grass_with_leaves_1"] = true, + ["woodsoils:grass_with_leaves_2"] = true +} + +local conifer_surfaces = { + set = true, + [xcompat.materials.dirt] = true, + [xcompat.materials.dirt_with_grass] = true, + ["default:dirt_with_dry_grass"] = true, + ["default:dirt_with_coniferous_litter"] = true, + ["default:dirt_with_rainforest_litter"] = true, + ["woodsoils:dirt_with_leaves_1"] = true, + ["woodsoils:dirt_with_leaves_2"] = true, + ["woodsoils:grass_with_leaves_1"] = true, + ["woodsoils:grass_with_leaves_2"] = true, + ["default:dirt_with_snow"] = true +} + +local sand_surfaces = { + set = true, + [xcompat.materials.sand] = true, + [xcompat.materials.desert_sand] = true, + ["cottages:loam"] = true, + -- note, no silver sand here. + -- too cold for a palm, too... well... sandy for anything else. +} + +function moretrees.can_grow(pos, treename) + local surfaces + + if treename == "spruce" + or treename == "fir" + or treename == "cedar" + or treename == "pine" then + surfaces = conifer_surfaces + elseif string.find(treename, "palm") then + surfaces = sand_surfaces + else + surfaces = dirt_surfaces + end + + if surfaces[minetest.get_node(vector.new(pos.x, pos.y-1, pos.z)).name] then + return true + else + return false + end +end + +--[[ for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + local tree_model = treename.."_model" + local tree_biome = treename.."_biome" + local surfaces + local grow_function = moretrees[tree_model] + + if treename == "spruce" + or treename == "fir" + or treename == "cedar" + or treename == "pine" then + surfaces = conifer_surfaces + elseif string.find(treename, "palm") then + surfaces = sand_surfaces + else + surfaces = dirt_surfaces + end + + if treename == "spruce" + or treename == "fir" + or treename == "birch" + or treename == "jungletree" then + grow_function = "moretrees.grow_"..treename + end + + biome_lib.dbg(dump(moretrees[tree_biome].surface), 4) + + biome_lib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:"..treename.."_sapling", + grow_nodes = surfaces, + grow_function = grow_function, + }) + + biome_lib:grow_plants({ + grow_delay = 2, + grow_chance = 1, + grow_plant = "moretrees:"..treename.."_sapling_ongen", + grow_nodes = surfaces, + grow_function = grow_function, + }) +end ]] diff --git a/mods/moretrees/screenshot.lua b/mods/moretrees/screenshot.lua new file mode 100644 index 0000000..fff36c8 --- /dev/null +++ b/mods/moretrees/screenshot.lua @@ -0,0 +1,169 @@ +-- Usage: +-- - Create a new world +-- - Set world mapgen: v6 +-- - Set world seed: 2625051331357512570 +-- - Enable the moretrees mod +-- - Edit the moretrees source +-- - Disable all trees in default_settings.lua +-- - Recommended: make saplings grow fast in default_settings.lua: +-- sapling_interval = 5 +-- sapling_chance = 1 +-- - Apply the patch below to moretrees +-- (so that jungle trees are always large, and differently-colored): +-- use 'git apply --ignore-space-change' +-- - Make sure this file (you are reading) will be loaded when minetest starts ! +-- (e.g. add 'dofile(modpath.."/screenshot.lua")' to init.lua) +-- - Start minetest +-- - Goto 700,y,-280 (approximately) +-- - Make sure the world is loaded between x = 650 .. 780 and z = -350 .. -180 +-- - Give the chat command '/make-scene' +-- - Wait & walk/fly around until all trees have grown +-- - goto the platform at 780, 30, -277 +-- - Set the viewing range to 300, with fog enabled +-- - Take a screenshot. + +-- Patch to apply to moretrees +--[[ +diff --git a/init.lua b/init.lua +index 8189ffd..afd4644 100644 +--- a/init.lua ++++ b/init.lua +@@ -225,9 +225,12 @@ moretrees.ct_rules_b1 = "[-FBf][+FBf]" + moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" + moretrees.ct_rules_b2 = "[-fB][+fB]" + ++local jleaves = 1 + function moretrees.grow_jungletree(pos) + local r1 = math.random(2) + local r2 = math.random(3) ++ r1 = jleaves ++ jleaves = jleaves % 2 + 1 + if r1 == 1 then + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" + else +@@ -235,6 +238,7 @@ function moretrees.grow_jungletree(pos) + end + moretrees.jungletree_model.leaves2_chance = math.random(25, 75) + ++ r2=3 + if r2 == 1 then + moretrees.jungletree_model.trunk_type = "single" + moretrees.jungletree_model.iterations = 2 +]] + + +minetest.register_chatcommand("make-scene", { + func = function() + minetest.place_node({x=780, y=30, z=-277}, {name="default:obsidian"}) + minetest.place_node({x=780, y=30, z=-278}, {name="default:obsidian"}) + minetest.place_node({x=781, y=30, z=-277}, {name="default:obsidian"}) + minetest.place_node({x=781, y=30, z=-278}, {name="default:obsidian"}) + minetest.place_node({x=781, y=30, z=-276}, {name="default:obsidian"}) + minetest.place_node({x=780, y=30, z=-276}, {name="default:obsidian"}) + + for z = -360, -300 do + local dy=2 + for x = 630 + (-z - 360)/3, 660 + (-z - 300)/3 do + for y = 5, 22 do + minetest.place_node({x=x, y=y, z=z}, {name="default:desert_stone"}) + end + for y = 23, 25 + dy do + minetest.place_node({x=x, y=y, z=z}, {name="default:desert_sand"}) + end + dy = 0 + end + end + + minetest.place_node({x=717, y=2, z=-298}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=713, y=2, z=-302}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=713, y=2, z=-307}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=717, y=2, z=-318}, {name = "moretrees:palm_sapling"}) + minetest.place_node({x=723, y=2, z=-320}, {name = "moretrees:palm_sapling"}) + + minetest.place_node({x=645, y=26, z=-314}, {name="moretrees:date_palm_sapling"}) + minetest.place_node({x=653, y=26, z=-322}, {name="moretrees:date_palm_sapling"}) + minetest.place_node({x=649, y=26, z=-334}, {name="moretrees:date_palm_sapling"}) + minetest.place_node({x=662, y=26, z=-342}, {name="moretrees:date_palm_sapling"}) + + minetest.place_node({x=672, y=5, z=-305}, {name="moretrees:oak_sapling"}) + minetest.place_node({x=690, y=6, z=-322}, {name="moretrees:oak_sapling"}) + minetest.place_node({x=695, y=7, z=-335}, {name="moretrees:oak_sapling"}) + minetest.place_node({x=699, y=4, z=-301}, {name="moretrees:oak_sapling"}) + + minetest.place_node({x=751, y=5, z=-254}, {name="moretrees:apple_tree_sapling"}) + minetest.place_node({x=729, y=3, z=-275}, {name="moretrees:apple_tree_sapling"}) + minetest.place_node({x=747, y=4, z=-270}, {name="moretrees:apple_tree_sapling"}) + + minetest.place_node({x=671, y=5, z=-283}, {name="default:junglesapling"}) + minetest.place_node({x=680, y=4, z=-287}, {name="default:junglesapling"}) + minetest.place_node({x=702, y=4, z=-288}, {name="default:junglesapling"}) + + minetest.place_node({x=646, y=12, z=-199}, {name="moretrees:spruce_sapling"}) + minetest.place_node({x=644, y=14, z=-177}, {name="moretrees:spruce_sapling"}) + minetest.place_node({x=678, y=9, z=-211}, {name="moretrees:spruce_sapling"}) + minetest.place_node({x=663, y=10, z=-215}, {name="moretrees:spruce_sapling"}) + + minetest.place_node({x=637, y=3, z=-263}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=625, y=3, z=-250}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=616, y=3, z=-233}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=635, y=3, z=-276}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=681, y=11, z=-260}, {name="moretrees:sequoia_sapling"}) + minetest.place_node({x=682, y=10, z=-247}, {name="moretrees:sequoia_sapling"}) + + minetest.place_node({x=737, y=7, z=-195}, {name="moretrees:cedar_sapling"}) + minetest.place_node({x=720, y=8, z=-189}, {name="moretrees:cedar_sapling"}) + minetest.place_node({x=704, y=7, z=-187}, {name="moretrees:cedar_sapling"}) + + minetest.place_node({x=731, y=2, z=-227}, {name="moretrees:poplar_sapling"}) + minetest.place_node({x=721, y=2, z=-233}, {name="moretrees:poplar_sapling"}) + minetest.place_node({x=712, y=1, z=-237}, {name="moretrees:poplar_sapling"}) + minetest.place_node({x=743, y=3, z=-228}, {name="moretrees:poplar_small_sapling"}) + minetest.place_node({x=750, y=3, z=-230}, {name="moretrees:poplar_small_sapling"}) + minetest.place_node({x=731, y=5, z=-233}, {name="moretrees:poplar_small_sapling"}) + + minetest.place_node({x=702, y=2, z=-274}, {name="moretrees:birch_sapling"}) + minetest.place_node({x=697, y=2, z=-271}, {name="moretrees:birch_sapling"}) + minetest.place_node({x=696, y=2, z=-264}, {name="moretrees:birch_sapling"}) + minetest.place_node({x=710, y=2, z=-265}, {name="moretrees:birch_sapling"}) + + minetest.place_node({x=707, y=8, z=-247}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=699, y=10, z=-254}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=729, y=5, z=-261}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=732, y=5, z=-252}, {name="moretrees:fir_sapling"}) + minetest.place_node({x=741, y=4, z=-262}, {name="moretrees:fir_sapling"}) + + minetest.place_node({x=751, y=2, z=-286}, {name="moretrees:willow_sapling"}) + + minetest.place_node({x=760, y=5, z=-223}, {name="moretrees:rubber_tree_sapling"}) + minetest.place_node({x=762, y=5, z=-230}, {name="moretrees:rubber_tree_sapling"}) + minetest.place_node({x=766, y=5, z=-243}, {name="moretrees:rubber_tree_sapling"}) + minetest.place_node({x=764, y=6, z=-252}, {name="moretrees:rubber_tree_sapling"}) + end +}) + +--[[ +The following is a search/replace command suitable for vi (/vim) or sed, to convert minetest log +messages to equivalent lua commands: + +s/.*\(\(moretrees\|default\)[^ ]*\) at + (\([-0-9]\+\),\([-0-9]\+\),\([-0-9]\+\)).*/\t\tminetest.place_node({x=\3, y=\4, z=\5}, {name="\1"})/ + +E.g. a minetest log line of the following kind: + 2016-07-03 11:30:50: ACTION[Server]: singleplayer places node moretrees:rubber_tree_sapling at (760,5,-223) +Becomes: + minetest.place_node({x=760, y=5, z=-223}, {name="moretrees:rubber_tree_sapling"}) +(Except that the example log line above has an extra space added, so it won't be converted) + +vi/vim users: Add the minetest log lines to this file, then enter the following command, with + replaced with the search/replace expression above. + :% + +sed users: Add the minetest log lines to this file, then execute the following command at the shell +prompt with replaced by the search/replace expression above. Don't forget the +single-quotes. + sed '' < screenshot.lua > screenshot-new.lua + +Windows users: You're probably out of luck. And the effort of doing such a thing is probably +larger anyway than the effort of copying an existing line and typing things manually. +]] + diff --git a/mods/moretrees/screenshot.png b/mods/moretrees/screenshot.png new file mode 100644 index 0000000..b9ab5de Binary files /dev/null and b/mods/moretrees/screenshot.png differ diff --git a/mods/moretrees/settings.lua b/mods/moretrees/settings.lua new file mode 100644 index 0000000..f84fd29 --- /dev/null +++ b/mods/moretrees/settings.lua @@ -0,0 +1,57 @@ +local stg = minetest.settings + +--spawns tree on mapgen as saplings, legacy setting +moretrees.spawn_saplings = stg:get_bool("moretrees.spawn_saplings", true) + +--enable plantlike drawtype for leaves +moretrees.plantlike_leaves = stg:get_bool("moretrees.plantlike_leaves", false) + +-- Enable this if you want moretrees to redefine default apples so that they +-- fall when leaves decay/are dug. +moretrees.enable_redefine_apple = stg:get_bool("moretrees.enable_redefine_apple", true) + +-- various related settings to configure leaf decay. +moretrees.leafdecay_radius = tonumber(stg:get("moretrees.leafdecay_radius")) or 5 +moretrees.palm_leafdecay_radius = tonumber(stg:get("moretrees.palm_leafdecay_radius")) or 10 +moretrees.date_palm_leafdecay_radius = tonumber(stg:get("moretrees.date_palm_leafdecay_radius")) or 14 + +-- Cocos palm settings +moretrees.coconuts_regrow = stg:get_bool("moretrees.coconuts_regrow", true) +moretrees.coconuts_convert_existing_palms = stg:get_bool("moretrees.coconuts_convert_existing_palms", true) +moretrees.coconut_flower_interval = tonumber(stg:get("moretrees.coconut_flower_interval")) or 59 +moretrees.coconut_flower_chance = tonumber(stg:get("moretrees.coconut_flower_chance")) or 67 +moretrees.coconut_grow_interval = tonumber(stg:get("moretrees.coconut_grow_interval")) or + 2 * moretrees.coconut_flower_interval * moretrees.coconut_flower_chance +moretrees.coconut_item_drop_ichance = tonumber(stg:get("moretrees.coconut_item_drop_ichance")) or 10 + +-- Date palm settings +moretrees.dates_regrow_pollinated = stg:get_bool("moretrees.dates_regrow_pollinated", true) +moretrees.dates_regrow_unpollinated_percent = tonumber(stg:get("moretrees.dates_regrow_unpollinated_percent")) or 0 +moretrees.dates_female_percent = tonumber(stg:get("moretrees.dates_female_percent")) or 57 +moretrees.dates_pollination_distance = tonumber(stg:get("moretrees.dates_pollination_distance")) or 120 +moretrees.dates_blossom_search_time_treshold = tonumber(stg:get("moretrees.dates_blossom_search_time_treshold")) or 1000 +moretrees.dates_blossom_search_iload = tonumber(stg:get("moretrees.dates_blossom_search_iload")) or 10 +moretrees.dates_flower_interval = tonumber(stg:get("moretrees.dates_flower_interval")) or 59 +moretrees.dates_flower_chance = tonumber(stg:get("moretrees.dates_flower_chance")) or 181 +moretrees.dates_grow_interval = tonumber(stg:get("moretrees.dates_grow_interval")) or + 2 * moretrees.dates_flower_interval * moretrees.dates_flower_chance +moretrees.dates_item_drop_ichance = tonumber(stg:get("moretrees.dates_item_drop_ichance")) or 10 + +-- Sapling settings +moretrees.sapling_interval = 100 +moretrees.sapling_chance = 5 + +-- Enable this only if you have used an old moretrees version which was using biome_lib +-- and when you notice large areas with ongen saplings that don't grow +moretrees.grow_legacy_saplings = stg:get_bool("moretrees.grow_legacy_saplings", false) + +-- If this variable is set to true, drop leaves out as entities during leaf +-- decay, rather than just disappearing them. +moretrees.decay_leaves_as_items = stg:get_bool("moretrees.decay_leaves_as_items", false) + +-- this is an internal setting for games that only have one type of planks +if type(minetest.get_game_info) == "function" then + moretrees.enable_planks = minetest.get_game_info().id~="voxelgarden" +else + moretrees.enable_planks = true +end \ No newline at end of file diff --git a/mods/moretrees/textures/moretrees_acorn.png b/mods/moretrees/textures/moretrees_acorn.png new file mode 100644 index 0000000..dc2ef32 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acorn.png differ diff --git a/mods/moretrees/textures/moretrees_acorn_muffin.png b/mods/moretrees/textures/moretrees_acorn_muffin.png new file mode 100644 index 0000000..166ca83 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acorn_muffin.png differ diff --git a/mods/moretrees/textures/moretrees_acorn_muffin_batter.png b/mods/moretrees/textures/moretrees_acorn_muffin_batter.png new file mode 100644 index 0000000..b22e749 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acorn_muffin_batter.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_leaves.png b/mods/moretrees/textures/moretrees_apple_tree_leaves.png new file mode 100644 index 0000000..75ec063 Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_sapling.png b/mods/moretrees/textures/moretrees_apple_tree_sapling.png new file mode 100644 index 0000000..04f93fd Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_trunk.png b/mods/moretrees/textures/moretrees_apple_tree_trunk.png new file mode 100644 index 0000000..573fd85 Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_trunk_top.png b/mods/moretrees/textures/moretrees_apple_tree_trunk_top.png new file mode 100644 index 0000000..d261753 Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_wood.png b/mods/moretrees/textures/moretrees_apple_tree_wood.png new file mode 100644 index 0000000..242f3ee Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_wood.png differ diff --git a/mods/moretrees/textures/moretrees_beech_leaves.png b/mods/moretrees/textures/moretrees_beech_leaves.png new file mode 100644 index 0000000..8463f53 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_beech_sapling.png b/mods/moretrees/textures/moretrees_beech_sapling.png new file mode 100644 index 0000000..ff42cc4 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_beech_trunk.png b/mods/moretrees/textures/moretrees_beech_trunk.png new file mode 100644 index 0000000..06b4ae9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_beech_trunk_top.png b/mods/moretrees/textures/moretrees_beech_trunk_top.png new file mode 100644 index 0000000..7285985 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_beech_wood.png b/mods/moretrees/textures/moretrees_beech_wood.png new file mode 100644 index 0000000..d6e3f9d Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_wood.png differ diff --git a/mods/moretrees/textures/moretrees_birch_leaves.png b/mods/moretrees/textures/moretrees_birch_leaves.png new file mode 100644 index 0000000..547f133 Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_birch_sapling.png b/mods/moretrees/textures/moretrees_birch_sapling.png new file mode 100644 index 0000000..afb03f3 Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_birch_trunk.png b/mods/moretrees/textures/moretrees_birch_trunk.png new file mode 100644 index 0000000..2b222f7 Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_birch_trunk_top.png b/mods/moretrees/textures/moretrees_birch_trunk_top.png new file mode 100644 index 0000000..6e5b3bb Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_birch_wood.png b/mods/moretrees/textures/moretrees_birch_wood.png new file mode 100644 index 0000000..621f8ee Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_wood.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_cone.png b/mods/moretrees/textures/moretrees_cedar_cone.png new file mode 100644 index 0000000..5e1fae9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_cone.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_leaves.png b/mods/moretrees/textures/moretrees_cedar_leaves.png new file mode 100644 index 0000000..e6de482 Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_nuts.png b/mods/moretrees/textures/moretrees_cedar_nuts.png new file mode 100644 index 0000000..e39f895 Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_nuts.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_sapling.png b/mods/moretrees/textures/moretrees_cedar_sapling.png new file mode 100644 index 0000000..42f8ecc Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_trunk.png b/mods/moretrees/textures/moretrees_cedar_trunk.png new file mode 100644 index 0000000..ea685e3 Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_trunk_top.png b/mods/moretrees/textures/moretrees_cedar_trunk_top.png new file mode 100644 index 0000000..01aed1d Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_cedar_wood.png b/mods/moretrees/textures/moretrees_cedar_wood.png new file mode 100644 index 0000000..8680bd5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_cedar_wood.png differ diff --git a/mods/moretrees/textures/moretrees_coconut.png b/mods/moretrees/textures/moretrees_coconut.png new file mode 100644 index 0000000..2107b5f Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_0.png b/mods/moretrees/textures/moretrees_coconut_0.png new file mode 100644 index 0000000..644a65f Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_0.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_1.png b/mods/moretrees/textures/moretrees_coconut_1.png new file mode 100644 index 0000000..e2889bc Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_1.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_2.png b/mods/moretrees/textures/moretrees_coconut_2.png new file mode 100644 index 0000000..86c8cf5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_2.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_milk.png b/mods/moretrees/textures/moretrees_coconut_milk.png new file mode 100644 index 0000000..9a54ad8 Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_milk.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_milk_inv.png b/mods/moretrees/textures/moretrees_coconut_milk_inv.png new file mode 100644 index 0000000..f636578 Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_milk_inv.png differ diff --git a/mods/moretrees/textures/moretrees_date.png b/mods/moretrees/textures/moretrees_date.png new file mode 100644 index 0000000..ed743b5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date.png differ diff --git a/mods/moretrees/textures/moretrees_date_nut_bar.png b/mods/moretrees/textures/moretrees_date_nut_bar.png new file mode 100644 index 0000000..6895001 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_nut_bar.png differ diff --git a/mods/moretrees/textures/moretrees_date_nut_batter.png b/mods/moretrees/textures/moretrees_date_nut_batter.png new file mode 100644 index 0000000..47d8e08 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_nut_batter.png differ diff --git a/mods/moretrees/textures/moretrees_date_nut_cake.png b/mods/moretrees/textures/moretrees_date_nut_cake.png new file mode 100644 index 0000000..5084e71 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_nut_cake.png differ diff --git a/mods/moretrees/textures/moretrees_date_nut_snack.png b/mods/moretrees/textures/moretrees_date_nut_snack.png new file mode 100644 index 0000000..1766dab Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_nut_snack.png differ diff --git a/mods/moretrees/textures/moretrees_date_palm_leaves.png b/mods/moretrees/textures/moretrees_date_palm_leaves.png new file mode 100644 index 0000000..de0f569 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_palm_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_date_palm_sapling.png b/mods/moretrees/textures/moretrees_date_palm_sapling.png new file mode 100644 index 0000000..9596028 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_palm_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_date_palm_trunk.png b/mods/moretrees/textures/moretrees_date_palm_trunk.png new file mode 100644 index 0000000..b8fa986 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_palm_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_date_palm_trunk_top.png b/mods/moretrees/textures/moretrees_date_palm_trunk_top.png new file mode 100644 index 0000000..329ba46 Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_palm_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_date_palm_wood.png b/mods/moretrees/textures/moretrees_date_palm_wood.png new file mode 100644 index 0000000..c531e3c Binary files /dev/null and b/mods/moretrees/textures/moretrees_date_palm_wood.png differ diff --git a/mods/moretrees/textures/moretrees_dates.png b/mods/moretrees/textures/moretrees_dates.png new file mode 100644 index 0000000..cd8d578 Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates.png differ diff --git a/mods/moretrees/textures/moretrees_dates_f0.png b/mods/moretrees/textures/moretrees_dates_f0.png new file mode 100644 index 0000000..b75d59a Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_f0.png differ diff --git a/mods/moretrees/textures/moretrees_dates_f1.png b/mods/moretrees/textures/moretrees_dates_f1.png new file mode 100644 index 0000000..535150b Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_f1.png differ diff --git a/mods/moretrees/textures/moretrees_dates_f2.png b/mods/moretrees/textures/moretrees_dates_f2.png new file mode 100644 index 0000000..e2e299c Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_f2.png differ diff --git a/mods/moretrees/textures/moretrees_dates_f3.png b/mods/moretrees/textures/moretrees_dates_f3.png new file mode 100644 index 0000000..eef43f0 Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_f3.png differ diff --git a/mods/moretrees/textures/moretrees_dates_f4.png b/mods/moretrees/textures/moretrees_dates_f4.png new file mode 100644 index 0000000..78f38f9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_f4.png differ diff --git a/mods/moretrees/textures/moretrees_dates_fn.png b/mods/moretrees/textures/moretrees_dates_fn.png new file mode 100644 index 0000000..db88913 Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_fn.png differ diff --git a/mods/moretrees/textures/moretrees_dates_m0.png b/mods/moretrees/textures/moretrees_dates_m0.png new file mode 100644 index 0000000..4ff61e7 Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_m0.png differ diff --git a/mods/moretrees/textures/moretrees_dates_n.png b/mods/moretrees/textures/moretrees_dates_n.png new file mode 100644 index 0000000..c12a3d9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_dates_n.png differ diff --git a/mods/moretrees/textures/moretrees_fir_cone.png b/mods/moretrees/textures/moretrees_fir_cone.png new file mode 100644 index 0000000..45eef92 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_cone.png differ diff --git a/mods/moretrees/textures/moretrees_fir_leaves.png b/mods/moretrees/textures/moretrees_fir_leaves.png new file mode 100644 index 0000000..6643b87 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_fir_leaves_bright.png b/mods/moretrees/textures/moretrees_fir_leaves_bright.png new file mode 100644 index 0000000..e3b2e6f Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_leaves_bright.png differ diff --git a/mods/moretrees/textures/moretrees_fir_nuts.png b/mods/moretrees/textures/moretrees_fir_nuts.png new file mode 100644 index 0000000..a534149 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_nuts.png differ diff --git a/mods/moretrees/textures/moretrees_fir_sapling.png b/mods/moretrees/textures/moretrees_fir_sapling.png new file mode 100644 index 0000000..642123c Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_fir_trunk.png b/mods/moretrees/textures/moretrees_fir_trunk.png new file mode 100644 index 0000000..cc0c559 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_fir_trunk_top.png b/mods/moretrees/textures/moretrees_fir_trunk_top.png new file mode 100644 index 0000000..d17decf Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_fir_wood.png b/mods/moretrees/textures/moretrees_fir_wood.png new file mode 100644 index 0000000..7f49079 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_wood.png differ diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_green.png b/mods/moretrees/textures/moretrees_jungletree_leaves_green.png new file mode 100644 index 0000000..52d4a5a Binary files /dev/null and b/mods/moretrees/textures/moretrees_jungletree_leaves_green.png differ diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_red.png b/mods/moretrees/textures/moretrees_jungletree_leaves_red.png new file mode 100644 index 0000000..d26593e Binary files /dev/null and b/mods/moretrees/textures/moretrees_jungletree_leaves_red.png differ diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png b/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png new file mode 100644 index 0000000..d116455 Binary files /dev/null and b/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png differ diff --git a/mods/moretrees/textures/moretrees_oak_leaves.png b/mods/moretrees/textures/moretrees_oak_leaves.png new file mode 100644 index 0000000..aa587c5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_oak_sapling.png b/mods/moretrees/textures/moretrees_oak_sapling.png new file mode 100644 index 0000000..eef6a72 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_oak_trunk.png b/mods/moretrees/textures/moretrees_oak_trunk.png new file mode 100644 index 0000000..b0ca910 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_oak_trunk_top.png b/mods/moretrees/textures/moretrees_oak_trunk_top.png new file mode 100644 index 0000000..526d302 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_oak_wood.png b/mods/moretrees/textures/moretrees_oak_wood.png new file mode 100644 index 0000000..05d02f9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_wood.png differ diff --git a/mods/moretrees/textures/moretrees_palm_leaves.png b/mods/moretrees/textures/moretrees_palm_leaves.png new file mode 100644 index 0000000..90b0700 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_palm_sapling.png b/mods/moretrees/textures/moretrees_palm_sapling.png new file mode 100644 index 0000000..aaa3415 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_palm_trunk.png b/mods/moretrees/textures/moretrees_palm_trunk.png new file mode 100644 index 0000000..da255bc Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_palm_trunk_top.png b/mods/moretrees/textures/moretrees_palm_trunk_top.png new file mode 100644 index 0000000..fe07ae3 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_palm_wood.png b/mods/moretrees/textures/moretrees_palm_wood.png new file mode 100644 index 0000000..c0c0ed6 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_wood.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_leaves.png b/mods/moretrees/textures/moretrees_poplar_leaves.png new file mode 100644 index 0000000..64568bc Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_sapling.png b/mods/moretrees/textures/moretrees_poplar_sapling.png new file mode 100644 index 0000000..9d5f32a Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_small_sapling.png b/mods/moretrees/textures/moretrees_poplar_small_sapling.png new file mode 100644 index 0000000..fb9bd03 Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_small_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_trunk-1.png b/mods/moretrees/textures/moretrees_poplar_trunk-1.png new file mode 100644 index 0000000..e4e1540 Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_trunk-1.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_trunk.png b/mods/moretrees/textures/moretrees_poplar_trunk.png new file mode 100644 index 0000000..47672fb Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_trunk_top.png b/mods/moretrees/textures/moretrees_poplar_trunk_top.png new file mode 100644 index 0000000..4c55858 Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_poplar_wood.png b/mods/moretrees/textures/moretrees_poplar_wood.png new file mode 100644 index 0000000..55e6b44 Binary files /dev/null and b/mods/moretrees/textures/moretrees_poplar_wood.png differ diff --git a/mods/moretrees/textures/moretrees_raw_coconut.png b/mods/moretrees/textures/moretrees_raw_coconut.png new file mode 100644 index 0000000..ca318ed Binary files /dev/null and b/mods/moretrees/textures/moretrees_raw_coconut.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_leaves.png b/mods/moretrees/textures/moretrees_rubber_tree_leaves.png new file mode 100644 index 0000000..e35f51b Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_sapling.png b/mods/moretrees/textures/moretrees_rubber_tree_sapling.png new file mode 100644 index 0000000..d2e06d0 Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk.png new file mode 100644 index 0000000..c5da574 Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png new file mode 100644 index 0000000..55423bc Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png new file mode 100644 index 0000000..25b86a9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_wood.png b/mods/moretrees/textures/moretrees_rubber_tree_wood.png new file mode 100644 index 0000000..3c83f0e Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_wood.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_leaves.png b/mods/moretrees/textures/moretrees_sequoia_leaves.png new file mode 100644 index 0000000..594c958 Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_sapling.png b/mods/moretrees/textures/moretrees_sequoia_sapling.png new file mode 100644 index 0000000..b11bc0b Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_trunk.png b/mods/moretrees/textures/moretrees_sequoia_trunk.png new file mode 100644 index 0000000..552cdf5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_trunk_top.png b/mods/moretrees/textures/moretrees_sequoia_trunk_top.png new file mode 100644 index 0000000..d1891fd Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_wood.png b/mods/moretrees/textures/moretrees_sequoia_wood.png new file mode 100644 index 0000000..2e43595 Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_wood.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_cone.png b/mods/moretrees/textures/moretrees_spruce_cone.png new file mode 100644 index 0000000..1c9da85 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_cone.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_leaves.png b/mods/moretrees/textures/moretrees_spruce_leaves.png new file mode 100644 index 0000000..6643b87 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_nuts.png b/mods/moretrees/textures/moretrees_spruce_nuts.png new file mode 100644 index 0000000..130c11c Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_nuts.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_sapling.png b/mods/moretrees/textures/moretrees_spruce_sapling.png new file mode 100644 index 0000000..0275afb Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_trunk.png b/mods/moretrees/textures/moretrees_spruce_trunk.png new file mode 100644 index 0000000..cc0c559 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_trunk_top.png b/mods/moretrees/textures/moretrees_spruce_trunk_top.png new file mode 100644 index 0000000..3876c5b Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_wood.png b/mods/moretrees/textures/moretrees_spruce_wood.png new file mode 100644 index 0000000..47aa326 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_wood.png differ diff --git a/mods/moretrees/textures/moretrees_willow_leaves.png b/mods/moretrees/textures/moretrees_willow_leaves.png new file mode 100644 index 0000000..e1d26d9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_willow_sapling.png b/mods/moretrees/textures/moretrees_willow_sapling.png new file mode 100644 index 0000000..18414de Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_willow_trunk.png b/mods/moretrees/textures/moretrees_willow_trunk.png new file mode 100644 index 0000000..a3bd5f0 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_willow_trunk_top.png b/mods/moretrees/textures/moretrees_willow_trunk_top.png new file mode 100644 index 0000000..c54c182 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_willow_wood.png b/mods/moretrees/textures/moretrees_willow_wood.png new file mode 100644 index 0000000..21c5742 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_wood.png differ diff --git a/mods/moretrees/tree_biomes.txt b/mods/moretrees/tree_biomes.txt new file mode 100644 index 0000000..b6a4fd0 --- /dev/null +++ b/mods/moretrees/tree_biomes.txt @@ -0,0 +1,34 @@ + + Elevation Temperature Nearness to Nearby What nodes Perlin Avoid +Tree type (m) (approx., °C) some node water to spawn on seed diff radius +-------------------------------------------------------------------------------------------------------------- +jungle tree - 5 to +10 above +15 water, 20 10 dirt_with_grass 329 5 +fir above +25 -20 to +10 n/a n/a dirt_with_grass 359 8 +firs on snow above +15 -20 to +10 n/a n/a snow:snow 359 8 +palm - 1 to + 1 +15 to +32 water, 15 10 sand 330 5 +date palm - 1 to +10 above +39 water, 20h,20v 100 desert_sand 339 10 +date palm +11 to +30 above +39 water, 1h,30v 1 desert_sand 340 10 +apple + 1 to +10 +23 to +32 n/a n/a dirt_with grass 331 15 +oak 0 to +10 + 4 to +16 n/a n/a dirt_with grass 332 15 +sequoia 0 to +10 -30 to +50 n/a n/a dirt_with grass 333 10 +birch +10 to +15 -20 to +10 n/a n/a dirt_with grass 334 5 +spruce above +20 -20 to +10 n/a n/a dirt_with grass 335 10 +cedar n/a n/a water, 15 5 dirt_with grass 336 10 +willow - 5 to + 5 n/a water, 15 5 dirt_with grass 337 20 +rubber - 5 to + 5 above +32 water, 15 10 dirt_with_grass 338 20 +poplar n/a -10 to +26 water, 15h,5v 1 dirt_with_grass 341,342,343 10 + +beech n/a n/a n/a n/a dirt_with_grass 2 10 + + +Notes: +------ + +Beech trees are meant to replace default trees, but are themselves disabled by default. They grow in the same areas +as the default ones do, and under the same conditions. + +Fir trees appear in a snow biome only with older versions of SPlizard's Snow Biomes mod. In more recent versions, +these trees will not grow, due to an engine bug. + +Cedar trees replace, and are identical to, the original pine trees, as the minetest default game now has (a completely +different type of) pine trees. diff --git a/mods/moretrees/tree_models.lua b/mods/moretrees/tree_models.lua new file mode 100644 index 0000000..7824ea6 --- /dev/null +++ b/mods/moretrees/tree_models.lua @@ -0,0 +1,280 @@ +moretrees.beech_model={ + axiom="FFFFFBFB", + -- luacheck: no max line length + rules_a="[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fdd]]", + rules_b="[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&Fd]//d[+^d][--&d]]", + rules_c="/", + rules_d="F", + trunk="moretrees:beech_trunk", + leaves="moretrees:beech_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.apple_tree_model={ + axiom="FFFFFAFFBF", + rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]", + rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]", + trunk="moretrees:apple_tree_trunk", + leaves="moretrees:apple_tree_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit=minetest.get_modpath("default") and "default:apple" or nil, + fruit_chance=minetest.get_modpath("default") and 15 or nil, +} + +moretrees.oak_model={ + axiom="FFFFFFA", + rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b="[&FFFA]////[&FFFA]////[&FFFA]", + trunk="moretrees:oak_trunk", + leaves="moretrees:oak_leaves", + angle=30, + iterations=5, + random_level=2, + trunk_type="crossed", + thin_branches=false, + fruit="moretrees:acorn", + fruit_chance=3, +} + +moretrees.poplar_model={ + axiom="TTTaaBCCCCCCCCCCCcccBBB[[f]&&G++f++Gf++Gf++Gf++G--]G[[f]&&G++f++Gf++Gf++Gf++G--]Gff", + rules_a="T", + rules_b="[[T]&&G++f++ff++ff++ff++f--]G", + rules_c="[[T]&&G++f++ff++ff++ff++f--G++[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G]G", + rules_d="f", + trunk="moretrees:poplar_trunk", + leaves="moretrees:poplar_leaves", + angle=45, + iterations=0, + random_level=0, + trunk_type="single", + thin_branches=false, +} + +moretrees.poplar_small_model={ + axiom="TT[T]BCCCCccBBff", + rules_a="T", + rules_b="[[f]&&G++f++Gf++Gf++Gf++G--]G", + rules_c="[[T]&&G++f++[d]Gf++[d]Gf++[d]Gf++[d]G--]G", + rules_d="f", + trunk="moretrees:poplar_trunk", + leaves="moretrees:poplar_leaves", + angle=45, + iterations=0, + random_level=0, + trunk_type="single", + thin_branches=false, +} + +moretrees.sequoia_model={ + axiom="FFFFFFFFFFddccA///cccFddcFA///ddFcFA/cFFddFcdBddd/A/ccdcddd/ccAddddcFBcccAccFdFcFBcccc/BFdFFcFFdcccc/B", + -- luacheck: no max line length + rules_a="[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]", + rules_b="[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", + rules_c="/", + rules_d="F", + trunk="moretrees:sequoia_trunk", + leaves="moretrees:sequoia_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true +} + +moretrees.birch_model1={ + axiom="FFFFFdddccA/FFFFFFcA/FFFFFFcB", + rules_a="[&&&dddd^^ddddddd][&&&---dddd^^ddddddd][&&&+++dddd^^ddddddd][&&&++++++dddd^^ddddddd]", + rules_b="[&&&ddd^^ddddd][&&&---ddd^^ddddd][&&&+++ddd^^ddddd][&&&++++++ddd^^ddddd]", + rules_c="/", + rules_d="F", + trunk="moretrees:birch_trunk", + leaves="moretrees:birch_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.birch_model2={ + axiom="FFFdddccA/FFFFFccA/FFFFFccB", + rules_a="[&&&dFFF^^FFFdd][&&&---dFFF^^FFFdd][&&&+++dFFF^^FFFdd][&&&++++++dFFF^^FFFdd]", + rules_b="[&&&dFF^^FFFd][&&&---dFFF^^FFFd][&&&+++dFF^^FFFd][&&&++++++dFF^^FFFd]", + rules_c="/", + rules_d="F", + trunk="moretrees:birch_trunk", + leaves="moretrees:birch_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +-- Coconuts can't be generated as fruit, because there is no support for the +-- special fruit trunks that allow coconuts to regrow at the correct position +-- in the tree. +-- So, a placeholder fruit trunk is spawned. An ABM will convert it to the final +-- fruit trunk, and generate the actual coconuts. +moretrees.palm_model={ + axiom="FFcccccc&FFFFFdddRA//A//A//A//A//A", + rules_a="[&fb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ffff&bbbb&b]", + rules_b="f", + rules_c="/", + rules_d="F", + trunk="moretrees:palm_trunk", + leaves="moretrees:palm_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="moretrees:palm_fruit_trunk_gen", + fruit_chance=0 +} + +-- Dates can't be generated as fruit, because there is no support for the +-- special (male and female) fruit trunks that allow dates to regrow at the +-- correct position in the tree. +-- So, a generic fruit trunk is spawned. An ABM will convert it to a male +-- or female fruit trunk, and generate the actual dates. +moretrees.date_palm_model={ + axiom="TTTTddddddddddccccccccccRT[TTT]".. + "ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]".. + "GGccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]".. + "GGccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]", + rules_a="Gffb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ff&ff&bb&bb&bb", + rules_b="f", + rules_c="/", + rules_d="F", + trunk="moretrees:date_palm_trunk", + leaves="moretrees:date_palm_leaves", + angle=18, + iterations=1, + random_level=0, + trunk_type="single", + thin_branches=false, + fruit="moretrees:date_palm_fruit_trunk", + fruit_chance=0 +} + +moretrees.spruce_model1={ + -- luacheck: no max line length + axiom="FFFFFAFFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", + rules_a="[&&&FFFFFF^^FFF][&&&++FFFFFF^^FFF][&&&++++FFFFFF^^FFF][&&&++++++FFFFFF^^FFF][&&&--FFFFFF^^FFF][&&&----FFFFFF^^FFF]", + rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", + rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", + rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]", + trunk="moretrees:spruce_trunk", + leaves="moretrees:spruce_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true, + fruit="moretrees:spruce_cone", + fruit_chance=8 +} + +moretrees.spruce_model2={ + -- luacheck: no max line length + axiom="FFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", + rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", + rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", + rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]", + trunk="moretrees:spruce_trunk", + leaves="moretrees:spruce_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true, + fruit="moretrees:spruce_cone", + fruit_chance=8 +} + +moretrees.cedar_model={ + axiom="FFFFFcccdddB///cFdFB////cFdFB///cFdFB///cFdFA///cFdFA///cFdFB[FF]f", + rules_a="[&&&TTTT[++^TFdd][--&TFd]//Tdd[+^Fd][--&Fdd]]", + rules_b="[&&&TTT[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", + rules_c="/", + rules_d="F", + trunk="moretrees:cedar_trunk", + leaves="moretrees:cedar_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="moretrees:cedar_cone", + fruit_chance=8 +} + +moretrees.willow_model={ + axiom="FFFFFFFFccA", + -- luacheck: no max line length + rules_a="[&FF&FFFF&&F&FFFFFFFdddd][**&FF&FFFF&&F&FFFFFFFdddd][//&FF&FFFF&&F&FFFFFFFdddd][////&FF&FFFF&&F&FFFFFFFdddd][//////&FF&FFFF&&F&FFFFFFFdddd][////////&FF&FFFF&&F&FFFFFFFdddd]", + rules_c="/", + rules_d="F", + trunk="moretrees:willow_trunk", + leaves="moretrees:willow_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true +} + +moretrees.rubber_tree_model={ + axiom="FFFFA", + rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b="[&FFA]////[&FFA]////[&FFA]", + trunk="moretrees:rubber_tree_trunk", + leaves="moretrees:rubber_tree_leaves", + angle=35, + iterations=3, + random_level=1, + trunk_type="double", + thin_branches=true +} + +moretrees.jungletree_model={ + axiom=nil, + rules_a=nil, + rules_b=nil, + trunk="moretrees:jungletree_trunk", + leaves=xcompat.materials.jungle_leaves, + leaves2=nil, + leaves2_chance=nil, + angle=45, + iterations=nil, + random_level=2, + trunk_type=nil, + thin_branches=true, + fruit_chance=15, + fruit="vines:vine" +} + +moretrees.fir_model={ + axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]Fff", + rules_a=nil, + rules_b=nil, + trunk="moretrees:fir_trunk", + leaves=nil, + angle=45, + iterations=7, + random_level=5, + trunk_type="single", + thin_branches=true, + fruit="moretrees:fir_cone", + fruit_chance=8 +} diff --git a/mods/nativevillages/LICENSE b/mods/nativevillages/LICENSE new file mode 100644 index 0000000..61ca1ac --- /dev/null +++ b/mods/nativevillages/LICENSE @@ -0,0 +1,30 @@ +MIT License + +Copyright (c) 2021 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Lincense for original Code (mobs redo + mobs_animal + mob_horse + mobs_npc): (MIT) Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2021 +Textures, Models and Animation by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2021 + +Human Sounds by Liil/Wilhelmine/Skandarella. Animal Sounds + Environment are from freesound.org under Creative Commons License. +Thanks to Roboroo, www-Bonson, Mixmasterdylan, Jarl Fenrir, Mafon2, Hamface, InspectorJ, Breviceps, Starcat 322 and Roman cgr! diff --git a/mods/nativevillages/arcticblocks.lua b/mods/nativevillages/arcticblocks.lua new file mode 100644 index 0000000..fcf8906 --- /dev/null +++ b/mods/nativevillages/arcticblocks.lua @@ -0,0 +1,67 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:sledge", { + description = S"Sledge", + visual_scale = 1, + mesh = "Sledge.b3d", + tiles = {"texturesledge.png"}, + inventory_image = "asledge.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.3, 0.5, 0.5, 1.3}, + --[[{-0.5, -0.5, -1.3, 0.5, 0.5, 1.3}, + {-0.5, -0.5, -1.3, 0.5, 0.5, 1.3}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.3, 0.5, 0.5, 1.3} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:bronzeblock", + recipe = "nativevillages:sledge", +}) + +minetest.register_node("nativevillages:blanket", { + description = S"Blanket", + visual_scale = 1, + mesh = "Blanket.b3d", + tiles = {"textureblanket.png"}, + inventory_image = "ablanket.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + --[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "mobs:leather", + recipe = "nativevillages:blanket", +}) \ No newline at end of file diff --git a/mods/nativevillages/arcticcreatures.lua b/mods/nativevillages/arcticcreatures.lua new file mode 100644 index 0000000..ec44a9f --- /dev/null +++ b/mods/nativevillages/arcticcreatures.lua @@ -0,0 +1,736 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:icedog", { + stepheight = 1, + type = "animal", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 6, + hp_min = 35, + hp_max = 55, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Icedog.b3d", + textures = { + {"textureicedog.png"}, + {"textureicedog2.png"}, + {"textureicedog3.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_dog2", + attack = "nativevillages_dog", + damage = "nativevillages_dog4", + death = "nativevillages_dog5", + }, + walk_velocity = 1, + run_velocity = 3, + jump = true, + jump_height = 3, + pushable = true, + stay_near = {{"people:dogfoodsack", "mobs:meatblock"}, 5}, + follow = {"mobs:meat_raw", "people:dogfood", "people:dogfood_cooked"}, + view_range = 6, + drops = { + }, + water_damage = 2, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 80, + stand_speed = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:icedog", + nodes = {"default:snowblock"}, + neighbors = {"nativevillages:sledge"}, + min_light = 14, + interval = 60, + chance = 8000, -- 15000 + active_object_count = 3, + min_height = 1, + max_height = 80, +}) +end + +mobs:register_egg("nativevillages:icedog", S("Ice Dog"), "aicedog.png") + + +mobs:alias_mob("nativevillages:icedog", "nativevillages:icedog") -- compatibility + +mobs.icesledgetrader_drops = { + "nativevillages:sledgewithdog", "nativevillages:icedog" +} + +mobs:register_mob("nativevillages:icesledgetrader", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 80, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Icesledgetrader.b3d", + drawtype = "front", + textures = { + {"textureicesledgetrader.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_icevillagermale2", + random = "nativevillages_icevillagermale", + damage = "nativevillages_icevillagermale4", + death = "nativevillages_icevillagermale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + stay_near = {{"nativevillages:sledge"}, 4}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.icesledgetrader_drops + if item:get_name() == "default:steel_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.icesledgetrader_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Trader dropped you an item for steel!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("NPC stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("NPC will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:icesledgetrader", + nodes = {"default:snowblock"}, + neighbors = {"nativevillages:sledge"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:icesledgetrader", S("Sledge Trader"), "aicesledgetrader.png") + +mobs.icevillagerfemale_drops = { + "mobs:meat", "mobs:leather", "wool:brown", "wool:white" +} + +mobs:register_mob("nativevillages:icevillagerfemale", { + type = "npc", + passive = false, + damage = 1, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Icevillagerfemale.b3d", + drawtype = "front", + textures = { + {"textureicevillagerfemale.png"}, + + }, + child_texture = { + {"textureicevillagerfemalebaby.png"}, + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_icevillagerfemale2", + random = "nativevillages_icevillagerfemale", + damage = "nativevillages_icevillagerfemale4", + death = "nativevillages_icevillagerfemale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + stay_near = {{"nativevillages:blanket"}, 5}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.icevillagerfemale_drops + if item:get_name() == "default:iron_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.icevillagerfemale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Icelander dropped you an item for iron!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Icelander stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, ("Icelander will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:icevillagerfemale", + nodes = {"default:snowblock", "wool:brown"}, + neighbors = {"nativevillages:blanket"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:icevillagerfemale", S("Female Icelander"), "aicevillagerfemale.png") + +mobs.icevillagermale_drops = { + "mobs:meat", "mobs:leather", "wool:brown", "wool:white" +} + +mobs:register_mob("nativevillages:icevillagermale", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 30, + hp_max = 70, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Icevillagermale.b3d", + drawtype = "front", + textures = { + {"textureicevillagermale.png"}, + + }, + child_texture = { + {"textureicevillagermalebaby.png"}, + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_icevillagermale2", + random = "nativevillages_icevillagermale", + damage = "nativevillages_icevillagermale4", + death = "nativevillages_icevillagermale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + stay_near = {{"nativevillages:blanket"}, 5}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.icevillagermale_drops + if item:get_name() == "default:iron_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.icevillagermale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Icelander dropped you an item for iron!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Icelander stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Icelander will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:icevillagermale", + nodes = {"default:snowblock", "wool:brown"}, + neighbors = {"nativevillages:blanket"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:icevillagermale", S("Male Icelander"), "aicevillagermale.png") + + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("nativevillages") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable sledge +mobs:register_mob("nativevillages:sledgewithdog", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Sledgewithdog.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 50, + run_speed = 125, + stand_start = 0, + stand_end = 100, + stand2_start = 200, + stand2_end = 300, + walk_speed = 85, + walk_start = 100, + walk_end = 200, + run_start = 100, + run_end = 200, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"texturesledgewithdog.png"}, + + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 0.1, + walk_velocity = 1.5, + view_range = 10, + follow = {"mobs:meat_raw", "people:dogfood", "people:dogfood_cooked"}, + passive = true, + hp_min = 100, + hp_max = 250, + armor = 100, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_dog2", + attack = "nativevillages_dog", + damage = "nativevillages_dog4", + death = "nativevillages_dog5", + }, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 7 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 6, z = -17} + self.driver_eye_offset = {x = 0, y = 5, z = -14} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("nativevillages:sledgewithdog", S("Sledge with Dog"), "asledwithdog.png") + diff --git a/mods/nativevillages/buyablestuff.lua b/mods/nativevillages/buyablestuff.lua new file mode 100644 index 0000000..70ce2c8 --- /dev/null +++ b/mods/nativevillages/buyablestuff.lua @@ -0,0 +1,879 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:tamecatfish", { + stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = true, + reach = 2, + damage = 1, + hp_min = 5, + hp_max = 55, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + visual = "mesh", + mesh = "Lakecatfish.b3d", + textures = { + {"texturecatfish1.png"}, + {"texturecatfish2.png"}, + {"texturecatfish3.png"}, + {"texturecatfish4.png"}, + {"texturecatfish5.png"}, + {"texturecatfish6.png"}, + }, + makes_footstep_sound = true, + sounds = { + }, + walk_velocity = 1, + run_velocity = 2, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + jump = true, + jump_height = 0, + pushable = true, + stay_near = {{"marinara:sand_with_alage", "marinara:sand_with_seagrass", "default:sand_with_kelp", "marinara:sand_with_kelp", "marinara:reed_root", "flowers:waterlily_waving", "naturalbiomes:waterlily", "default:clay"}, 5}, + follow = { + "ethereal:worm", "seaweed", "fishing:bait_worm", + "default:grass", "farming:cucumber", "farming:cabbage", "animalworld:ant", "animalworld:termite", "animalworld:fishfood", "animalworld:cockroach", "bees:frame_full", "animalworld:fishfood", "animalworld:ant", "animalworld:termite", "animalworld:bugice", "animalworld:termitequeen", "animalworld:notoptera", "animalworld:anteggs_raw", "group:grass", "group:normal_grass" + }, + view_range = 6, + drops = { + {name = "nativevillages:catfish_raw", chance = 1, min = 1, max = 3}, + }, + water_damage = 0, + air_damage = 1, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 200, + stand_end = 300, + fly_start = 0, + fly_end = 100, + fly2_start = 100, + fly2_end = 200, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + + + +mobs:register_egg("nativevillages:tamecatfish", S("Domesticated Catfish"), "alakecatfish.png") + + +mobs:alias_mob("nativevillages:tamecatfish", "nativevillages:tamecatfish") -- compatibility + + +-- raw catfish +minetest.register_craftitem(":nativevillages:catfish_raw", { + description = S("Raw Catfish"), + inventory_image = "nativevillages_catfish_raw.png", + on_use = minetest.item_eat(4), + groups = {food_meat_raw = 1, flammable = 2}, +}) + +-- cooked catfish +minetest.register_craftitem(":nativevillages:catfish_cooked", { + description = S("Cooked Catfish"), + inventory_image = "nativevillages_catfish_cooked.png", + on_use = minetest.item_eat(8), + groups = {food_meat = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "nativevillages:catfish_cooked", + recipe = "nativevillages:catfish_raw", + cooktime = 2, +}) + + +local S = mobs.intllib + +mobs:register_mob("nativevillages:zombietame", { + type = "npc", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 5, + hp_min = 55, + hp_max = 95, + armor = 100, + attacks_monsters = true, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Zombie2.b3d", + drawtype = "front", + textures = { + {"texturezombietame.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "nativevillages_tamedzombie2", + random = "nativevillages_tamedzombie", + damage = "nativevillages_tamedzombie3", + death = "nativevillages_tamedzombie4", + distance = 10, + }, + walk_velocity = 2, + run_velocity = 3, + jump = true, + drops = { + }, + stay_near = {{"nativevillages:cannibalshrine", "nativevillages:driedpeople"}, 5}, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"nativevillages:driedhumanmeat"}, + view_range = 20, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Zombie stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Zombie will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:zombietame", S("Tamed Zombie"), "azombietame.png" ) + +mobs:register_mob("nativevillages:domesticcow", { + type = "animal", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + group_attack = true, + reach = 2, + damage = 4, + hp_min = 5, + hp_max = 55, + armor = 100, + collisionbox = {-0.6, -0.01, -0.4, 0.6, 1.2, 0.4}, + visual = "mesh", + mesh = "Grasslandcow.b3d", + textures = { + {"texturegrasslandcow.png"}, + {"texturegrasslandcow2.png"}, + {"texturegrasslandcow3.png"}, + {"texturegrasslandcow4.png"}, + {"texturegrasslandcow5.png"}, + {"texturegrasslandcow6.png"}, + {"texturegrasslandcow7.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_cow", + attack = "nativevillages_cow2", + damage = "nativevillages_cow3", + }, + walk_velocity = 1, + run_velocity = 2, + jump = false, + jump_height = 6, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + stepheight = 1, + fear_height = 2, + pushable = true, + knock_back = false, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 1, max = 3}, + {name = "mobs:leather", chance = 1, min = 0, max = 2}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + follow = { + "farming:wheat", "default:grass_1", "farming:barley", + "farming:oat", "farming:rye", "farming:carrot", "farming:beans", "farming:lettuce", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass" + }, + view_range = 8, + replace_rate = 10, + replace_what = { + {"group:grass", "air", 0}, + {"default:dirt_with_grass", "default:dirt", -1} + }, +-- stay_near = {"farming:straw", "group:grass"}, 10}, + fear_height = 2, + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 8, true, true) then + + -- if fed 7x wheat or grass then cow can be milked again + if self.food and self.food > 6 then + self.gotten = false + end + + return + end + + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 0, 25, false, nil) then return end + + local tool = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- milk cow with empty bucket + if tool:get_name() == "bucket:bucket_empty" then + + --if self.gotten == true + if self.child == true then + return + end + + if self.gotten == true then + minetest.chat_send_player(name, + S("Cow already milked!")) + return + end + + local inv = clicker:get_inventory() + + tool:take_item() + clicker:set_wielded_item(tool) + + if inv:room_for_item("main", {name = "nativevillages:bucket_milk"}) then + clicker:get_inventory():add_item("main", "nativevillages:bucket_milk") + else + local pos = self.object:get_pos() + pos.y = pos.y + 0.5 + minetest.add_item(pos, {name = "nativevillages:bucket_milk"}) + end + + self.gotten = true -- milked + + return + end + end, + + on_replace = function(self, pos, oldnode, newnode) + + self.food = (self.food or 0) + 1 + + -- if cow replaces 8x grass then it can be milked again + if self.food >= 8 then + self.food = 0 + self.gotten = false + end + end, +}) + + + +mobs:register_egg("nativevillages:domesticcow", S("Domesticated Cow"), "agrasslandcow.png") + + +mobs:alias_mob("nativevillages:domesticcow", "nativevillages:domesticcow") -- compatibility + + +-- bucket of milk +minetest.register_craftitem(":nativevillages:bucket_milk", { + description = S("Bucket of Milk"), + inventory_image = "nativevillages_bucket_milk.png", + stack_max = 1, + on_use = minetest.item_eat(8, "bucket:bucket_empty"), + groups = {food_milk = 1, flammable = 3, drink = 1}, +}) + +-- glass of milk +minetest.register_craftitem(":mobs:glass_milk", { + description = S("Glass of Milk"), + inventory_image = "mobs_glass_milk.png", + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = {food_milk_glass = 1, flammable = 3, vessel = 1, drink = 1}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mobs:glass_milk 4", + recipe = { + "vessels:drinking_glass", "vessels:drinking_glass", + "vessels:drinking_glass", "vessels:drinking_glass", + "nativevillages:bucket_milk" + }, + replacements = { {"nativevillages:bucket_milk", "bucket:bucket_empty"} } +}) + +minetest.register_craft({ + type = "shapeless", + output = "nativevillages:bucket_milk", + recipe = { + "group:food_milk_glass", "group:food_milk_glass", + "group:food_milk_glass", "group:food_milk_glass", + "bucket:bucket_empty" + }, + replacements = { + {"group:food_milk_glass", "vessels:drinking_glass 4"}, + } +}) + + +-- butter +minetest.register_craftitem(":nativevillages:butter", { + description = S("Butter"), + inventory_image = "nativevillages_butter.png", + on_use = minetest.item_eat(1), + groups = {food_butter = 1, flammable = 2}, +}) + +if minetest.get_modpath("farming") and farming and farming.mod then +minetest.register_craft({ + type = "shapeless", + output = "nativevillages:butter", + recipe = {"nativevillages:bucket_milk", "farming:salt"}, + replacements = {{ "nativevillages:bucket_milk", "bucket:bucket_empty"}} +}) +else -- some saplings are high in sodium so makes a good replacement item +minetest.register_craft({ + type = "shapeless", + output = "nativevillages:butter", + recipe = {"nativevillages:bucket_milk", "default:sapling"}, + replacements = {{ "nativevillages:bucket_milk", "bucket:bucket_empty"}} +}) +end + +-- cheese wedge +minetest.register_craftitem(":nativevillages:cheese", { + description = S("Mozzarella Cheese"), + inventory_image = "nativevillages_cheese.png", + on_use = minetest.item_eat(4), + groups = {food_cheese = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "nativevillages:cheese", + recipe = "nativevillages:bucket_milk", + cooktime = 5, + replacements = {{ "nativevillages:bucket_milk", "bucket:bucket_empty"}} +}) + +-- cheese block +minetest.register_node(":nativevillages:cheeseblock", { + description = S("Mozzarella Cheese Block"), + tiles = {"nativevillages_cheeseblock.png"}, + is_ground_content = false, + groups = {crumbly = 3}, + sounds = default.node_sound_dirt_defaults() +}) + +minetest.register_craft({ + output = "nativevillages:cheeseblock", + recipe = { + {"nativevillages:cheese", "nativevillages:cheese", "nativevillages:cheese"}, + {"nativevillages:cheese", "nativevillages:cheese", "nativevillages:cheese"}, + {"nativevillages:cheese", "nativevillages:cheese", "nativevillages:cheese"}, + } +}) + +minetest.register_craft({ + output = "nativevillages:cheese 9", + recipe = { + {"nativevillages:cheeseblock"}, + } +}) + +mobs:register_mob("nativevillages:desertchickentame", { +stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 1, + hp_min = 10, + hp_max = 25, + armor = 100, + collisionbox = {-0.4, -0.01, -0.3, 0.4, 0.8, 0.4}, + visual = "mesh", + mesh = "Desertchicken.b3d", + textures = { + {"texturedesertchicken.png"}, + {"texturedesertchicken2.png"}, + {"texturedesertchicken3.png"}, + {"texturedesertchicken4.png"}, + + }, + child_texture = { + {"texturedesertchickenbaby.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_chicken", + damage = "nativevillages_chicken2", + death = "nativevillages_chicken3", + }, + walk_velocity = 0.5, + run_velocity = 3, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"}, + drops = { + {name = "nativevillages:chicken_raw", chance = 1, min = 1, max = 1}, + }, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + fear_height = 3, + animation = { + speed_normal = 75, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + follow = { + "farming:seed_wheat", "farming:seed_cotton", "farming:seed_barley", + "farming:seed_oat", "farming:seed_rye", "animalworld:cockroach", "bees:frame_full", "animalworld:fishfood", "animalworld:ant", "animalworld:termite", "animalworld:bugice", "animalworld:termitequeen", "animalworld:notoptera", "animalworld:anteggs_raw", "farming:corn_cob", "farming:seed_hemp", "farming:seed_barley", "farming:seed_oat", "farming:seed_cotton", "farming:seed_sunflower", "farming:seed_wheat", "farming:seed_rye", "naturalbiomes:coconut_slice", "naturalbiomes:hazelnut_cracked", "farming:sunflower_seeds_toasted", "livingfloatlands:roasted_pine_nuts", "livingfloatlands:coldsteppe_pine3_pinecone", "livingfloatlands:coldsteppe_pine_pinecone", "livingfloatlands:coldsteppe_pine2_pinecone" + }, + view_range = 10, + + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, + + do_custom = function(self, dtime) + + self.egg_timer = (self.egg_timer or 0) + dtime + if self.egg_timer < 10 then + return + end + self.egg_timer = 0 + + if self.child + or math.random(1, 100) > 1 then + return + end + + local pos = self.object:get_pos() + + minetest.add_item(pos, "mobs:egg") + + minetest.sound_play("default_place_node_hard", { + pos = pos, + gain = 1.0, + max_hear_distance = 5, + }) + end, +}) + + +mobs:register_egg("nativevillages:desertchickentame", S("Domesticated Desert Chicken"), "adesertchicken.png", 0) + +local S = mobs.intllib + +mobs:register_mob("nativevillages:maleliontame", { + type = "npc", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + attack_monsters = true, + reach = 2, + damage = 10, + hp_min = 45, + hp_max = 115, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Lionmale.b3d", + drawtype = "front", + textures = { + {"texturelionmale.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "nativevillages_lion2", + random = "nativevillages_lion", + damage = "nativevillages_lion4", + death = "nativevillages_lion3", + distance = 10, + }, + walk_velocity = 2, + run_velocity = 3, + jump = true, + stepheight = 2, + fear_height = 3, + stay_near = {{"nativevillages:savannacorpse", "mobs:meatblock"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, +follow = { + "ethereal:fish_raw", "animalworld:rawfish", "mobs_fish:tropical", + "mobs:meat_raw", "animalworld:rabbit_raw", "animalworld:pork_raw", "water_life:meat_raw", "animalworld:chicken_raw", "nativevillages:chicken_raw", "mobs:meatblock_raw", "animalworld:chicken_raw", "livingfloatlands:ornithischiaraw", "livingfloatlands:largemammalraw", "livingfloatlands:theropodraw", "livingfloatlands:sauropodraw", "animalworld:raw_athropod", "animalworld:whalemeat_raw", "animalworld:rabbit_raw", "nativevillages:chicken_raw", "mobs:meat_raw", "animalworld:pork_raw", "people:mutton:raw" + }, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { +speed_normal = 75, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Lion stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Lion will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:maleliontame", S("Tamed Male Lion"), "amalelion.png" ) + +local S = mobs.intllib + +mobs:register_mob("nativevillages:femaleliontame", { + type = "npc", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + attack_monsters = true, + reach = 2, + damage = 7, + hp_min = 45, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Lionfemale.b3d", + drawtype = "front", + textures = { + {"texturelionfemale.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "nativevillages_lion2", + random = "nativevillages_lion", + damage = "nativevillages_lion4", + death = "nativevillages_lion3", + distance = 10, + }, + walk_velocity = 2, + run_velocity = 3, + jump = true, + drops = { + }, + stay_near = {{"nativevillages:savannacorpse", "mobs:meatblock"}, 5}, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + stepheight = 2, + fear_height = 3, +follow = { + "ethereal:fish_raw", "animalworld:rawfish", "mobs_fish:tropical", + "mobs:meat_raw", "animalworld:rabbit_raw", "animalworld:pork_raw", "water_life:meat_raw", "animalworld:chicken_raw", "nativevillages:chicken_raw", "mobs:meatblock_raw", "animalworld:chicken_raw", "livingfloatlands:ornithischiaraw", "livingfloatlands:largemammalraw", "livingfloatlands:theropodraw", "livingfloatlands:sauropodraw", "animalworld:raw_athropod", "animalworld:whalemeat_raw", "animalworld:rabbit_raw", "nativevillages:chicken_raw", "mobs:meat_raw", "animalworld:pork_raw", "people:mutton:raw" + }, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { +speed_normal = 75, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Lion stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Lion will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:femaleliontame", S("Tamed Female Lion"), "afemalelion.png" ) + +mobs:register_mob("nativevillages:grasslandcat", { + stay_near = {"singleplayer", 10}, + type = "animal", + visual = "mesh", + mesh = "Grasslandcat.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + animation = { + speed_normal = 100, + stand_speed = 50, + stand_start = 0, + stand_end = 100, + stand2_speed = 50, + stand2_start = 100, + stand2_end = 200, + stand3_speed = 50, + stand3_start = 200, + stand3_end = 300, + stand4_speed = 50, + stand4_start = 0, + stand4_end = 100, + stand5_speed = 50, + stand5_start = 200, + stand5_end = 300, + walk_start = 300, + walk_end = 400, + punch_start = 400, + punch_end = 500, + die_start = 400, + die_end = 500, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"texturegrasslandcat.png"}, + {"texturegrasslandcat2.png"}, + {"texturegrasslandcat3.png"}, + {"texturegrasslandcat4.png"}, + {"texturegrasslandcat5.png"}, + }, + fear_height = 5, + stepheight = 2, + runaway = false, + jump = true, + jump_height = 8, + stay_near = {{"people:villagerbed", "mobs:meatblock", "animalworld:blackbirdpillow", "animalworld:hyenapillow", "animalworld:monitorstool", "animalworld:owltrophy", "animalworld:vulturepillow", "animalworld:snowleopardpillow", "animalworld:tigerpillow", "animalworld:tigerstool", "chair"}, 5}, + fly = false, + walk_velocity = 2, + walk_chance = 15, + run_velocity = 3, + view_range = 12, + passive = false, + attack_type = "dogfight", + damage = 4, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npcs = false, + pathfinding = true, + group_attack = true, + hp_min = 25, + hp_max = 75, + armor = 100, + knock_back = 2, + lava_damage = 5, + fall_damage = 1, + water_damage = 1, + makes_footstep_sound = true, + sounds = { + attack = "nativevillages_cat", + random = "nativevillages_cat2", + damage = "nativevillages_cat3", + death = "nativevillages_cat4", + distance = 10, + }, + follow = {"ethereal:fish_raw", "animalworld:rawfish", "mobs_fish:tropical", + "mobs:meat_raw", "animalworld:rabbit_raw", "xocean:fish_edible", "fishing:fish_raw", "water_life:meat_raw", "fishing:carp_raw", "animalworld:chicken_raw", "nativevillages:chicken_raw", "nativevillages:chicken_cooked", "nativevillages:catfish_raw", "nativevillages:catfish_cooked", "fishing:fish_cooked", "marinaramobs:cooked_exotic_fish", "animalworld:cookedfish", "marinara:mussels", "nativevillages:catfish_cooked", "fishing:pike_cooked", "animalworld:cooked_athropod", "livingfloatlands:theropodcooked", "mobs:meatblock", "animalworld:whelaemeat_cooked", "animalworld:rat_cooked", "mobs:meat", "animalworld:chicken_cooked", "livingfloatlands:sauropodcooked", "livingfloatlands:ornithischiacooked", "nativevillages:driedhumanmeat", "livingfloatlands:largemammalcooked", "pie:meat"}, + on_rightclick = function(self, clicker) + if mobs:feed_tame(self, clicker, 6, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + + if clicker:get_wielded_item():is_empty() and clicker:get_player_name() == self.owner then + if clicker:get_player_control().sneak then + self.order = "" + self.state = "walk" + self.walk_velocity = 2 + self.stepheight = 2 + else + if self.order == "follow" then + self.order = "stand" + self.state = "stand" + self.walk_velocity = 2 + self.stepheight = 2 + else + self.order = "follow" + self.state = "walk" + self.walk_velocity = 3 + self.stepheight = 2 + end + end + return + end + end +}) + +mobs:register_egg("nativevillages:grasslandcat", S"Cat", "agrasslandcat.png") + diff --git a/mods/nativevillages/cannibalblocks.lua b/mods/nativevillages/cannibalblocks.lua new file mode 100644 index 0000000..c09d289 --- /dev/null +++ b/mods/nativevillages/cannibalblocks.lua @@ -0,0 +1,68 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:driedpeople", { + description = S"Dried Human Remains", + tiles = { + "nativevillages_driedpeople_top.png", + "nativevillages_driedpeople_bottom.png", + "nativevillages_driedpeople_right.png", + "nativevillages_driedpeople_left.png", + "nativevillages_driedpeople_back.png", + "nativevillages_driedpeople_front.png" + }, + groups = {crumbly = 3}, + drop = "nativevillages:driedhumanmeat 9", + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_craft({ + output = "nativevillages:driedpeople", + recipe = { + {"nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat"}, + {"nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat"}, + {"nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat"}, + } +}) + + +minetest.register_craftitem(":nativevillages:driedhumanmeat", { + description = S("Dried Human Meat"), + inventory_image = "nativevillages_driedhumanmeat.png", + on_use = minetest.item_eat(2), + groups = {mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, +}) + + +minetest.register_node("nativevillages:cannibalshrine", { + description = S"Cannibal Shrine", + visual_scale = 1, + mesh = "Cannibalshrine.b3d", + tiles = {"texturecannibalshrine.png"}, + inventory_image = "acannibalshrine.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + walkable = false, + drawtype = "mesh", + collision_box = { + type = "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}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:bronzeblock", + recipe = "nativevillages:cannibalshrine", +}) \ No newline at end of file diff --git a/mods/nativevillages/depends.txt b/mods/nativevillages/depends.txt new file mode 100644 index 0000000..b7c402e --- /dev/null +++ b/mods/nativevillages/depends.txt @@ -0,0 +1,10 @@ +mobs +default +people +farming +bucket +animalworld? +ethereal? +xocean? +fishing? +hunger_ng? \ No newline at end of file diff --git a/mods/nativevillages/description.txt b/mods/nativevillages/description.txt new file mode 100644 index 0000000..1d23429 --- /dev/null +++ b/mods/nativevillages/description.txt @@ -0,0 +1 @@ +Adds villages of native people to the world. \ No newline at end of file diff --git a/mods/nativevillages/desertblocks.lua b/mods/nativevillages/desertblocks.lua new file mode 100644 index 0000000..8f1e37b --- /dev/null +++ b/mods/nativevillages/desertblocks.lua @@ -0,0 +1,134 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:hookah", { + description = S"Hookah", + visual_scale = 1, + mesh = "Hookah.b3d", + tiles = {"texturehookah.png"}, + inventory_image = "ahookah.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, 0.5, 0.2}, + --[[{-0.2, -0.5, -0.2, 0.2, 0.5, 0.2}, + {-0.2, -0.5, -0.2, 0.2, 0.5, 0.2}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, 0.5, 0.2} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:bronzeblock", + recipe = "nativevillages:hookah", +}) + +minetest.register_node("nativevillages:desertcrpet", { + description = S"Desert Carpet", + visual_scale = 1, + mesh = "Desertcarpet.b3d", + tiles = {"texturedesertcarpet.png"}, + inventory_image = "adesertcarpet.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + --[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "wool:red", + recipe = "nativevillages:desertcarpet", +}) + +minetest.register_node("nativevillages:desertcage", { + description = S"Slave Bracelet", + visual_scale = 1, + mesh = "Desertcage.b3d", + tiles = {"texturedesertcage.png"}, + inventory_image = "adesertcage.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + walkable = false, + drawtype = "mesh", + collision_box = { + type = "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}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steelblock", + recipe = "nativevillages:desertcage", +}) + +minetest.register_node("nativevillages:desertseeds", { + description = S"Desert Seeds", + visual_scale = 1, + mesh = "Desertseeds.b3d", + tiles = {"texturedesertseeds.png"}, + inventory_image = "adesertseeds.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + --[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "farming:bread", + recipe = "nativevillages:deserseeds", +}) \ No newline at end of file diff --git a/mods/nativevillages/desertbuildings.lua b/mods/nativevillages/desertbuildings.lua new file mode 100644 index 0000000..91c4b14 --- /dev/null +++ b/mods/nativevillages/desertbuildings.lua @@ -0,0 +1,121 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:deserthouse1", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse1_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:deserthouse2", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse2_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:deserthouse3", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse3_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:deserthouse4", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse4_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:deserthouse5", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse5_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:desertwell", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00004, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/desertwell_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:desertmarket", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00008, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/desertmarket_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:desertstable", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00004, + biomes = {"desert"}, + y_max = 30.5, + y_min = 25.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/deserstable_30_0.mts", + flags = "force_placement", + rotation = "random", +}) \ No newline at end of file diff --git a/mods/nativevillages/desertcreatures.lua b/mods/nativevillages/desertcreatures.lua new file mode 100644 index 0000000..94cd954 --- /dev/null +++ b/mods/nativevillages/desertcreatures.lua @@ -0,0 +1,878 @@ +local S = minetest.get_translator("nativevillages") + +mobs.desertvillagermale_drops = { + "farming:salt" +} + +mobs:register_mob("nativevillages:desertvillagermale", { + type = "monster", + passive = false, + damage = 2, + attack_type = "dogfight", + attacks_monsters = false, + attack_npcs = true, + owner_loyal = true, + pathfinding = true, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Desertvillagermale.b3d", + drawtype = "front", + textures = { + {"texturedesertvillagermale.png"}, + {"texturedesertvillagermale2.png"}, + {"texturedesertvillagermale3.png"}, + {"texturedesertvillagermale4.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_desertmale2", + random = "nativevillages_desertmale", + damage = "nativevillages_desertmale4", + death = "nativevillages_desertmaledesertmale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:hookah", "nativevillages:desertcrpet"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 75, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.desertvillagermale_drops + if item:get_name() == "default:stick" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.desertvillagermale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Desert Villager dropped you an item for a stick!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Desert Villager stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Desert Villager will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:desertvillagermale", + nodes = {"default:desert_sand", "group:wool"}, + neighbors = {"nativevillages:desertcrpet"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:desertvillagermale", S("Male Desert Villager"), "adesertvillagermale.png") + +mobs.desertvillagerfemale_drops = { + "farming:salt" +} + +mobs:register_mob("nativevillages:desertvillagerfemale", { + type = "monster", + passive = false, + damage = 1, + attack_type = "dogfight", + attacks_monsters = false, + attack_npcs = true, + owner_loyal = true, + pathfinding = true, + hp_min = 20, + hp_max = 40, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Desertvillagerfemale.b3d", + drawtype = "front", + textures = { + {"texturedesertvillagerfemale.png"}, + {"texturedesertvillagerfemale2.png"}, + {"texturedesertvillagerfemale3.png"}, + {"texturedesertvillagerfemale4.png"}, + {"texturedesertvillagerfemale5.png"}, + {"texturedesertvillagerfemale6.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_desertfemale2", + random = "nativevillages_desertfemale", + damage = "nativevillages_desertfemale4", + death = "nativevillages_desertfemale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:hookah", "nativevillages:desertcrpet"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 75, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.desertvillagerfemale_drops + if item:get_name() == "default:stick" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.desertvillagerfemale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Desert Villager dropped you an item for a stick!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Desert Villager stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Desert will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:desertvillagerfemale", + nodes = {"default:desert_sand", "group:wool"}, + neighbors = {"nativevillages:desertcrpet"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:desertvillagerfemale", S("Female Desert Villager"), "adesertvillagerfemale.png") + +mobs.desertslavetrader_drops = { + "nativevillages:slavechickenbreeder", "nativevillages:slavecowherder", "nativevillages:slaveliontrainer", + "nativevillages:slavefemaledancer", "nativevillages:slaveloyalcannibal", "nativevillages:slavemaledancer" +} + +mobs:register_mob("nativevillages:desertslavetrader", { + type = "npc", + passive = false, + damage = 5, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Desertslavetrader.b3d", + drawtype = "front", + textures = { + {"texturedesertslavetrader.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_desertmale2", + random = "nativevillages_desertmale", + damage = "nativevillages_desertmale4", + death = "nativevillages_desertmale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + stay_near = {{"nativevillages:desertcage"}, 4}, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 75, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.desertslavetrader_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.desertslavetrader_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Slave delivered!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Slavetrader stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Slavetrader will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:desertslavetrader", + nodes = {"default:desert_sand", "group:wool"}, + neighbors = {"nativevillages:desertcage"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:desertslavetrader", S("Slave Trader"), "adesertslavetrader.png") + +mobs:register_mob("nativevillages:desertranger", { + type = "monster", + passive = false, + damage = 7, + raeach = 4, + attack_type = "dogfight", + attacks_monsters = false, + attack_npcs = true, + attack_player = true, + owner_loyal = true, + pathfinding = true, + hp_min = 50, + hp_max = 85, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Desertranger.b3d", + drawtype = "front", + textures = { + {"texturedesertranger.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_desertmale2", + random = "nativevillages_desertmale", + damage = "nativevillages_desertmale4", + death = "nativevillages_desertmaledesertmale3", + distance = 10, + }, + walk_velocity = 2, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + {name = "default:apple", chance = 2, min = 1, max = 2}, + {name = "default:sword_stone", chance = 5, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 100, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:desertranger", + nodes = {"default:desert_sand", "group:wool"}, + neighbors = {"nativevillages:hookah"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:desertranger", S("Desert Ranger"), "adesertranger.png") + + +mobs:register_mob("nativevillages:desertraider", { + type = "monster", + passive = false, + damage = 7, + attack_type = "dogfight", + attacks_monsters = false, + attack_npcs = true, + owner_loyal = true, + pathfinding = true, + hp_min = 50, + hp_max = 100, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Desertraider.b3d", + drawtype = "front", + textures = { + {"texturedesertraider.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_desertmale2", + random = "nativevillages_desertmale", + damage = "nativevillages_desertmale4", + death = "nativevillages_desertmale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + {name = "default:apple", chance = 2, min = 1, max = 2}, + {name = "default:sword_stone", chance = 5, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 100, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, +on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:desertraider", + nodes = {"default:desert_sand", "group:wool"}, + neighbors = {"nativevillages:hookah"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:desertraider", S("Desert Raider"), "adesertraider.png") + +mobs:register_mob("nativevillages:desertchicken", { +stepheight = 1, + type = "animal", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 3, + hp_min = 10, + hp_max = 20, + armor = 100, + collisionbox = {-0.4, -0.01, -0.3, 0.4, 0.8, 0.4}, + visual = "mesh", + mesh = "Desertchicken.b3d", + textures = { + {"texturedesertchicken.png"}, + + }, + child_texture = { + {"texturedesertchickenbaby.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_chicken", + damage = "nativevillages_chicken2", + death = "nativevillages_chicken3", + }, + walk_velocity = 1, + run_velocity = 3, + stay_near = {{"nativevillages:desertseeds"}, 4}, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"}, + drops = { + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + fear_height = 3, + animation = { + speed_normal = 100, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + follow = {}, + view_range = 10, + + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, + + do_custom = function(self, dtime) + + self.egg_timer = (self.egg_timer or 0) + dtime + if self.egg_timer < 10 then + return + end + self.egg_timer = 0 + + if self.child + or math.random(1, 100) > 1 then + return + end + + local pos = self.object:get_pos() + + minetest.add_item(pos, "mobs:egg") + + minetest.sound_play("default_place_node_hard", { + pos = pos, + gain = 1.0, + max_hear_distance = 5, + }) + end, +}) + + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:desertchicken", + nodes = {"default:clay", "default:desert_sand"}, + neighbors = {"nativevillages:desertseeds"}, + min_light = 0, + interval = 60, + chance = 1, -- 15000 + active_object_count = 3, + min_height = 0, + max_height = 100, +}) +end + + +mobs:register_egg("nativevillages:desertchicken", S("Desert Chicken"), "adesertchicken.png", 0) + + + + +-- egg entity + +mobs:register_arrow("nativevillages:egg_entity", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"mobs_chicken_egg.png"}, + velocity = 6, + + hit_player = function(self, player) + player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = 1}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = 1}, + }, nil) + end, + + hit_node = function(self, pos, node) + + if math.random(1, 10) > 1 then + return + end + + pos.y = pos.y + 1 + + local nod = minetest.get_node_or_nil(pos) + + if not nod + or not minetest.registered_nodes[nod.name] + or minetest.registered_nodes[nod.name].walkable == true then + return + end + + local mob = minetest.add_entity(pos, "nativevillages:desertchicken") + local ent2 = mob:get_luaentity() + + mob:set_properties({ + textures = ent2.child_texture[1], + visual_size = { + x = ent2.base_size.x / 2, + y = ent2.base_size.y / 2 + }, + collisionbox = { + ent2.base_colbox[1] / 2, + ent2.base_colbox[2] / 2, + ent2.base_colbox[3] / 2, + ent2.base_colbox[4] / 2, + ent2.base_colbox[5] / 2, + ent2.base_colbox[6] / 2 + }, + }) + + ent2.child = true + ent2.tamed = true + ent2.owner = self.playername + end +}) + + +-- egg throwing item + +local egg_GRAVITY = 9 +local egg_VELOCITY = 19 + +-- shoot egg +local mobs_shoot_egg = function (item, player, pointed_thing) + + local playerpos = player:get_pos() + + minetest.sound_play("default_place_node_hard", { + pos = playerpos, + gain = 1.0, + max_hear_distance = 5, + }) + + local obj = minetest.add_entity({ + x = playerpos.x, + y = playerpos.y +1.5, + z = playerpos.z + }, "nativevillages:egg_entity") + + local ent = obj:get_luaentity() + local dir = player:get_look_dir() + + ent.velocity = egg_VELOCITY -- needed for api internal timing + ent.switch = 1 -- needed so that egg doesn't despawn straight away + + obj:setvelocity({ + x = dir.x * egg_VELOCITY, + y = dir.y * egg_VELOCITY, + z = dir.z * egg_VELOCITY + }) + + obj:setacceleration({ + x = dir.x * -3, + y = -egg_GRAVITY, + z = dir.z * -3 + }) + + -- pass player name to egg for chick ownership + local ent2 = obj:get_luaentity() + ent2.playername = player:get_player_name() + + item:take_item() + + return item +end + + +-- egg +minetest.register_node(":nativevillages:egg", { + description = S("Bird Egg"), + tiles = {"mobs_chicken_egg.png"}, + inventory_image = "mobs_chicken_egg.png", + visual_scale = 0.7, + drawtype = "plantlike", + wield_image = "mobs_chicken_egg.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {food_egg = 1, snappy = 2, dig_immediate = 3}, + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name = "nativevillages:egg", param2 = 1}) + end + end, + on_use = mobs_shoot_egg +}) + + +-- fried egg +minetest.register_craftitem(":nativevillages:chicken_egg_fried", { + description = S("Fried Desert Chicken Egg"), + inventory_image = "nativevillages_chicken_egg_fried.png", + on_use = minetest.item_eat(2), + groups = {food_egg_fried = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "nativevillages:egg", + output = "nativevillages:chicken_egg_fried", +}) + +-- raw chicken +minetest.register_craftitem(":nativevillages:chicken_raw", { +description = S("Raw Desert Chicken meat"), + inventory_image = "nativevillages_chicken_raw.png", + on_use = minetest.item_eat(2), + groups = {food_meat_raw = 1, food_chicken_raw = 1, flammable = 2}, +}) + +-- cooked chicken +minetest.register_craftitem(":nativevillages:chicken_cooked", { +description = S("Cooked Desert Chicken"), + inventory_image = "nativevillages_chicken_cooked.png", + on_use = minetest.item_eat(6), + groups = {food_meat = 1, food_chicken = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "nativevillages:chicken_raw", + output = "nativevillages:chicken_cooked", +}) + + diff --git a/mods/nativevillages/explodingtoad.lua b/mods/nativevillages/explodingtoad.lua new file mode 100644 index 0000000..42f1ff0 --- /dev/null +++ b/mods/nativevillages/explodingtoad.lua @@ -0,0 +1,218 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:toad", { +stepheight = 3, + type = "monster", + passive = false, + attack_type = "explode", + explosion_radius = 1, + explosion_damage__radius = 3, + explosion_timer = 4, + attack_npcs = false, + attack_animals = false, + reach = 3, + damage = 18, + hp_min = 15, + hp_max = 30, + armor = 100, + collisionbox = {-0.268, -0.01, -0.268, 0.268, 0.25, 0.268}, + visual = "mesh", + mesh = "Toad.b3d", + drawtype = "front", + textures = { + {"texturetoad.png"}, + + }, +sounds = { + random = "",}, + makes_footstep_sound = true, + walk_velocity = 1.5, + run_velocity = 2, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"}, + jump = true, + jump_height = 6, + sounds = { + attack = "nativevillages_toad", + random = "nativevillages_toad2", + damage = "nativevillages_toad", + death = "nativevillages_toad", + distance = 10, + }, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 50, + stand_start = 1, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + fly_start = 300, -- swim animation + fly_end = 400, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"}, + floats = 0, + follow = {"fishing:bait:worm", "ethereal:worm", "animalworld:ant", "animalworld:termite"}, + view_range = 13, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 25, 0, false, nil) then return end + end, +}) + + +if minetest.get_modpath("ethereal") then + spawn_on = "ethereal:prairie_dirt", "default:dirt_with_grass", "ethereal:green_dirt" +end + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:toad", + nodes = {"default:dirt_with_grass"}, {"default:dirt_with_rainforest_litter"}, {"default:dry_dirt_with_dry_grass"}, + neighbors = {"group:grass", "group:normal_grass"}, + min_light = 0, + interval = 60, + chance = 2000, -- 15000 + active_object_count = 1, + min_height = 1, + max_height = 15, + day_toogle = false +}) +end + + +mobs:register_egg("nativevillages:toad", S("Toad"), "atoad.png", 0) + + +mobs:alias_mob("nativevillages:toad", "nativevillages:toad") -- compatibility + + +mobs:register_mob("nativevillages:toadtamed", { +stepheight = 3, + type = "NPC", + passive = false, + attack_type = "explode", + explosion_radius = 1, + explosion_damage__radius = 3, + explosion_timer = 4, + attack_npcs = false, + attack_animals = false, + attack_monsters = true, + reach = 3, + damage = 550, + hp_min = 25, + hp_max = 50, + armor = 100, + collisionbox = {-0.268, -0.01, -0.268, 0.268, 0.25, 0.268}, + visual = "mesh", + mesh = "Toad.b3d", + drawtype = "front", + textures = { + {"texturetoad.png"}, + + }, +sounds = { + random = "",}, + makes_footstep_sound = true, + owner_loyal = true, + owner = "", + order = "follow", + pathfinding = true, + walk_velocity = 1.5, + run_velocity = 2, + runaway = false, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"}, + jump = true, + jump_height = 6, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 50, + stand_start = 1, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + fly_start = 300, -- swim animation + fly_end = 400, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"}, + floats = 0, + follow = {"fishing:bait:worm", "ethereal:worm", "animalworld:ant", "animalworld:termite"}, + view_range = 13, + +on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Exploding Toad stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Exploding Toad will follow you.")) + end + end + end, +}) + + + +mobs:register_egg("nativevillages:toadtamed", S("Tamed Exploding Toad"), "atoad.png", 0) + + +mobs:alias_mob("nativevillages:toadtamed", "nativevillages:toadtamed") -- compatibility + +minetest.register_node("nativevillages:toadbag", { + description = S"Bag full of toads!", + tiles = { + "nativevillages_toadbag_top.png", + "nativevillages_toadbag_bottom.png", + "nativevillages_toadbag_right.png", + "nativevillages_toadbag_left.png", + "nativevillages_toadbag_back.png", + "nativevillages_toadbag_front.png" + }, + groups = {crumbly = 3}, + drop = "nativevillages:toadtamed 9", + sounds = default.node_sound_dirt_defaults(), +}) + + + diff --git a/mods/nativevillages/grasslandblocks.lua b/mods/nativevillages/grasslandblocks.lua new file mode 100644 index 0000000..644ca91 --- /dev/null +++ b/mods/nativevillages/grasslandblocks.lua @@ -0,0 +1,101 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:grasslandaltar", { + description = "Altar", + visual_scale = 1, + mesh = "Grasslandaltar.b3d", + tiles = {"texturegrasslandaltar.png"}, + inventory_image = "agrasslandaltar.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "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}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:cobble", + recipe = "nativevillages:grasslandaltar", +}) + +minetest.register_node("nativevillages:grasslandbarrel", { + description = S"Barrel", + visual_scale = 1, + mesh = "Grasslandbarrel.b3d", + tiles = {"texturegrasslandbarrel.png"}, + inventory_image = "agrasslandbarrel.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 1, 0.5}, + --[[{-0.5, -0.5, -0.5, 0.5, 1, 0.5}, + {-0.5, -0.5, -0.5, 0.5, 1, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 1, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:cobble", + recipe = "nativevillages:grasslandbarrel", +}) + +minetest.register_node("nativevillages:cowdropping", { + description = S"Cow Dropping", + visual_scale = 1, + mesh = "Cowdropping.b3d", + tiles = {"texturecowdropping.png"}, + inventory_image = "acowdropping.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + --[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:coal_lump", + recipe = "nativevillages:cowdropping", + +}) \ No newline at end of file diff --git a/mods/nativevillages/grasslandbuildings.lua b/mods/nativevillages/grasslandbuildings.lua new file mode 100644 index 0000000..04e4ab8 --- /dev/null +++ b/mods/nativevillages/grasslandbuildings.lua @@ -0,0 +1,125 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:grasslandblot", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00004, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandblot_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + + + +minetest.register_decoration({ + name = "nativevillages:grasslandhouse1", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse1_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + + +minetest.register_decoration({ + name = "nativevillages:grasslandhouse2", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse2_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:grasslandhouse3", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse3_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + + +minetest.register_decoration({ + name = "nativevillages:grasslandhouse4", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse4_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:grasslandhouse5", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse5_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:grasslandpond", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00004, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandpond_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:grasslandstable", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00004, + biomes = {"grassland", "snowy_grassland"}, + y_max = 20.5, + y_min = 15.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandstable_30_180.mts", + flags = "force_placement", + rotation = "random", +}) \ No newline at end of file diff --git a/mods/nativevillages/grasslandcreatures.lua b/mods/nativevillages/grasslandcreatures.lua new file mode 100644 index 0000000..f972bd4 --- /dev/null +++ b/mods/nativevillages/grasslandcreatures.lua @@ -0,0 +1,533 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:grasslandcow", { + stepheight = 1, + type = "animal", + passive = false, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 4, + hp_min = 20, + hp_max = 60, + armor = 100, + collisionbox = {-0.25, -0.01, -0.25, 0.25, 1.5, 0.25}, + visual = "mesh", + mesh = "Grasslandcow.b3d", + textures = { + {"texturegrasslandcow.png"}, + {"texturegrasslandcow2.png"}, + {"texturegrasslandcow3.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_cow", + attack = "nativevillages_cow2", + damage = "nativevillages_cow3", + }, + walk_velocity = 1, + run_velocity = 3, + runaway = false, + jump = false, + jump_height = 3, + pushable = true, + follow = {}, + view_range = 10, + stay_near = {{"nativevillages:cowdropping"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 0, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:grasslandcow", + nodes = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter", "default:clay"}, + neighbors = {"nativevillages:cowdropping"}, + min_light = 0, + interval = 60, + active_object_count = 3, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:grasslandcow", S("Grassland Cow"), "agrasslandcow.png") + + +mobs:alias_mob("nativevillages:grasslandcow", "nativevillages:grasslandcow") -- compatibility + + + + + +mobs.grasslandfemale_drops = { + "nativevillages:bucket_milk", "nativevillages:cheese", "default:iron_lump", + "default:copper_lump", "default:tin_lump", "mobs:meat" +} + +mobs:register_mob("nativevillages:grasslandfemale", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 70, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Grasslandfemale.b3d", + drawtype = "front", + textures = { + {"texturegrasslandfemale.png"}, + {"texturegrasslandfemale2.png"}, + {"texturegrasslandfemale3.png"}, + {"texturegrasslandfemale4.png"}, + + }, + child_texture = { + {"texturegrasslandbabyf.png"}, + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_grasslandfemale2", + random = "nativevillages_grasslandfemale", + damage = "nativevillages_grasslandfemale3", + death = "nativevillages_grasslandfemale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + stay_near = {{"nativevillages:grasslandbarrel"}, 5}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.grasslandfemale_drops + if item:get_name() == "farming:bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "ethereal:banana_bread" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.grasslandfemale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Grasslander dropped you an item for bread!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Grasslander stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Grasslander will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:grasslandfemale", + nodes = {"default:dirt_with_grass", "default:cobble", "default:dirt_with_coniferous_litter", "default:clay"}, + neighbors = {"nativevillages:grasslandbarrel"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:grasslandfemale", S("Female Grasslander"), "agrasslandfemale.png") + +-- compatibility +mobs:alias_mob("nativevillages:grasslandfemale", "nativevillages:grasslandfemale") + +mobs.grasslandmale_drops = { + "nativevillages:bucket_milk", "nativevillages:cheese", "default:iron_lump", + "default:copper_lump", "default:tin_lump", "mobs:meat" +} + +mobs:register_mob("nativevillages:grasslandmale", { + type = "npc", + passive = false, + damage = 5, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 70, + hp_max = 90, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Grasslandmale.b3d", + drawtype = "front", + textures = { + {"texturegrasslandmale.png"}, + {"texturegrasslandmale2.png"}, + {"texturegrasslandmale3.png"}, + {"texturegrasslandmale4.png"}, + + }, + child_texture = { + {"texturegrasslandbabym.png"}, + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_grasslandmale2", + random = "nativevillages_grasslandmale", + damage = "nativevillages_grasslandmale3", + death = "nativevillages_grasslandmale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + stay_near = {{"nativevillages:grasslandbarrel"}, 5}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.grasslandmale_drops + if item:get_name() == "farming:bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "ethereal:banana_bread" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.grasslandmale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Grasslander dropped you an item for bread!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Grasslander stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Grasslander will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:grasslandmale", + nodes = {"default:dirt_with_grass", "default:cobble", "default:dirt_with_coniferous_litter", "default:clay"}, + neighbors = {"nativevillages:grasslandbarrel"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:grasslandmale", S("Male Grasslander"), "agrasslandmale.png") + +-- compatibility +mobs:alias_mob("nativevillages:grasslandmale", "nativevillages:grasslandmale") + + +mobs.grasslandwitch_drops = { + "nativevillages:grasslandcat", "nativevillages:toadbag" +} + + +mobs:register_mob("nativevillages:grasslandwitch", { + type = "npc", + passive = false, + attack_type = "shoot", + shoot_interval = 1, + arrow = "nativevillages:fireball", + shoot_offset = 2, + attack_animals = false, + damage = 7, + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 20, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Grasslandwitch.b3d", + drawtype = "front", + textures = { + {"texturegrasslandwitch.png"}, + {"texturegrasslandwitch2.png"}, + + }, + makes_footstep_sound = true, +sounds = { + shoot = "nativevillages_witch2", + random = "nativevillages_witch", + damage = "nativevillages_witch4", + death = "nativevillages_witch3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + {name = "default:coal_lump", chance = 1, min = 1, max = 3}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + stay_near = {{"nativevillages:grasslandalta"}, 4}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + shoot_speed = 100, + shoot_start = 200, + shoot_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.grasslandwitch_drops + if item:get_name() == "default:diamond" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.grasslandwitch_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Witch dropped you an item for diamond!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Witch stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Witch will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:grasslandwitch", + nodes = {"default:dirt_with_grass", "default:clay"}, + neighbors = {"nativevillages:grasslandaltar"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:grasslandwitch", S("Grassland Witch"), "agrasslandwitch.png") + +-- compatibility +mobs:alias_mob("nativevillages:grasslandwitch", "nativevillages:grasslandwitch") \ No newline at end of file diff --git a/mods/nativevillages/guide.txt b/mods/nativevillages/guide.txt new file mode 100644 index 0000000..e1b0a22 --- /dev/null +++ b/mods/nativevillages/guide.txt @@ -0,0 +1,91 @@ +People Mod provides NPCs to be integrated in your own village, follow you and provide many trading items. +Native Villages is focused on ambience. The villagers of this mod can be found in the specific biomes but +wont follow you and some are even aggressive by nature. +As an additional challenge similar to Minecraft Creepers, you will find now exploding toads at night near the coastal regions +of jungle, savanna and forest biomes. + +This guide will shortly introduce you to the trading options of every specific tribe provided by the mod. +All trading drops are random (Like in People Mod) + +Arctic/Icelander Tribe: + +Sledge Trader +Sells Ice Dogs and Dog Sledges for steel ingots. + +Ice Villager +Sells brown and white wool, leather and meat for iron lumps. + +Sledge with Dog +Can be fed with meat(Mod Mobs Redo), dogfood or cooked dogfood. + +Desert Tribe: + +Villagers, Raiders and Rangers are aggressive and don't like to trade with you. + +Desert Slave Trader +Sells Chicken Breeders, Cow Herders, Lion Trainers, Dancers and Loyal Cannibals for gold ingots. + +Grasslander Tribe: + +Grasslander +Sells milk buckets, mozzarella cheese, iron lumps, copper lumps, tin lumps and meat for bread, garlic bread and ethereal banana bread. + +Grassland Witch +Sells cats and bags of exploding toads for diamonds. + +Lake Tribe: + +Lake Villager +Sells cooked catfish, strings, water buckets, salt and pearls for ethereal bananas, sugar, cocoa and bananas(farming). + +Fisher +Sells domesticated catfish(can be bred) and pearls for gold lumps. + +Savanna Tribe: + +Witch Doctor +Sells tamed zombies for all graves found in People Mod. + +Savanna Queen + King +Sells gold block for diamond. + +Savanna Villagers +Sells pumpkin, vanilla, potatoes, pineapple, pepper, onion, peas, melon, cucumber and coffee beans for pearls. + +Various Creatures: + +Tamed Catfish +Can be bred with worm, seaweed, grass, cucumber, cabbage, ants, termite, fish food. + +Tamed Zombie +Can be bred with dried human meat(Can be found in Jungle/Cannibal settlements). + +Cow Herder +Sells domestic cows for various farming dishes. + +Domestic Cow +Can be milked with a bucket, can be bred with wheat, grass, barley, oat, rye, carrot, beans and lettuce. + +Chicken Breeder +Sells tamed desert chickens for various farming dishes. + +Tamed Desert Chicken +Can be bred with wheat seeds, cotton seeds, barley seeds, oat seeds and rye seeds. + +Lion Trainer +Sells tamed lions for gold lumps. + +Tamed Lions +Can be fed with many kind of raw meat and fish. + +Grassland Cat +Can be fed with many kind of raw meat and fish. + +Dancers +Can be fed with various farming dishes. + +Loyal Cannibal +Can be fed with dried human meat(Can be found in Jungle/Cannibal settlements). + + +It is useless to kill animals to be found in the villages, they wont drop anything and wont get tame to prevent cheating. \ No newline at end of file diff --git a/mods/nativevillages/guideDE.txt b/mods/nativevillages/guideDE.txt new file mode 100644 index 0000000..fc56c23 --- /dev/null +++ b/mods/nativevillages/guideDE.txt @@ -0,0 +1,91 @@ +People Mod stellt NPCs zur Verfügung, die in Ihr eigenes Dorf integriert werden können, Ihnen folgen und viele Handelsgegenstände bereitstellen. +Native Villages konzentriert sich auf das Ambiente. Die Dorfbewohner dieser Mod(nativevillages) sind in den spezifischen Biomen zu finden, +werden dir nicht folgen und einige sind sogar von Natur aus aggressiv. +Als zusätzliche Herausforderung, ähnlich wie bei Minecraft Creepers, findet ihr nun nachts explodierende Kröten in der Nähe der Küstenregionen +von Dschungel, Savannen und Waldbiomen. + +Dieser Leitfaden wird Sie kurz in die Handelsoptionen jedes spezifischen Stammes einführen, der von der Mod bereitgestellt wird. +Alle Trading-Drops sind zufällig (wie in People Mod) + +Arktischer/Eisländer Stamm: + +Schlittenhändler +Verkauft Eishunde und Hundeschlitten für Stahlbarren. + +Eisländer +Verkauft braune und weiße Wolle, Leder und Fleisch für Eisenklumpen. + +Schlitten mit Hund +Kann mit Fleisch (Mod Mobs Redo), Hundefutter oder gekochtem Hundefutter gefüttert werden. + +Wüsten-Stamm: + +Wüstendorfbewohner, Wüstenplünderer und Wüstenwächter sind aggressiv und handeln nicht gerne mit dir. + +Sklavenhändler +Verkauft Hühnerzüchterin, Kuhzüchterin, Löwentrainer, Tänzer und Loyale Kannibalen für Goldbarren. + +Graslandbewohner Stamm: + +Graslandbewohner +Verkauft Milcheimer, Mozzarella-Käse, Eisenklumpen, Kupferklumpen, Zinnklumpen und Fleisch für Brot, Knoblauchbrot und etheral Bananenbrot. + +Wiesenhexe +Verkauft Katzen und Säcke mit explodierenden Kröten für Diamanten. + +Seebewohner Stamm: + +Seebewohner +Verkauft gekochten Wels, Schnüre, Wassereimer, Salz und Perlen für ethereal Bananen, Zucker, Kakao und Bananen (Farming mod). + +Angler +Verkauft domestizierten Wels (kann gezüchtet werden) und Perlen für Goldklumpen. + +Savannenbewohner Stamm: + +Hexendoktor +Verkauft gezähmte Zombies für alle Gräber, die in People Mod gefunden werden. + +Savannenkönigin + Savennenkönig +Verkauft Goldblock für Diamant. + +Savannenbewohner +Verkauft Kürbis, Vanille, Kartoffeln, Ananas, Paprika, Zwiebeln, Erbsen, Melonen, Gurken und Kaffeebohnen für Perlen. + +Diverse Kreaturen: + +Domestizierter Wels +Kann mit Wurm, Algen, Gras, Gurken, Kohl, Ameisen, Termiten, Fischfutter gezüchtet werden. + +Gezähmter Zombie +Kann mit getrocknetem Menschenfleisch gezüchtet werden (Kann in Dschungel-/Kannibalensiedlungen gefunden werden). + +Kuhzüchterin +Verkauft Domestizierte Kühe für verschiedene bäuerliche Gerichte. + +Domestizierte Kuh +Kann mit einem Eimer gemolken werden, kann mit Weizen, Gras, Gerste, Hafer, Roggen, Karotten, Bohnen und Salat gezüchtet werden. + +Hühnerzüchterin +Verkauft gezähmte Wüstenhühner für verschiedene landwirtschaftliche Gerichte. + +Domestiziertes Wüstenhuhn +Kann mit Weizensamen, Baumwollsamen, Gerstensamen, Hafersamen und Roggensamen gezüchtet werden. + +Löwentrainer +Verkauft gezähmte Löwen für Goldklumpen. + +Gezähmte Löwen +Kann mit vielen Arten von rohem Fleisch und Fisch gefüttert werden. + +Katze +Kann mit vielen Arten von rohem Fleisch und Fisch gefüttert werden. + +Tänzer +Kann mit verschiedenen bäuerlichen Gerichten gefüttert werden. + +Loyaler Kannibale +Kann mit getrocknetem Menschenfleisch gefüttert werden (Kann in Dschungel-/Kannibalensiedlungen gefunden werden). + + +Es ist sinnlos, Tiere zu töten, die in den Dörfern zu finden sind, sie lassen nichts fallen(Keine Drops) und werden nicht zahm, um Betrug/Farming zu verhindern. \ No newline at end of file diff --git a/mods/nativevillages/hunger.lua b/mods/nativevillages/hunger.lua new file mode 100644 index 0000000..3c786a0 --- /dev/null +++ b/mods/nativevillages/hunger.lua @@ -0,0 +1,29 @@ +if minetest.get_modpath("hunger_ng") ~= nil then +hunger_ng.add_hunger_data('nativevillages:bucket_milk', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('nativevillages:cheese', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('nativevillages:catfish_raw', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('nativevillages:catfish_cooked', { + satiates = 2.0, + }) + hunger_ng.add_hunger_data('nativevillages:chicken_raw', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('nativevillages:chicken_cooked', { + satiates = 2.0, + }) + hunger_ng.add_hunger_data('nativevillages:chicken_egg_fried', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('nativevillages:butter', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('nativevillages:driedhumanmeat', { + satiates = 2.0, + }) +end \ No newline at end of file diff --git a/mods/nativevillages/icebuildings.lua b/mods/nativevillages/icebuildings.lua new file mode 100644 index 0000000..2b8ec8d --- /dev/null +++ b/mods/nativevillages/icebuildings.lua @@ -0,0 +1,91 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:icehouse1", + deco_type = "schematic", + place_on = {"default:snowblock", "default:ice"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean"}, + y_max = 3.5, + y_min = 1.0, + schematic = minetest.get_modpath("nativevillages").."/schematics/icehouse1_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:icehouse2", + deco_type = "schematic", + place_on = {"default:snowblock", "default:ice"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean"}, + y_max = 3.5, + y_min = 1.0, + schematic = minetest.get_modpath("nativevillages").."/schematics/icehouse2_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:icehouse3", + deco_type = "schematic", + place_on = {"default:snowblock", "default:ice"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean"}, + y_max = 3.5, + y_min = 1.0, + schematic = minetest.get_modpath("nativevillages").."/schematics/icehouse3_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:icelogs", + deco_type = "schematic", + place_on = {"default:snowblock", "default:ice"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean"}, + y_max = 3.5, + y_min = 1.0, + schematic = minetest.get_modpath("nativevillages").."/schematics/icelogs_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:icepelts", + deco_type = "schematic", + place_on = {"default:snowblock", "default:ice"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean"}, + y_max = 3.5, + y_min = 1.0, + schematic = minetest.get_modpath("nativevillages").."/schematics/icepelts_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:icesledge", + deco_type = "schematic", + place_on = {"default:snowblock", "default:ice"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean"}, + y_max = 3.5, + y_min = 1.0, + schematic = minetest.get_modpath("nativevillages").."/schematics/icesledge_30_90.mts", + flags = "force_placement", + rotation = "random", +}) \ No newline at end of file diff --git a/mods/nativevillages/init.lua b/mods/nativevillages/init.lua new file mode 100644 index 0000000..4c06b98 --- /dev/null +++ b/mods/nativevillages/init.lua @@ -0,0 +1,56 @@ + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("nativevillages") or + dofile(path .. "intllib.lua") + +mobs.intllib = S + + +-- Check for custom mob spawn file +local input = io.open(path .. "spawn.lua", "r") + +if input then + mobs.custom_spawn_nativevillages = true + input:close() + input = nil +end + + +-- Buildings + + +dofile(path .. "cannibalblocks.lua") -- +dofile(path .. "savannablocks.lua") -- +dofile(path .. "arcticblocks.lua") -- +dofile(path .. "grasslandblocks.lua") -- +dofile(path .. "lakeblocks.lua") -- +dofile(path .. "desertblocks.lua") -- +dofile(path .. "junglebuildings.lua") -- +dofile(path .. "icebuildings.lua") -- +dofile(path .. "grasslandbuildings.lua") -- +dofile(path .. "lakebuildings.lua") -- +dofile(path .. "desertbuildings.lua") -- +dofile(path .. "savannabuildings.lua") -- +dofile(path .. "grasslandcreatures.lua") -- +dofile(path .. "junglecreatures.lua") -- +dofile(path .. "arcticcreatures.lua") -- +dofile(path .. "savannacreatures.lua") -- +dofile(path .. "lakecreatures.lua") -- +dofile(path .. "desertcreatures.lua") -- +dofile(path .. "slavecreatures.lua") -- +dofile(path .. "buyablestuff.lua") -- +dofile(path .. "explodingtoad.lua") -- +dofile(path .. "lootchest.lua") -- +dofile(path .. "hunger.lua") -- + + +-- Load custom spawning +if mobs.custom_spawn_nativevillages then + dofile(path .. "spawn.lua") +end + + + +print (S("[MOD] Buildings loaded")) diff --git a/mods/nativevillages/intllib.lua b/mods/nativevillages/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/nativevillages/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/nativevillages/junglebuildings.lua b/mods/nativevillages/junglebuildings.lua new file mode 100644 index 0000000..7946389 --- /dev/null +++ b/mods/nativevillages/junglebuildings.lua @@ -0,0 +1,91 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:junglehouse1", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"rainforest"}, + y_max = 20.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalhouse1_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:junglehouse2", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"rainforest"}, + y_max = 20.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalhouse2_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:junglehouse3", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"rainforest"}, + y_max = 20.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalhouse3_30_90.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:junglecage", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"rainforest"}, + y_max = 20.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalcage_30_270.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:junglepit", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"rainforest"}, + y_max = 20.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalpit_30_270.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:jungletower", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"rainforest"}, + y_max = 20.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/cannibaltower_30_180.mts", + flags = "force_placement", + rotation = "random", +}) \ No newline at end of file diff --git a/mods/nativevillages/junglecreatures.lua b/mods/nativevillages/junglecreatures.lua new file mode 100644 index 0000000..872d89d --- /dev/null +++ b/mods/nativevillages/junglecreatures.lua @@ -0,0 +1,355 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:cannibalking", { + type = "monster", + passive = false, + attack_type = "shoot", + shoot_interval = 1, + arrow = "nativevillages:fireball", + shoot_offset = 2, + attack_animals = true, + damage = 7, + hp_min = 55, + hp_max = 85, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Cannibalking.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturecannibalking.png"}, + }, +sounds = { + random = "nativevillages_cannibalmale", + shoot = "nativevillages_cannibalmale2", + damage = "nativevillages_cannibalmale3", + death = "nativevillages_cannibalmale4", + }, + makes_footstep_sound = true, + walk_velocity = 1.5, + run_velocity = 3, + runaway = false, + jump = true, + jump_height = 2, + stepheight = 2, + fear_height = 3, + stay_near = {{"nativevillages:cannibalshrine", "nativevillages:driedpeople"}, 5}, + drops = { + {name = "default:copper_lump", chance = 1, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 75, + walk_start = 100, + walk_end = 200, + shoot_speed = 100, + shoot_start = 200, + shoot_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:cannibalking", + nodes = {"default:junglewood"}, + neighbors = {"nativevillages:cannibalshrine"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + min_height = 0, + max_height = 40, +}) +end + +mobs:register_arrow("nativevillages:fireball", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"nativevillages_fireball.png"}, + velocity = 12, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) + + +mobs:register_egg("nativevillages:cannibalking", S("Cannibal King"), "acannibalking.png") + +mobs:register_mob("nativevillages:cannibalarcher", { + type = "monster", + passive = false, + attack_type = "shoot", + shoot_interval = 2, + arrow = "people:bolt", + shoot_offset = 2, + attacks_monsters = false, + damage = 4, + hp_min = 55, + hp_max = 85, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Cannibalarcher.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturecannibalarcher.png"}, + }, +sounds = { + random = "nativevillages_cannibalmale", + attack = "nativevillages_cannibalmale2", + damage = "nativevillages_cannibalmale3", + death = "nativevillages_cannibalmale4", + }, + makes_footstep_sound = true, + walk_velocity = 2, + run_velocity = 3, + runaway = false, + jump = true, + jump_height = 2, + stepheight = 2, + fear_height = 3, + stay_near = {{"nativevillages:cannibalshrine", "nativevillages:driedpeople"}, 5}, + drops = { + {name = "default:tin_lump", chance = 1, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 75, + walk_start = 100, + walk_end = 200, + shoot_speed = 50, + shoot_start = 200, + shoot_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:cannibalarcher", + nodes = {"default:junglewood"}, + neighbors = {"nativevillages:cannibalshrine"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 40, +}) +end + +mobs:register_egg("nativevillages:cannibalarcher", S("Cannibal Hunter"), "acannibalarcher.png") + +mobs:register_mob("nativevillages:cannibalmurderer", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 6, + hp_min = 55, + hp_max = 85, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Cannibalmurderer.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturecannibalmurderer.png"}, + }, +sounds = { + random = "nativevillages_cannibalfemale", + attack = "nativevillages_cannibalfemale2", + damage = "nativevillages_cannibalfemale3", + death = "nativevillages_cannibalfemale4", + }, + makes_footstep_sound = true, + walk_velocity = 2, + run_velocity = 3, + runaway = false, + jump = true, + jump_height = 2, + stepheight = 2, + fear_height = 3, + stay_near = {{"nativevillages:cannibalshrine", "nativevillages:driedpeople"}, 5}, + drops = { + {name = "default:copper_lump", chance = 1, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 75, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:cannibalmurderer", + nodes = {"default:junglewood"}, + neighbors = {"nativevillages:driedpeople"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 2, -- 15000 + min_height = 0, + max_height = 40, +}) +end + +mobs:register_egg("nativevillages:cannibalmurderer", S("Cannibal Murderer"), "acannibalmurderer.png") + +mobs:register_mob("nativevillages:cannibalchild", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 6, + hp_min = 15, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Cannibalchild.b3d", + visual_size = {x = 1, y = 1}, + textures = { + {"texturecannibalchild.png"}, + }, +sounds = { + random = "nativevillages_cannibalchild3", + attack = "nativevillages_cannibalchild2", + damage = "nativevillages_cannibalchild", + }, + makes_footstep_sound = true, + walk_velocity = 3, + run_velocity = 5, + runaway = false, + stepheight = 4, + fear_height = 6, + jump = true, + jump_height = 4, + stepheight = 2, + fear_height = 5, + stay_near = {{"nativevillages:cannibalshrine", "nativevillages:driedpeople"}, 5}, + drops = { + {name = "default:iron_lump", chance = 1, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 100, + stand_start = 0, + stand_end = 100, + walk_speed = 150, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:cannibalchild", + nodes = {"default:junglewood"}, + neighbors = {"nativevillages:driedpeople"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + active_object_count = 2, + min_height = 0, + max_height = 40, +}) +end + +mobs:register_egg("nativevillages:cannibalchild", S("Cannibal Child"), "acannibalchild.png") diff --git a/mods/nativevillages/lakeblocks.lua b/mods/nativevillages/lakeblocks.lua new file mode 100644 index 0000000..1cdcb33 --- /dev/null +++ b/mods/nativevillages/lakeblocks.lua @@ -0,0 +1,72 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:fishtrap", { + description = S"Fish Trap", + visual_scale = 1, + mesh = "Fishtrap.b3d", + tiles = {"texturefishtrap.png"}, + inventory_image = "afishtrap.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.5, 0.25, 0.12, 0.5}, + --[[{-0.25, -0.5, -0.5, 0.25, 0.12, 0.5}, + {-0.25, -0.5, -0.5, 0.25, 0.12, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.5, 0.25, 0.12, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "nativevillages:fishtrap", + burntime = 3, +}) + +minetest.register_node("nativevillages:hangingfish", { + description = S"Hangning Fish", + visual_scale = 1, + mesh = "Hangingfish.b3d", + tiles = {"texturehangingfish.png"}, + inventory_image = "ahangingfish.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.2, 1, 0.9, 0.2}, + --[[{-1, -0.5, -0.2, 1, 0.9, 0.2}, + {-1, -0.5, -0.2, 1, 0.9, 0.2}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.2, 1, 0.9, 0.2} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "nativevillages:hangingfish", + burntime = 3, +}) + +minetest.register_craftitem("nativevillages:pearl", { + description = S("Pearl"), + inventory_image = "nativevillages_pearl.png", +}) \ No newline at end of file diff --git a/mods/nativevillages/lakebuildings.lua b/mods/nativevillages/lakebuildings.lua new file mode 100644 index 0000000..eb9e151 --- /dev/null +++ b/mods/nativevillages/lakebuildings.lua @@ -0,0 +1,91 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:lakehouse1", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse1_0_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:lakehouse2", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse2_0_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:lakehouse3", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse3_0_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:lakehouse4", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse4_0_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:lakefishtrap", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakefishtrap_0_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:lakeharbour", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakeharbour_0_0.mts", + flags = "force_placement", + rotation = "random", +}) \ No newline at end of file diff --git a/mods/nativevillages/lakecreatures.lua b/mods/nativevillages/lakecreatures.lua new file mode 100644 index 0000000..1dc1a47 --- /dev/null +++ b/mods/nativevillages/lakecreatures.lua @@ -0,0 +1,501 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:lakecatfish", { +stepheight = 0.0, + type = "animal", + passive = true, + attack_type = "dogfight", + attack_animals = false, + reach = 1, + damage = 1, + hp_min = 15, + hp_max = 55, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + visual = "mesh", + mesh = "Lakecatfish.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturelakecatfish.png"}, + }, + sounds = {}, + makes_footstep_sound = false, + walk_velocity = 1, + run_velocity = 2, + fly = true, + fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing", + fall_speed = 0, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "player"}, + jump = false, + stepheight = 0.0, + drops = { + }, + water_damage = 0, + air_damage = 1, + lava_damage = 4, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 200, + stand_end = 300, + fly_start = 0, + fly_end = 100, + fly2_start = 100, + fly2_end = 200, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"}, + floats = 0, + follow = {}, + view_range = 10, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:lakecatfish", + nodes = {"default:water_source"}, {"default:river_water_source"}, + neighbors = {"nativevillages:fishtrap"}, + min_light = 0, + interval = 60, + chance = 1, -- 15000 + active_object_count = 3, + min_height = -10, + max_height = 30, +}) +end + +mobs:register_egg("nativevillages:lakecatfish", S("Catfish"), "alakecatfish.png") + +mobs.lakevillagerfemale_drops = { + "nativevillages:catfish_cooked", "farming:string", "bucket:bucket_water", "farming:salt", "nativevillages:pearl" +} + +mobs:register_mob("nativevillages:lakevillagerfemale", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Lakevillagerfemale.b3d", + drawtype = "front", + textures = { + {"texturelakevillagerfemale.png"}, + {"texturelakevillagerfemale2.png"}, + {"texturelakevillagerfemale3.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_lakefemale", + attack = "nativevillages_lakefemale2", + damage = "nativevillages_lakefemale4", + death = "nativevillages_lakefemale3", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = false, + jump_height = 1, + stepheight = 0, + fear_height = 1, + stay_near = {{"nativevillages:hangingfish"}, 5}, + drops = { + }, + water_damage = 200, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.lakevillagerfemale_drops + if item:get_name() == "ethereal:banana" or item:get_name() == "farming:sugar" or item:get_name() == "group:food_cocoa" or item:get_name() == "farming:banana" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.lakevillagerfemale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Lake Villager dropped you an item for fruit!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Lake Villager stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Lake Villager will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:lakevillagerfemale", + nodes = {"default:pine_wood"}, + neighbors = {"nativevillages:hangingfish"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:lakevillagerfemale", S("Female Lake Villager"), "alakevillagerfemale.png") + +mobs.lakevillagerfisher_drops = { + "nativevillages:tamecatfish", "nativevillages:pearl" +} + +mobs:register_mob("nativevillages:lakevillagerfisher", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 80, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Lakevillagerfisher.b3d", + drawtype = "front", + textures = { + {"texturelakevillagerfisher.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_lakemale", + attack = "nativevillages_lakemale2", + damage = "nativevillages_lakemale4", + death = "nativevillages_lakemale3", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = false, + jump_height = 1, + stepheight = 0, + fear_height = 1, + stay_near = {{"nativevillages:fishtrap"}, 5}, + drops = { + }, + water_damage = 200, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.lakevillagerfisher_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.lakevillagerfisher_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Fisher bred you a catfish for gold!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Fisher stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Fisher will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:lakevillagerfisher", + nodes = {"default:pine_wood"}, + neighbors = {"nativevillages:fishtrap"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:lakevillagerfisher", S("Fisher"), "alakevillagerfisher.png") + + +mobs.lakevillagermale_drops = { + "nativevillages:catfish_cooked", "farming:string", "bucket:bucket_water", "farming:salt", "nativevillages:pearl" +} + +mobs:register_mob("nativevillages:lakevillagermale", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 90, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Lakevillagermale.b3d", + drawtype = "front", + textures = { + {"texturelakevillagermale.png"}, + {"texturelakevillagermale2.png"}, + {"texturelakevillagermale3.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_lakemale", + attack = "nativevillages_lakemale2", + damage = "nativevillages_lakemale4", + death = "nativevillages_lakemale3", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = false, + jump_height = 1, + stepheight = 0, + fear_height = 1, + stay_near = {{"nativevillages:hangingfish"}, 5}, + drops = { + }, + water_damage = 200, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.lakevillagermale_drops + if item:get_name() == "ethereal:banana" or item:get_name() == "farming:sugar" or item:get_name() == "group:food_cocoa" or item:get_name() == "farming:banana" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.lakevillagermale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Lake Villager dropped you an item for fruit!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("NPC stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("NPC will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:lakevillagermale", + nodes = {"default:pine_wood"}, + neighbors = {"nativevillages:hangingfish"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:lakevillagermale", S("Male Lake Villager"), "alakevillagermale.png") + diff --git a/mods/nativevillages/locale/nativevillages.de.tr b/mods/nativevillages/locale/nativevillages.de.tr new file mode 100644 index 0000000..5914ab8 --- /dev/null +++ b/mods/nativevillages/locale/nativevillages.de.tr @@ -0,0 +1,134 @@ +# textdomain: nativevillages + +Sledge=Schlitten +Blanket=Decke +Ice Dog=Eishund +Trader dropped you an item for steel!=Händler hat einen Gegenstand für Stahl gegeben! +NPC stands still.=NPC wartet. +NPC will follow you.=NPC folgt dir. +Sledge Trader=Schlittenhändler +Icelander dropped you an item for iron!=Eisländer hat einen Gegenstand für Eisen gegeben! +Icelander stands still.=Eisländer wartet. +Icelander will follow you.=Eisländer folgt dir. +Female Icelander=Eisländerin +Male Icelander=Eisländer +Sledge with Dog=Schlitten mit Hund +Domesticated Catfish=Domestizierter Wels +Raw Catfish=Rohes Welsfleisch +Cooked Catfish=Gekochtes Welsfleisch +Zombie stands still.=Zombie wartet. +Zombie will follow you.=Zombie folgt dir. +Tamed Zombie=Gezähmter Zombie +Cow already milked!=Kuh bereits gemolken! +Domesticated Cow=Domestizierte Kuh +Bucket of Milk=Milcheimer +Glass of Milk=Milchglas +Butter=Butter +Mozzarella Cheese=Mozzarella +Mozzarella Cheese Block=Mozzarella Block +Domesticated Desert Chicken=Domestiziertes Wüstenhuhn +Lion stands still.=Löwe wartet. +Lion will follow you.=Löwe folgt dir. +Tamed Male Lion=Gezähmter Männlicher Löwe +Tamed Female Lion=Gezähmter Weiblicher Löwe +Cat=Katze +Dried Human Remains=Getrocknete Menschliche Überreste +Dried Human Meat=Getrocknetes Menschenfleisch +Cannibal Shrine=Kannibalenschrein +Hookah=Wasserpfeife +Desert Carpet=Wüstenteppich +Slave Bracelet=Sklavenkette +Desert Seeds=Wüstensamen +Desert Villager dropped you an item for a stick!=Wüstendorf Bewohner hat einen Gegenstand für einen Stock gegeben! +Desert Villager stands still.=Wüstendorf Bewohner wartet. +Desert Villager will follow you.=Wüstendorf Bewohner folgt dir. +Male Desert Villager=Wüstendorf Bewohner +Female Desert Villager=Wüstendorf Bewohnerin +Slave delivered!=Sklave ausgeliefert! +Slavetrader stands still.=Sklavenhändler wartet. +Slavetrader will follow you.=Sklavenhändler folgt dir. +Slave Trader=Sklavenhändler +Desert Ranger=Wüstenwächter +Desert Raider=Wüstenplünderer +Desert Chicken=Wüstenhuhn +Bird Egg=Vogelei +Fried Desert Chicken Egg=Gebratenes Wüstenhühnerei +Raw Desert Chicken meat=Rohes Wüstenhuhnfleisch +Cooked Desert Chicken=Gekochtes Wüstenhuhnfleisch +Toad=Kröte +Tamed Exploding Toad=Gezähmte Explodierende Kröte +Barrel=Fass +Cow Dropping=Kuhfladen +Grassland Cow=Graslandkuh +Grasslander dropped you an item for bread!=Graslandbewohner hat einen Gegenstand für Brot fallen lassen! +Grasslander stands still.=Graslandbewohner wartet. +Grasslander will follow you.=Graslandbewohner folgt dir. +Female Grasslander=Graslandbewohnerin +Male Grasslander=Graslandbewohner +Witch dropped you an item for diamond!=Die Hexe hat einen Gegenstand für einen Diamenten fallen lassen! +Witch stands still.=Hexe wartet. +Witch will follow you.=Hexe folgt dir. +Grassland Witch=Graslandhexe +Cannibal King=Kannibalenkönig +Cannibal Hunter=Kannibalenjäger +Cannibal Murderer=Kannibalenmörderin +Cannibal Child=Kannibalenkind +Fish Trap=Fischfalle +Hangning Fish=Hängender Fisch +Pearl=Perle +Catfish=Wels +Lake Villager dropped you an item for fruit!=Seebewohner hat einen Gegenstand für Früchte fallen lassen! +Lake Villager stands still.=Seebewohner wartet. +Lake Villager will follow you.=Seebewohner folgt dir. +Female Lake Villager=Seebewohnerin +Fisher bred you a catfish for gold!=Angler hat dir einen Wels für Gold gezüchtet! +Fisher stands still.=Angler wartet. +Fisher will follow you.=Angler folgt dir. +Fisher=Angler +Male Lake Villager=Seebewohner +Savanna Throne=Savannenthron +Savanna Vessels=Savannen Vasen +Savanna Shrine=Savannenschrein +Savanna Corpse=Savannenleiche +Male Lion=Männlicher Löwe +Female Lion=Weiblicher Löwe +Witch Doctor created a tame Zombie!=Hexendoktor hat einen zahmen Zombie erschaffen! +Witch Doctor stands still.=hexendoktor wartet. +Witch Doctor will follow you.=Hexendoktor folgt dir. +Witch Doctor=Hexendoktor +Royalty dropped you an item for gold!=Der Adel hat einen Gegenstand für Gold gegeben! +Royalty stands still.=Der Adel wartet. +Royalty will follow you.=Der Adel folgt dir. +Savanna Queen=Savannenkönigin +Savanna Villager dropped you an item for a pearl!=Savannenbewohner hat einen Gegenstand für eine Perle gegeben! +Savanna Villager stands still.=Savannenbewohner wartet. +Savanna Villager will follow you.=Savannenbewohner folgt dir. +Male Savanna Villager=Savannenbewohner +Savanna King=Savennenkönig +Female Savanna Villager=Savannenbewohnerin +Chicken hatched!=Huhn geschlüpft! +Chicken Breeder stands still.=Hühnerzüchterin wartet. +Chicken Breeder will follow you.=Hühnerzüchterin folgt dir, +Chicken Breeder=Hühnerzüchterin +Cow has been raised!=Kuh wurde aufgezogen! +Cow Herder=Kuhzüchterin +Cow Herder stands still.=Kuhzüchterin wartet. +Cow Herder will follow you.=Kuhzüchterin folgt dir. +Lion has been raised!=Löwe wurde aufgezogen! +Lion Trainer stands still.=Löwentrainer wartet. +Lion Trainer will follow you.=Löwentrainer folgt dir. +Lion Trainer=Löwentrainer +NPC dropped you an item for gold!=NPC hat einen Gegenstand für Gold gegeben! +Dancer will dance!=Tänzerin wird tanzen! +Dancer will follow you.=Tänzerin wir dir folgen. +Female Dancer=Tänzerin +Cannibal stands still.=Kannibale wartet. +Cannibal will follow you.=Kannibale folgt dir. +Loyal Cannibal=Loyaler Kannibale +Dancer will dance!=Tänzer wird tanzen! +Dancer will follow you.=Tänzer folgt dir. +Male Dancer=Tänzer +Bag full of toads!=Sack voller Kröten! +Exploding Toad stands still.=Explodierende Kröte wartet. +Exploding Toad will follow you.=Explodierende Kröte folgt dir. +Loot Chest=Beutetruhe \ No newline at end of file diff --git a/mods/nativevillages/lootchest.lua b/mods/nativevillages/lootchest.lua new file mode 100644 index 0000000..7d0ca0d --- /dev/null +++ b/mods/nativevillages/lootchest.lua @@ -0,0 +1,55 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:lootchest", { + description = S("Loot Chest"), +tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png" + }, +groups = {wood = 1, choppy = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + drop = { + max_items = 35, + items = { + {items = {"default:iron_lump"}, rarity = 5}, + {items = {"default:apple"}, rarity = 5}, + {items = {"farming:bread"}, rarity = 6}, + {items = {"default:book"}, rarity = 8}, + {items = {"default:coal_lump"}, rarity = 6}, + {items = {"farming:cotton"}, rarity = 6}, + {items = {"bucket:bucket_empty"}, rarity = 10}, + {items = {"default:paper"}, rarity = 8}, + {items = {"farming:string"}, rarity = 8}, + {items = {"farming:seed_wheat"}, rarity = 10}, + {items = {"default:obsidian_shard"}, rarity = 20}, + {items = {"default:stick"}, rarity = 6}, + {items = {"default:torch"}, rarity = 8}, + {items = {"farming:seed_cotton"}, rarity = 9}, + {items = {"people:dogfood"}, rarity = 12}, + {items = {"people:firsaidkit"}, rarity = 12}, + {items = {"farming:beans"}, rarity = 7}, + {items = {"farming:corn_cob"}, rarity = 7}, + {items = {"farming:potato"}, rarity = 7}, + {items = {"farming:soy_pod"}, rarity = 10}, + {items = {"farming:tomato"}, rarity = 10}, + {items = {"farming:sugar"}, rarity = 7}, + {items = {"farming:salt"}, rarity = 7}, + {items = {"farming:turkish_delight"}, rarity = 15}, + {items = {"farming:donut"}, rarity = 15}, + {items = {"farming:porridge"}, rarity = 15}, + {items = {"farming:apple_pie"}, rarity = 15}, + {items = {"farming:pasta"}, rarity = 15}, + {items = {"farming:bibimbap"}, rarity = 15}, + {items = {"farming:burger"}, rarity = 15}, + {items = {"farming:potato_omelet"}, rarity = 15}, + {items = {"farming:paella"}, rarity = 15}, + {items = {"default:flint"}, rarity = 15}, + {items = {"farming:rice"}, rarity = 15}, + {items = {"default:chest"}} + } + } +}) diff --git a/mods/nativevillages/mod.conf b/mods/nativevillages/mod.conf new file mode 100644 index 0000000..c95c574 --- /dev/null +++ b/mods/nativevillages/mod.conf @@ -0,0 +1 @@ +name = nativevillages diff --git a/mods/nativevillages/models/Blanket.b3d b/mods/nativevillages/models/Blanket.b3d new file mode 100644 index 0000000..4ef38f9 Binary files /dev/null and b/mods/nativevillages/models/Blanket.b3d differ diff --git a/mods/nativevillages/models/Cannibalarcher.b3d b/mods/nativevillages/models/Cannibalarcher.b3d new file mode 100644 index 0000000..1bb1241 Binary files /dev/null and b/mods/nativevillages/models/Cannibalarcher.b3d differ diff --git a/mods/nativevillages/models/Cannibalchild.b3d b/mods/nativevillages/models/Cannibalchild.b3d new file mode 100644 index 0000000..08ef713 Binary files /dev/null and b/mods/nativevillages/models/Cannibalchild.b3d differ diff --git a/mods/nativevillages/models/Cannibalking.b3d b/mods/nativevillages/models/Cannibalking.b3d new file mode 100644 index 0000000..329ac07 Binary files /dev/null and b/mods/nativevillages/models/Cannibalking.b3d differ diff --git a/mods/nativevillages/models/Cannibalmurderer.b3d b/mods/nativevillages/models/Cannibalmurderer.b3d new file mode 100644 index 0000000..60322a0 Binary files /dev/null and b/mods/nativevillages/models/Cannibalmurderer.b3d differ diff --git a/mods/nativevillages/models/Cannibalshrine.b3d b/mods/nativevillages/models/Cannibalshrine.b3d new file mode 100644 index 0000000..8e0455d Binary files /dev/null and b/mods/nativevillages/models/Cannibalshrine.b3d differ diff --git a/mods/nativevillages/models/Cowdropping.b3d b/mods/nativevillages/models/Cowdropping.b3d new file mode 100644 index 0000000..7c9b132 Binary files /dev/null and b/mods/nativevillages/models/Cowdropping.b3d differ diff --git a/mods/nativevillages/models/Desertcage.b3d b/mods/nativevillages/models/Desertcage.b3d new file mode 100644 index 0000000..4732a75 Binary files /dev/null and b/mods/nativevillages/models/Desertcage.b3d differ diff --git a/mods/nativevillages/models/Desertcarpet.b3d b/mods/nativevillages/models/Desertcarpet.b3d new file mode 100644 index 0000000..4d1344a Binary files /dev/null and b/mods/nativevillages/models/Desertcarpet.b3d differ diff --git a/mods/nativevillages/models/Desertchicken.b3d b/mods/nativevillages/models/Desertchicken.b3d new file mode 100644 index 0000000..f698632 Binary files /dev/null and b/mods/nativevillages/models/Desertchicken.b3d differ diff --git a/mods/nativevillages/models/Desertraider.b3d b/mods/nativevillages/models/Desertraider.b3d new file mode 100644 index 0000000..b09f0d0 Binary files /dev/null and b/mods/nativevillages/models/Desertraider.b3d differ diff --git a/mods/nativevillages/models/Desertranger.b3d b/mods/nativevillages/models/Desertranger.b3d new file mode 100644 index 0000000..75fe30b Binary files /dev/null and b/mods/nativevillages/models/Desertranger.b3d differ diff --git a/mods/nativevillages/models/Desertseeds.b3d b/mods/nativevillages/models/Desertseeds.b3d new file mode 100644 index 0000000..57f784f Binary files /dev/null and b/mods/nativevillages/models/Desertseeds.b3d differ diff --git a/mods/nativevillages/models/Desertslavetrader.b3d b/mods/nativevillages/models/Desertslavetrader.b3d new file mode 100644 index 0000000..01ba30d Binary files /dev/null and b/mods/nativevillages/models/Desertslavetrader.b3d differ diff --git a/mods/nativevillages/models/Desertvillagerfemale.b3d b/mods/nativevillages/models/Desertvillagerfemale.b3d new file mode 100644 index 0000000..c31710a Binary files /dev/null and b/mods/nativevillages/models/Desertvillagerfemale.b3d differ diff --git a/mods/nativevillages/models/Desertvillagermale.b3d b/mods/nativevillages/models/Desertvillagermale.b3d new file mode 100644 index 0000000..fbb1729 Binary files /dev/null and b/mods/nativevillages/models/Desertvillagermale.b3d differ diff --git a/mods/nativevillages/models/Fishtrap.b3d b/mods/nativevillages/models/Fishtrap.b3d new file mode 100644 index 0000000..639857d Binary files /dev/null and b/mods/nativevillages/models/Fishtrap.b3d differ diff --git a/mods/nativevillages/models/Grasslandaltar.b3d b/mods/nativevillages/models/Grasslandaltar.b3d new file mode 100644 index 0000000..89877a5 Binary files /dev/null and b/mods/nativevillages/models/Grasslandaltar.b3d differ diff --git a/mods/nativevillages/models/Grasslandbarrel.b3d b/mods/nativevillages/models/Grasslandbarrel.b3d new file mode 100644 index 0000000..166c4f7 Binary files /dev/null and b/mods/nativevillages/models/Grasslandbarrel.b3d differ diff --git a/mods/nativevillages/models/Grasslandcat.b3d b/mods/nativevillages/models/Grasslandcat.b3d new file mode 100644 index 0000000..2f2df93 Binary files /dev/null and b/mods/nativevillages/models/Grasslandcat.b3d differ diff --git a/mods/nativevillages/models/Grasslandcow.b3d b/mods/nativevillages/models/Grasslandcow.b3d new file mode 100644 index 0000000..c9fa1f7 Binary files /dev/null and b/mods/nativevillages/models/Grasslandcow.b3d differ diff --git a/mods/nativevillages/models/Grasslandfemale.b3d b/mods/nativevillages/models/Grasslandfemale.b3d new file mode 100644 index 0000000..af62797 Binary files /dev/null and b/mods/nativevillages/models/Grasslandfemale.b3d differ diff --git a/mods/nativevillages/models/Grasslandmale.b3d b/mods/nativevillages/models/Grasslandmale.b3d new file mode 100644 index 0000000..89df6c8 Binary files /dev/null and b/mods/nativevillages/models/Grasslandmale.b3d differ diff --git a/mods/nativevillages/models/Grasslandwitch.b3d b/mods/nativevillages/models/Grasslandwitch.b3d new file mode 100644 index 0000000..d14fb08 Binary files /dev/null and b/mods/nativevillages/models/Grasslandwitch.b3d differ diff --git a/mods/nativevillages/models/Hangingfish.b3d b/mods/nativevillages/models/Hangingfish.b3d new file mode 100644 index 0000000..03a5a69 Binary files /dev/null and b/mods/nativevillages/models/Hangingfish.b3d differ diff --git a/mods/nativevillages/models/Hookah.b3d b/mods/nativevillages/models/Hookah.b3d new file mode 100644 index 0000000..be754a1 Binary files /dev/null and b/mods/nativevillages/models/Hookah.b3d differ diff --git a/mods/nativevillages/models/Icedog.b3d b/mods/nativevillages/models/Icedog.b3d new file mode 100644 index 0000000..90d2153 Binary files /dev/null and b/mods/nativevillages/models/Icedog.b3d differ diff --git a/mods/nativevillages/models/Icesledgetrader.b3d b/mods/nativevillages/models/Icesledgetrader.b3d new file mode 100644 index 0000000..a1b6b01 Binary files /dev/null and b/mods/nativevillages/models/Icesledgetrader.b3d differ diff --git a/mods/nativevillages/models/Icevillagerfemale.b3d b/mods/nativevillages/models/Icevillagerfemale.b3d new file mode 100644 index 0000000..24f0d72 Binary files /dev/null and b/mods/nativevillages/models/Icevillagerfemale.b3d differ diff --git a/mods/nativevillages/models/Icevillagermale.b3d b/mods/nativevillages/models/Icevillagermale.b3d new file mode 100644 index 0000000..d9b8870 Binary files /dev/null and b/mods/nativevillages/models/Icevillagermale.b3d differ diff --git a/mods/nativevillages/models/Lakecatfish.b3d b/mods/nativevillages/models/Lakecatfish.b3d new file mode 100644 index 0000000..df80143 Binary files /dev/null and b/mods/nativevillages/models/Lakecatfish.b3d differ diff --git a/mods/nativevillages/models/Lakevillagerfemale.b3d b/mods/nativevillages/models/Lakevillagerfemale.b3d new file mode 100644 index 0000000..998dac6 Binary files /dev/null and b/mods/nativevillages/models/Lakevillagerfemale.b3d differ diff --git a/mods/nativevillages/models/Lakevillagerfisher.b3d b/mods/nativevillages/models/Lakevillagerfisher.b3d new file mode 100644 index 0000000..e900f65 Binary files /dev/null and b/mods/nativevillages/models/Lakevillagerfisher.b3d differ diff --git a/mods/nativevillages/models/Lakevillagermale.b3d b/mods/nativevillages/models/Lakevillagermale.b3d new file mode 100644 index 0000000..451a470 Binary files /dev/null and b/mods/nativevillages/models/Lakevillagermale.b3d differ diff --git a/mods/nativevillages/models/Lionfemale.b3d b/mods/nativevillages/models/Lionfemale.b3d new file mode 100644 index 0000000..096e877 Binary files /dev/null and b/mods/nativevillages/models/Lionfemale.b3d differ diff --git a/mods/nativevillages/models/Lionmale.b3d b/mods/nativevillages/models/Lionmale.b3d new file mode 100644 index 0000000..728c606 Binary files /dev/null and b/mods/nativevillages/models/Lionmale.b3d differ diff --git a/mods/nativevillages/models/Savannacorpse.b3d b/mods/nativevillages/models/Savannacorpse.b3d new file mode 100644 index 0000000..7e9d87c Binary files /dev/null and b/mods/nativevillages/models/Savannacorpse.b3d differ diff --git a/mods/nativevillages/models/Savannadoctor.b3d b/mods/nativevillages/models/Savannadoctor.b3d new file mode 100644 index 0000000..72a81a2 Binary files /dev/null and b/mods/nativevillages/models/Savannadoctor.b3d differ diff --git a/mods/nativevillages/models/Savannafemale.b3d b/mods/nativevillages/models/Savannafemale.b3d new file mode 100644 index 0000000..e7efaca Binary files /dev/null and b/mods/nativevillages/models/Savannafemale.b3d differ diff --git a/mods/nativevillages/models/Savannaking.b3d b/mods/nativevillages/models/Savannaking.b3d new file mode 100644 index 0000000..2a03a3c Binary files /dev/null and b/mods/nativevillages/models/Savannaking.b3d differ diff --git a/mods/nativevillages/models/Savannamale.b3d b/mods/nativevillages/models/Savannamale.b3d new file mode 100644 index 0000000..efbf98d Binary files /dev/null and b/mods/nativevillages/models/Savannamale.b3d differ diff --git a/mods/nativevillages/models/Savannaqueen.b3d b/mods/nativevillages/models/Savannaqueen.b3d new file mode 100644 index 0000000..d336d39 Binary files /dev/null and b/mods/nativevillages/models/Savannaqueen.b3d differ diff --git a/mods/nativevillages/models/Savannashrine.b3d b/mods/nativevillages/models/Savannashrine.b3d new file mode 100644 index 0000000..b7f6529 Binary files /dev/null and b/mods/nativevillages/models/Savannashrine.b3d differ diff --git a/mods/nativevillages/models/Savannathrone.b3d b/mods/nativevillages/models/Savannathrone.b3d new file mode 100644 index 0000000..c8e4574 Binary files /dev/null and b/mods/nativevillages/models/Savannathrone.b3d differ diff --git a/mods/nativevillages/models/Savannavessels.b3d b/mods/nativevillages/models/Savannavessels.b3d new file mode 100644 index 0000000..17c45dc Binary files /dev/null and b/mods/nativevillages/models/Savannavessels.b3d differ diff --git a/mods/nativevillages/models/Slavechickenbreeder.b3d b/mods/nativevillages/models/Slavechickenbreeder.b3d new file mode 100644 index 0000000..ca38601 Binary files /dev/null and b/mods/nativevillages/models/Slavechickenbreeder.b3d differ diff --git a/mods/nativevillages/models/Slavecowherder.b3d b/mods/nativevillages/models/Slavecowherder.b3d new file mode 100644 index 0000000..366101c Binary files /dev/null and b/mods/nativevillages/models/Slavecowherder.b3d differ diff --git a/mods/nativevillages/models/Slavefemaledancer.b3d b/mods/nativevillages/models/Slavefemaledancer.b3d new file mode 100644 index 0000000..43cd531 Binary files /dev/null and b/mods/nativevillages/models/Slavefemaledancer.b3d differ diff --git a/mods/nativevillages/models/Slaveliontrainer.b3d b/mods/nativevillages/models/Slaveliontrainer.b3d new file mode 100644 index 0000000..dcfc77f Binary files /dev/null and b/mods/nativevillages/models/Slaveliontrainer.b3d differ diff --git a/mods/nativevillages/models/Slaveloyalcannibal.b3d b/mods/nativevillages/models/Slaveloyalcannibal.b3d new file mode 100644 index 0000000..c04742c Binary files /dev/null and b/mods/nativevillages/models/Slaveloyalcannibal.b3d differ diff --git a/mods/nativevillages/models/Slavemaledancer.b3d b/mods/nativevillages/models/Slavemaledancer.b3d new file mode 100644 index 0000000..e411141 Binary files /dev/null and b/mods/nativevillages/models/Slavemaledancer.b3d differ diff --git a/mods/nativevillages/models/Sledge.b3d b/mods/nativevillages/models/Sledge.b3d new file mode 100644 index 0000000..e8c222b Binary files /dev/null and b/mods/nativevillages/models/Sledge.b3d differ diff --git a/mods/nativevillages/models/Sledgewithdog.b3d b/mods/nativevillages/models/Sledgewithdog.b3d new file mode 100644 index 0000000..68a968e Binary files /dev/null and b/mods/nativevillages/models/Sledgewithdog.b3d differ diff --git a/mods/nativevillages/models/Toad.b3d b/mods/nativevillages/models/Toad.b3d new file mode 100644 index 0000000..a347536 Binary files /dev/null and b/mods/nativevillages/models/Toad.b3d differ diff --git a/mods/nativevillages/models/Zombie.b3d b/mods/nativevillages/models/Zombie.b3d new file mode 100644 index 0000000..8580ed2 Binary files /dev/null and b/mods/nativevillages/models/Zombie.b3d differ diff --git a/mods/nativevillages/models/Zombie2.b3d b/mods/nativevillages/models/Zombie2.b3d new file mode 100644 index 0000000..5a392c3 Binary files /dev/null and b/mods/nativevillages/models/Zombie2.b3d differ diff --git a/mods/nativevillages/savannablocks.lua b/mods/nativevillages/savannablocks.lua new file mode 100644 index 0000000..7c7cd8f --- /dev/null +++ b/mods/nativevillages/savannablocks.lua @@ -0,0 +1,136 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_node("nativevillages:savannathrone", { + description = S"Savanna Throne", + visual_scale = 1, + mesh = "Savannathrone.b3d", + tiles = {"texturesavannathrone.png"}, + inventory_image = "asavannathrone.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + walkable = false, + drawtype = "mesh", + collision_box = { + type = "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}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:bronzeblock", + recipe = "nativevillages:savannathrone", +}) + +minetest.register_node("nativevillages:savannavessels", { + description = S"Savanna Vessels", + visual_scale = 1, + mesh = "Savannavessels.b3d", + tiles = {"texturesavannavessels.png"}, + inventory_image = "asavannavessels.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "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}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:bronzeblock", + recipe = "nativevillages:savannavessels", +}) + +minetest.register_node("nativevillages:savannavshrine", { + description = S"Savanna Shrine", + visual_scale = 1, + mesh = "Savannashrine.b3d", + tiles = {"texturesavannashrine.png"}, + inventory_image = "asavannashrine.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + walkable = false, + drawtype = "mesh", + collision_box = { + type = "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}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:bronzeblock", + recipe = "nativevillages:savannashrine", +}) + +minetest.register_node("nativevillages:savannacorpse", { + description = S"Savanna Corpse", + visual_scale = 1, + mesh = "Savannacorpse.b3d", + tiles = {"texturesavannacorpse.png"}, + inventory_image = "asavannacorpse.png", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.5, 0.5, 0.1, 1.3}, + --[[{-1, -0.5, -0.5, 0.5, 0.1, 1.3}, + {-1, -0.5, -0.5, 0.5, 0.1, 1.3}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.5, 0.5, 0.1, 1.3} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "mobs:meat", + recipe = "nativevillages:savannacorpse", +}) \ No newline at end of file diff --git a/mods/nativevillages/savannabuildings.lua b/mods/nativevillages/savannabuildings.lua new file mode 100644 index 0000000..d552476 --- /dev/null +++ b/mods/nativevillages/savannabuildings.lua @@ -0,0 +1,129 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:savannahouse1", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannahouse1_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannahouse2", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannahouse2_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannahouse3", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannahouse3_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannawitchhouse", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannawitchhouse_30_0.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannawell", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannawell_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannastable", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannastable_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannapond", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannapond_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + +minetest.register_decoration({ + name = "nativevillages:savannalogs", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -29, + sidelen = 16, + fill_ratio = 0.00003, + biomes = {"savanna"}, + y_max = 15.5, + y_min = 10.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannalogs_30_180.mts", + flags = "force_placement", + rotation = "random", +}) + + + + + + + + diff --git a/mods/nativevillages/savannacreatures.lua b/mods/nativevillages/savannacreatures.lua new file mode 100644 index 0000000..a2d70a2 --- /dev/null +++ b/mods/nativevillages/savannacreatures.lua @@ -0,0 +1,868 @@ +local S = minetest.get_translator("nativevillages") + +mobs:register_mob("nativevillages:malelion", { +stepheight = 1, + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 10, + hp_min = 45, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Lionmale.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturelionmale.png"}, + }, + sounds = { + attack = "nativevillages_lion2", + random = "nativevillages_lion", + damage = "nativevillages_lion4", + death = "nativevillages_lion3", + distance = 10, + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_lion2", + random = "nativevillages_lion", + damage = "nativevillages_lion4", + death = "nativevillages_lion3", + distance = 10, + }, + walk_velocity = 1, + run_velocity = 3, + runaway = false, + jump = false, + jump_height = 2, + stay_near = {{"nativevillages:savannacorpse"}, 4}, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 4, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + follow = { + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:malelion", + neighbors = {"nativevillages:savannacorpse"}, + nodes = {"default:dry_dirt_with_dry_grass"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 10, + max_height = 50, + +}) +end + +mobs:register_egg("nativevillages:malelion", S("Male Lion"), "amalelion.png") + +mobs:register_mob("nativevillages:femalelion", { +stepheight = 1, + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 7, + hp_min = 45, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Lionfemale.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturelionfemale.png"}, + }, + sounds = { + attack = "nativevillages_lion2", + random = "nativevillages_lion", + damage = "nativevillages_lion4", + death = "nativevillages_lion3", + distance = 10, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 4, + runaway = false, + jump = false, + jump_height = 2, + stay_near = {{"nativevillages:savannacorpse"}, 4}, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fear_height = 4, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + follow = { + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:femalelion", + neighbors = {"nativevillages:savannacorpse"}, + nodes = {"default:dry_dirt_with_dry_grass"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 10, + max_height = 50, + +}) +end + +mobs:register_egg("nativevillages:femalelion", S("Female Lion"), "afemalelion.png") + +mobs.savannadoctor_drops = { + "nativevillages:zombietame" +} + +mobs:register_mob("nativevillages:savannadoctor", { + type = "npc", + passive = false, + damage = 3, + range = 4, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 70, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Savannadoctor.b3d", + drawtype = "front", + textures = { + {"texturesavannadoctor.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_witchdoctor", + attack = "nativevillages_witchdoctor2", + damage = "nativevillages_savannamale4", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:savannavshrine"}, 4}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.savannadoctor_drops + if item:get_name() == "people:warriorgrave" or item:get_name() == "people:doctorgrave" or item:get_name() == "people:minergrave" or item:get_name() == "people:farmergrave" or item:get_name() == "people:villagergrave" or item:get_name() == "people:instructorgrave" or item:get_name() == "people:smithgrave" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.savannadoctor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Witch Doctor created a tame Zombie!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Witch Doctor stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Witch Doctor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:savannadoctor", + nodes = {"default:dry_dirt_with_dry_grass", "default:clay"}, + neighbors = {"nativevillages:savannavshrine"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:savannadoctor", S("Witch Doctor"), "asavannadoctor.png") + +mobs.savannaqueen_drops = { + "default:goldblock" +} + +mobs:register_mob("nativevillages:savannaqueen", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 50, + hp_max = 100, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Savannaqueen.b3d", + drawtype = "front", + textures = { + {"texturesavannaqueen.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_savannafemale", + attack = "nativevillages_savannafemale3", + damage = "nativevillages_savannafemale4", + death = "nativevillages_savannafemale2", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:savannavshrine", "nativevillages:savannathrone", "nativevillages:savannavessels"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.savannaqueen_drops + if item:get_name() == "default:diamond" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.savannaqueen_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Royalty dropped you an item for gold!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Royalty stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Royalty will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:savannaqueen", + nodes = {"default:dry_dirt_with_dry_grass", "default:clay"}, + neighbors = {"nativevillages:savannathrone"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:savannaqueen", S("Savanna Queen"), "asavannaqueen.png") + +mobs.savannamale_drops = { + "farming:vanilla", "farming:pumpkin", "farming:potato", "farming:pineapple", "farming:pepper", "farming:onion", "farming:peas", "farming:melon", "farming:cucumber", "farming:coffee_beans" +} + +mobs:register_mob("nativevillages:savannamale", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Savannamale.b3d", + drawtype = "front", + textures = { + {"texturesavannamale.png"}, + {"texturesavannamale2.png"}, + {"texturesavannamale3.png"}, + {"texturesavannamale4.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_savannamale", + attack = "nativevillages_savannamale3", + damage = "nativevillages_savannamale4", + death = "nativevillages_savannamale2", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:savannavshrine", "nativevillages:savannathrone", "nativevillages:savannavessels"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.savannamale_drops + if item:get_name() == "nativevillages:pearl" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.savannamale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Savanna Villager dropped you an item for a pearl!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Savanna Villager stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Savanna Villager will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:savannamale", + nodes = {"default:dry_dirt_with_dry_grass", "default:clay"}, + neighbors = {"nativevillages:savannavessels"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:savannamale", S("Male Savanna Villager"), "asavannamale.png") + +mobs.savannaking_drops = { + "default:goldblock" +} + +mobs:register_mob("nativevillages:savannaking", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 50, + hp_max = 120, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Savannaking.b3d", + drawtype = "front", + textures = { + {"texturesavannaking.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_savannamale", + attack = "nativevillages_savannamale3", + damage = "nativevillages_savannamale4", + death = "nativevillages_savannamale2", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:savannavshrine", "nativevillages:savannathrone", "nativevillages:savannavessels"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.savannaking_drops + if item:get_name() == "default:diamond" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.savannaking_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Royalty dropped you an item for gold!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Royalty stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Royalty will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:savannaking", + nodes = {"default:dry_dirt_with_dry_grass", "default:clay"}, + neighbors = {"nativevillages:savannathrone"}, + min_light = 0, + interval = 60, + active_object_count = 1, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:savannaking", S("Savanna King"), "asavannaking.png") + +mobs.savannafemale_drops = { + "farming:vanilla", "farming:pumpkin", "farming:potato", "farming:pineapple", "farming:pepper", "farming:onion", "farming:peas", "farming:melon", "farming:cucumber", "farming:coffee_beans" +} + +mobs:register_mob("nativevillages:savannafemale", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Savannafemale.b3d", + drawtype = "front", + textures = { + {"texturesavannafemale.png"}, + {"texturesavannafemale2.png"}, + {"texturesavannafemale3.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_savannafemale", + attack = "nativevillages_savannafemale3", + damage = "nativevillages_savannafemale4", + death = "nativevillages_savannafemale2", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + stay_near = {{"nativevillages:savannavshrine", "nativevillages:savannathrone", "nativevillages:savannavessels"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {}, + view_range = 15, + owner = "", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.savannafemale_drops + if item:get_name() == "nativevillages:pearl" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.savannafemale_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Savanna Villager dropped you an item for a pearl!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Savanna Villager stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Savanna Villager will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_nativevillages then +mobs:spawn({ + name = "nativevillages:savannafemale", + nodes = {"default:dry_dirt_with_dry_grass", "default:clay"}, + neighbors = {"nativevillages:savannavessels"}, + min_light = 0, + interval = 60, + active_object_count = 2, + chance = 1, -- 15000 + min_height = 0, + max_height = 120, +}) +end + +mobs:register_egg("nativevillages:savannafemale", S("Female Savanna Villager"), "asavannafemale.png") + diff --git a/mods/nativevillages/schematics/cannibalcage_30_270.mts b/mods/nativevillages/schematics/cannibalcage_30_270.mts new file mode 100644 index 0000000..711dc88 Binary files /dev/null and b/mods/nativevillages/schematics/cannibalcage_30_270.mts differ diff --git a/mods/nativevillages/schematics/cannibalhouse1_30_90.mts b/mods/nativevillages/schematics/cannibalhouse1_30_90.mts new file mode 100644 index 0000000..b37b33c Binary files /dev/null and b/mods/nativevillages/schematics/cannibalhouse1_30_90.mts differ diff --git a/mods/nativevillages/schematics/cannibalhouse2_30_90.mts b/mods/nativevillages/schematics/cannibalhouse2_30_90.mts new file mode 100644 index 0000000..8803209 Binary files /dev/null and b/mods/nativevillages/schematics/cannibalhouse2_30_90.mts differ diff --git a/mods/nativevillages/schematics/cannibalhouse3_30_90.mts b/mods/nativevillages/schematics/cannibalhouse3_30_90.mts new file mode 100644 index 0000000..e8398f3 Binary files /dev/null and b/mods/nativevillages/schematics/cannibalhouse3_30_90.mts differ diff --git a/mods/nativevillages/schematics/cannibalpit_30_270.mts b/mods/nativevillages/schematics/cannibalpit_30_270.mts new file mode 100644 index 0000000..d4c29bc Binary files /dev/null and b/mods/nativevillages/schematics/cannibalpit_30_270.mts differ diff --git a/mods/nativevillages/schematics/cannibaltower_30_180.mts b/mods/nativevillages/schematics/cannibaltower_30_180.mts new file mode 100644 index 0000000..1be7042 Binary files /dev/null and b/mods/nativevillages/schematics/cannibaltower_30_180.mts differ diff --git a/mods/nativevillages/schematics/deserstable_30_0.mts b/mods/nativevillages/schematics/deserstable_30_0.mts new file mode 100644 index 0000000..86ce45a Binary files /dev/null and b/mods/nativevillages/schematics/deserstable_30_0.mts differ diff --git a/mods/nativevillages/schematics/deserthouse1_30_180.mts b/mods/nativevillages/schematics/deserthouse1_30_180.mts new file mode 100644 index 0000000..69271b7 Binary files /dev/null and b/mods/nativevillages/schematics/deserthouse1_30_180.mts differ diff --git a/mods/nativevillages/schematics/deserthouse2_30_180.mts b/mods/nativevillages/schematics/deserthouse2_30_180.mts new file mode 100644 index 0000000..0912152 Binary files /dev/null and b/mods/nativevillages/schematics/deserthouse2_30_180.mts differ diff --git a/mods/nativevillages/schematics/deserthouse3_30_180.mts b/mods/nativevillages/schematics/deserthouse3_30_180.mts new file mode 100644 index 0000000..eb3530a Binary files /dev/null and b/mods/nativevillages/schematics/deserthouse3_30_180.mts differ diff --git a/mods/nativevillages/schematics/deserthouse4_30_180.mts b/mods/nativevillages/schematics/deserthouse4_30_180.mts new file mode 100644 index 0000000..5c699ca Binary files /dev/null and b/mods/nativevillages/schematics/deserthouse4_30_180.mts differ diff --git a/mods/nativevillages/schematics/deserthouse5_30_0.mts b/mods/nativevillages/schematics/deserthouse5_30_0.mts new file mode 100644 index 0000000..2ed7083 Binary files /dev/null and b/mods/nativevillages/schematics/deserthouse5_30_0.mts differ diff --git a/mods/nativevillages/schematics/desertmarket_30_0.mts b/mods/nativevillages/schematics/desertmarket_30_0.mts new file mode 100644 index 0000000..ca4820f Binary files /dev/null and b/mods/nativevillages/schematics/desertmarket_30_0.mts differ diff --git a/mods/nativevillages/schematics/desertwell_30_0.mts b/mods/nativevillages/schematics/desertwell_30_0.mts new file mode 100644 index 0000000..30749d1 Binary files /dev/null and b/mods/nativevillages/schematics/desertwell_30_0.mts differ diff --git a/mods/nativevillages/schematics/grasslandblot_30_180.mts b/mods/nativevillages/schematics/grasslandblot_30_180.mts new file mode 100644 index 0000000..5d11143 Binary files /dev/null and b/mods/nativevillages/schematics/grasslandblot_30_180.mts differ diff --git a/mods/nativevillages/schematics/grasslandhouse1_30_0.mts b/mods/nativevillages/schematics/grasslandhouse1_30_0.mts new file mode 100644 index 0000000..07c3f3c Binary files /dev/null and b/mods/nativevillages/schematics/grasslandhouse1_30_0.mts differ diff --git a/mods/nativevillages/schematics/grasslandhouse2_30_0.mts b/mods/nativevillages/schematics/grasslandhouse2_30_0.mts new file mode 100644 index 0000000..db0b9ef Binary files /dev/null and b/mods/nativevillages/schematics/grasslandhouse2_30_0.mts differ diff --git a/mods/nativevillages/schematics/grasslandhouse3_30_0.mts b/mods/nativevillages/schematics/grasslandhouse3_30_0.mts new file mode 100644 index 0000000..223d97e Binary files /dev/null and b/mods/nativevillages/schematics/grasslandhouse3_30_0.mts differ diff --git a/mods/nativevillages/schematics/grasslandhouse4_30_0.mts b/mods/nativevillages/schematics/grasslandhouse4_30_0.mts new file mode 100644 index 0000000..3a5b2ee Binary files /dev/null and b/mods/nativevillages/schematics/grasslandhouse4_30_0.mts differ diff --git a/mods/nativevillages/schematics/grasslandhouse5_30_180.mts b/mods/nativevillages/schematics/grasslandhouse5_30_180.mts new file mode 100644 index 0000000..f8c8829 Binary files /dev/null and b/mods/nativevillages/schematics/grasslandhouse5_30_180.mts differ diff --git a/mods/nativevillages/schematics/grasslandpond_30_180.mts b/mods/nativevillages/schematics/grasslandpond_30_180.mts new file mode 100644 index 0000000..aba1d52 Binary files /dev/null and b/mods/nativevillages/schematics/grasslandpond_30_180.mts differ diff --git a/mods/nativevillages/schematics/grasslandstable_30_180.mts b/mods/nativevillages/schematics/grasslandstable_30_180.mts new file mode 100644 index 0000000..5d1e1bf Binary files /dev/null and b/mods/nativevillages/schematics/grasslandstable_30_180.mts differ diff --git a/mods/nativevillages/schematics/icehouse1_30_90.mts b/mods/nativevillages/schematics/icehouse1_30_90.mts new file mode 100644 index 0000000..9c44879 Binary files /dev/null and b/mods/nativevillages/schematics/icehouse1_30_90.mts differ diff --git a/mods/nativevillages/schematics/icehouse2_30_90.mts b/mods/nativevillages/schematics/icehouse2_30_90.mts new file mode 100644 index 0000000..8bb4387 Binary files /dev/null and b/mods/nativevillages/schematics/icehouse2_30_90.mts differ diff --git a/mods/nativevillages/schematics/icehouse3_30_90.mts b/mods/nativevillages/schematics/icehouse3_30_90.mts new file mode 100644 index 0000000..0a52204 Binary files /dev/null and b/mods/nativevillages/schematics/icehouse3_30_90.mts differ diff --git a/mods/nativevillages/schematics/icelogs_30_90.mts b/mods/nativevillages/schematics/icelogs_30_90.mts new file mode 100644 index 0000000..9286054 Binary files /dev/null and b/mods/nativevillages/schematics/icelogs_30_90.mts differ diff --git a/mods/nativevillages/schematics/icepelts_30_90.mts b/mods/nativevillages/schematics/icepelts_30_90.mts new file mode 100644 index 0000000..d70c7db Binary files /dev/null and b/mods/nativevillages/schematics/icepelts_30_90.mts differ diff --git a/mods/nativevillages/schematics/icesledge_30_90.mts b/mods/nativevillages/schematics/icesledge_30_90.mts new file mode 100644 index 0000000..c8121e4 Binary files /dev/null and b/mods/nativevillages/schematics/icesledge_30_90.mts differ diff --git a/mods/nativevillages/schematics/lakefishtrap_0_0.mts b/mods/nativevillages/schematics/lakefishtrap_0_0.mts new file mode 100644 index 0000000..9a07363 Binary files /dev/null and b/mods/nativevillages/schematics/lakefishtrap_0_0.mts differ diff --git a/mods/nativevillages/schematics/lakeharbour_0_0.mts b/mods/nativevillages/schematics/lakeharbour_0_0.mts new file mode 100644 index 0000000..881a66e Binary files /dev/null and b/mods/nativevillages/schematics/lakeharbour_0_0.mts differ diff --git a/mods/nativevillages/schematics/lakehouse1_0_0.mts b/mods/nativevillages/schematics/lakehouse1_0_0.mts new file mode 100644 index 0000000..c30ad3a Binary files /dev/null and b/mods/nativevillages/schematics/lakehouse1_0_0.mts differ diff --git a/mods/nativevillages/schematics/lakehouse2_0_0.mts b/mods/nativevillages/schematics/lakehouse2_0_0.mts new file mode 100644 index 0000000..2f4bd92 Binary files /dev/null and b/mods/nativevillages/schematics/lakehouse2_0_0.mts differ diff --git a/mods/nativevillages/schematics/lakehouse3_0_0.mts b/mods/nativevillages/schematics/lakehouse3_0_0.mts new file mode 100644 index 0000000..b85d2c6 Binary files /dev/null and b/mods/nativevillages/schematics/lakehouse3_0_0.mts differ diff --git a/mods/nativevillages/schematics/lakehouse4_0_0.mts b/mods/nativevillages/schematics/lakehouse4_0_0.mts new file mode 100644 index 0000000..e647081 Binary files /dev/null and b/mods/nativevillages/schematics/lakehouse4_0_0.mts differ diff --git a/mods/nativevillages/schematics/savannahouse1_30_0.mts b/mods/nativevillages/schematics/savannahouse1_30_0.mts new file mode 100644 index 0000000..5b32c3c Binary files /dev/null and b/mods/nativevillages/schematics/savannahouse1_30_0.mts differ diff --git a/mods/nativevillages/schematics/savannahouse2_30_0.mts b/mods/nativevillages/schematics/savannahouse2_30_0.mts new file mode 100644 index 0000000..347de47 Binary files /dev/null and b/mods/nativevillages/schematics/savannahouse2_30_0.mts differ diff --git a/mods/nativevillages/schematics/savannahouse3_30_0.mts b/mods/nativevillages/schematics/savannahouse3_30_0.mts new file mode 100644 index 0000000..9a349af Binary files /dev/null and b/mods/nativevillages/schematics/savannahouse3_30_0.mts differ diff --git a/mods/nativevillages/schematics/savannalogs_30_180.mts b/mods/nativevillages/schematics/savannalogs_30_180.mts new file mode 100644 index 0000000..8c95dad Binary files /dev/null and b/mods/nativevillages/schematics/savannalogs_30_180.mts differ diff --git a/mods/nativevillages/schematics/savannapond_30_180.mts b/mods/nativevillages/schematics/savannapond_30_180.mts new file mode 100644 index 0000000..b5aae25 Binary files /dev/null and b/mods/nativevillages/schematics/savannapond_30_180.mts differ diff --git a/mods/nativevillages/schematics/savannastable_30_180.mts b/mods/nativevillages/schematics/savannastable_30_180.mts new file mode 100644 index 0000000..27eb07b Binary files /dev/null and b/mods/nativevillages/schematics/savannastable_30_180.mts differ diff --git a/mods/nativevillages/schematics/savannawell_30_180.mts b/mods/nativevillages/schematics/savannawell_30_180.mts new file mode 100644 index 0000000..2e12370 Binary files /dev/null and b/mods/nativevillages/schematics/savannawell_30_180.mts differ diff --git a/mods/nativevillages/schematics/savannawitchhouse_30_0.mts b/mods/nativevillages/schematics/savannawitchhouse_30_0.mts new file mode 100644 index 0000000..95da599 Binary files /dev/null and b/mods/nativevillages/schematics/savannawitchhouse_30_0.mts differ diff --git a/mods/nativevillages/screenshot.png b/mods/nativevillages/screenshot.png new file mode 100644 index 0000000..8aef26b Binary files /dev/null and b/mods/nativevillages/screenshot.png differ diff --git a/mods/nativevillages/slavecreatures.lua b/mods/nativevillages/slavecreatures.lua new file mode 100644 index 0000000..c20f67e --- /dev/null +++ b/mods/nativevillages/slavecreatures.lua @@ -0,0 +1,736 @@ +local S = minetest.get_translator("nativevillages") + +mobs.slavechickenbreeder_drops = { + "nativevillages:desertchickentame" +} + +mobs:register_mob("nativevillages:slavechickenbreeder", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Slavechickenbreeder.b3d", + drawtype = "front", + textures = { + {"textureslavechickenbreeder.png"}, + {"textureslavechickenbreeder2.png"}, + {"textureslavechickenbreeder3.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_desertfemale2", + random = "nativevillages_desertfemale", + damage = "nativevillages_desertfemale4", + death = "nativevillages_icevillagerfemale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + stay_near = {{"people:feeder", "people:villagerbed", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.slavechickenbreeder_drops + if item:get_name() == "farming:seed_wheat" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.slavechickenbreeder_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Chicken hatched!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Chicken Breeder stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Chicken Breeder will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:slavechickenbreeder", S("Chicken Breeder"), "aslavechickenbreeder.png") + +mobs.slavecowherder_drops = { + "nativevillages:domesticcow" +} + +mobs:register_mob("nativevillages:slavecowherder", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Slavecowherder.b3d", + drawtype = "front", + textures = { + {"textureslavecowherder.png"}, + {"textureslavecowherder2.png"}, + + }, + makes_footstep_sound = true, +sounds = { + attack = "nativevillages_grasslandfemale2", + random = "nativevillages_grasslandfemale", + damage = "nativevillages_grasslandfemale3", + death = "nativevillages_grasslandfemale3", + distance = 10, + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + stay_near = {{"people:feeder", "people:villagerbed", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.slavecowherder_drops + if item:get_name() == "farming:wheat" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.slavecowherder_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Cow has been raised!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Cow Herder stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Cow Herder will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:slavecowherder", S("Cow Herder"), "aslavecowherder.png") + +mobs.slaveliontrainer_drops = { + "nativevillages:femaleliontame", "nativevillages:maleliontame" +} + +mobs:register_mob("nativevillages:slaveliontrainer", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 90, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Slaveliontrainer.b3d", + drawtype = "front", + textures = { + {"textureslaveliontrainer.png"}, + {"textureslaveliontrainer2.png"}, + {"textureslaveliontrainer3.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_savannamale", + attack = "nativevillages_savannamale3", + damage = "nativevillages_savannamale4", + death = "nativevillages_savannamale2", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + fear_height = 3, + stay_near = {{"nativevillages:savannacorpse", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.slaveliontrainer_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.slaveliontrainer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Lion has been raised!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Lion Trainer stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Lion Trainer will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:slaveliontrainer", S("Lion Trainer"), "aslaveliontrainer.png") + + + +mobs:register_mob("nativevillages:slavefemaledancer", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 40, + hp_max = 50, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Slavefemaledancer.b3d", + drawtype = "front", + textures = { + {"textureslavefemaledancer.png"}, + {"textureslavefemaledancer2.png"}, + {"textureslavefemaledancer3.png"}, + {"textureslavefemaledancer4.png"}, + {"textureslavefemaledancer5.png"}, + + }, + makes_footstep_sound = true, +sounds = { + random = "nativevillages_dancefermale", + attack = "nativevillages_dancefermale2", + damage = "nativevillages_dancefermale3", + death = "nativevillages_dancefermale4", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + fear_height = 3, + stay_near = {{"people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + stand3_start = 200, + stand3_end = 300, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 400, + punch_end = 500, + die_start = 400, + die_end = 500, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.npc_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for gold!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Dancer will dance!")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Dancer will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:slavefemaledancer", S("Female Dancer"), "aslavefemaledancer.png") + + +mobs:register_mob("nativevillages:slaveloyalcannibal", { + type = "npc", + passive = false, + damage = 6, + reach = 4, + group_attack = true, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 50, + hp_max = 100, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Slaveloyalcannibal.b3d", + drawtype = "front", + textures = { + {"textureslaveloyalcannibal.png"}, + {"textureslaveloyalcannibal2.png"}, + {"textureslaveloyalcannibal3.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_cannibalmale", + attack = "nativevillages_cannibalmale2", + damage = "nativevillages_cannibalmale3", + death = "nativevillages_cannibalmale4", + }, + walk_velocity = 2, + run_velocity = 3, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"nativevillages:driedhumanmeat"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + fear_height = 3, + stay_near = {{"nativevillages:driedpeople", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + animation = { + speed_normal = 100, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + +on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Cannibal stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Cannibal will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:slaveloyalcannibal", S("Loyal Cannibal"), "aslaveloyalcannibal.png") + + +mobs:register_mob("nativevillages:slavemaledancer", { + type = "npc", + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 60, + hp_max = 70, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Slavemaledancer.b3d", + drawtype = "front", + textures = { + {"textureslavemaledancer.png"}, + {"textureslavemaledancer2.png"}, + {"textureslavemaledancer3.png"}, + {"textureslavemaledancer4.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "nativevillages_dancermale", + attack = "nativevillages_dancermale2", + damage = "nativevillages_dancermale3", + death = "nativevillages_dancermale4", + }, + walk_velocity = 1, + walk_chance = 15, + run_velocity = 3, + jump = true, + drops = { + }, + stay_near = {{"people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + stand3_start = 200, + stand3_end = 300, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 400, + punch_end = 500, + die_start = 400, + die_end = 500, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.npc_drops or mobs.npc_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for gold!")) + + return + end + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Dancer will dance!")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Dancer will follow you.")) + end + end + end, +}) + + +mobs:register_egg("nativevillages:slavemaledancer", S("Male Dancer"), "aslavemaledancer.png") \ No newline at end of file diff --git a/mods/nativevillages/sounds/nativevillages_cannibalchild.ogg b/mods/nativevillages/sounds/nativevillages_cannibalchild.ogg new file mode 100644 index 0000000..8766784 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalchild.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalchild2.ogg b/mods/nativevillages/sounds/nativevillages_cannibalchild2.ogg new file mode 100644 index 0000000..f951142 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalchild2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalchild3.ogg b/mods/nativevillages/sounds/nativevillages_cannibalchild3.ogg new file mode 100644 index 0000000..79c7350 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalchild3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalfemale.ogg b/mods/nativevillages/sounds/nativevillages_cannibalfemale.ogg new file mode 100644 index 0000000..3e3247e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalfemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalfemale2.ogg b/mods/nativevillages/sounds/nativevillages_cannibalfemale2.ogg new file mode 100644 index 0000000..f50e9da Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalfemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalfemale3.ogg b/mods/nativevillages/sounds/nativevillages_cannibalfemale3.ogg new file mode 100644 index 0000000..04ae3ad Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalfemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalfemale4.ogg b/mods/nativevillages/sounds/nativevillages_cannibalfemale4.ogg new file mode 100644 index 0000000..6ebc5dd Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalfemale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalmale.ogg b/mods/nativevillages/sounds/nativevillages_cannibalmale.ogg new file mode 100644 index 0000000..51ea0fa Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalmale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalmale2.ogg b/mods/nativevillages/sounds/nativevillages_cannibalmale2.ogg new file mode 100644 index 0000000..534a733 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalmale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalmale3.ogg b/mods/nativevillages/sounds/nativevillages_cannibalmale3.ogg new file mode 100644 index 0000000..94c4ced Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalmale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cannibalmale4.ogg b/mods/nativevillages/sounds/nativevillages_cannibalmale4.ogg new file mode 100644 index 0000000..ee32df8 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cannibalmale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cat.ogg b/mods/nativevillages/sounds/nativevillages_cat.ogg new file mode 100644 index 0000000..f094d80 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cat.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cat2.ogg b/mods/nativevillages/sounds/nativevillages_cat2.ogg new file mode 100644 index 0000000..601340e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cat2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cat3.ogg b/mods/nativevillages/sounds/nativevillages_cat3.ogg new file mode 100644 index 0000000..7b38019 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cat3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cat4.ogg b/mods/nativevillages/sounds/nativevillages_cat4.ogg new file mode 100644 index 0000000..a8743f6 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cat4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_chicken.ogg b/mods/nativevillages/sounds/nativevillages_chicken.ogg new file mode 100644 index 0000000..15cb8b6 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_chicken.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_chicken2.ogg b/mods/nativevillages/sounds/nativevillages_chicken2.ogg new file mode 100644 index 0000000..7681daf Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_chicken2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_chicken3.ogg b/mods/nativevillages/sounds/nativevillages_chicken3.ogg new file mode 100644 index 0000000..6df7ea6 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_chicken3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cow.ogg b/mods/nativevillages/sounds/nativevillages_cow.ogg new file mode 100644 index 0000000..32cf0eb Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cow.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cow2.ogg b/mods/nativevillages/sounds/nativevillages_cow2.ogg new file mode 100644 index 0000000..52e472e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cow2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_cow3.ogg b/mods/nativevillages/sounds/nativevillages_cow3.ogg new file mode 100644 index 0000000..d8d612c Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_cow3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancefermale.ogg b/mods/nativevillages/sounds/nativevillages_dancefermale.ogg new file mode 100644 index 0000000..924c4d6 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancefermale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancefermale2.ogg b/mods/nativevillages/sounds/nativevillages_dancefermale2.ogg new file mode 100644 index 0000000..34a7da7 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancefermale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancefermale3.ogg b/mods/nativevillages/sounds/nativevillages_dancefermale3.ogg new file mode 100644 index 0000000..738c5ba Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancefermale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancefermale4.ogg b/mods/nativevillages/sounds/nativevillages_dancefermale4.ogg new file mode 100644 index 0000000..191efbb Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancefermale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancermale.ogg b/mods/nativevillages/sounds/nativevillages_dancermale.ogg new file mode 100644 index 0000000..b22a008 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancermale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancermale2.ogg b/mods/nativevillages/sounds/nativevillages_dancermale2.ogg new file mode 100644 index 0000000..6b34ca6 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancermale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancermale3.ogg b/mods/nativevillages/sounds/nativevillages_dancermale3.ogg new file mode 100644 index 0000000..3875334 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancermale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dancermale4.ogg b/mods/nativevillages/sounds/nativevillages_dancermale4.ogg new file mode 100644 index 0000000..895af70 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dancermale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertfemale.ogg b/mods/nativevillages/sounds/nativevillages_desertfemale.ogg new file mode 100644 index 0000000..bc5b3ff Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertfemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertfemale2.ogg b/mods/nativevillages/sounds/nativevillages_desertfemale2.ogg new file mode 100644 index 0000000..de918f0 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertfemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertfemale3.ogg b/mods/nativevillages/sounds/nativevillages_desertfemale3.ogg new file mode 100644 index 0000000..f3715a1 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertfemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertfemale4.ogg b/mods/nativevillages/sounds/nativevillages_desertfemale4.ogg new file mode 100644 index 0000000..1da374e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertfemale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertmale.ogg b/mods/nativevillages/sounds/nativevillages_desertmale.ogg new file mode 100644 index 0000000..52e7333 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertmale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertmale2.ogg b/mods/nativevillages/sounds/nativevillages_desertmale2.ogg new file mode 100644 index 0000000..771bd1b Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertmale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertmale3.ogg b/mods/nativevillages/sounds/nativevillages_desertmale3.ogg new file mode 100644 index 0000000..d0f70f6 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertmale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_desertmale4.ogg b/mods/nativevillages/sounds/nativevillages_desertmale4.ogg new file mode 100644 index 0000000..85acd14 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_desertmale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dog.ogg b/mods/nativevillages/sounds/nativevillages_dog.ogg new file mode 100644 index 0000000..751040a Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dog.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dog2.ogg b/mods/nativevillages/sounds/nativevillages_dog2.ogg new file mode 100644 index 0000000..68d5505 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dog2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dog3.ogg b/mods/nativevillages/sounds/nativevillages_dog3.ogg new file mode 100644 index 0000000..488ab68 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dog3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dog4.ogg b/mods/nativevillages/sounds/nativevillages_dog4.ogg new file mode 100644 index 0000000..69779d2 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dog4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_dog5.ogg b/mods/nativevillages/sounds/nativevillages_dog5.ogg new file mode 100644 index 0000000..9db8f35 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_dog5.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_grasslandfemale.ogg b/mods/nativevillages/sounds/nativevillages_grasslandfemale.ogg new file mode 100644 index 0000000..8152e13 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_grasslandfemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_grasslandfemale2.ogg b/mods/nativevillages/sounds/nativevillages_grasslandfemale2.ogg new file mode 100644 index 0000000..4caa5f9 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_grasslandfemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_grasslandfemale3.ogg b/mods/nativevillages/sounds/nativevillages_grasslandfemale3.ogg new file mode 100644 index 0000000..bb1693d Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_grasslandfemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_grasslandmale.ogg b/mods/nativevillages/sounds/nativevillages_grasslandmale.ogg new file mode 100644 index 0000000..8e493d1 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_grasslandmale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_grasslandmale2.ogg b/mods/nativevillages/sounds/nativevillages_grasslandmale2.ogg new file mode 100644 index 0000000..07494dd Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_grasslandmale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_grasslandmale3.ogg b/mods/nativevillages/sounds/nativevillages_grasslandmale3.ogg new file mode 100644 index 0000000..6ec92ba Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_grasslandmale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagerfemale.ogg b/mods/nativevillages/sounds/nativevillages_icevillagerfemale.ogg new file mode 100644 index 0000000..255a188 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagerfemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagerfemale2.ogg b/mods/nativevillages/sounds/nativevillages_icevillagerfemale2.ogg new file mode 100644 index 0000000..7fbd815 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagerfemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagerfemale3.ogg b/mods/nativevillages/sounds/nativevillages_icevillagerfemale3.ogg new file mode 100644 index 0000000..e43ec09 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagerfemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagerfemale4.ogg b/mods/nativevillages/sounds/nativevillages_icevillagerfemale4.ogg new file mode 100644 index 0000000..9147bda Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagerfemale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagermale.ogg b/mods/nativevillages/sounds/nativevillages_icevillagermale.ogg new file mode 100644 index 0000000..eb33b0e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagermale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagermale2.ogg b/mods/nativevillages/sounds/nativevillages_icevillagermale2.ogg new file mode 100644 index 0000000..8a84667 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagermale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagermale3.ogg b/mods/nativevillages/sounds/nativevillages_icevillagermale3.ogg new file mode 100644 index 0000000..86ec653 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagermale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_icevillagermale4.ogg b/mods/nativevillages/sounds/nativevillages_icevillagermale4.ogg new file mode 100644 index 0000000..a897145 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_icevillagermale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakefemale.ogg b/mods/nativevillages/sounds/nativevillages_lakefemale.ogg new file mode 100644 index 0000000..23735cf Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakefemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakefemale2.ogg b/mods/nativevillages/sounds/nativevillages_lakefemale2.ogg new file mode 100644 index 0000000..c437be8 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakefemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakefemale3.ogg b/mods/nativevillages/sounds/nativevillages_lakefemale3.ogg new file mode 100644 index 0000000..0ee7c2e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakefemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakefemale4.ogg b/mods/nativevillages/sounds/nativevillages_lakefemale4.ogg new file mode 100644 index 0000000..12cc181 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakefemale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakemale.ogg b/mods/nativevillages/sounds/nativevillages_lakemale.ogg new file mode 100644 index 0000000..996d506 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakemale2.ogg b/mods/nativevillages/sounds/nativevillages_lakemale2.ogg new file mode 100644 index 0000000..e1e25e1 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakemale3.ogg b/mods/nativevillages/sounds/nativevillages_lakemale3.ogg new file mode 100644 index 0000000..8bbd81e Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lakemale4.ogg b/mods/nativevillages/sounds/nativevillages_lakemale4.ogg new file mode 100644 index 0000000..ad603ee Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lakemale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lion.ogg b/mods/nativevillages/sounds/nativevillages_lion.ogg new file mode 100644 index 0000000..7db7e2a Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lion.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lion2.ogg b/mods/nativevillages/sounds/nativevillages_lion2.ogg new file mode 100644 index 0000000..4bf172d Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lion2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lion3.ogg b/mods/nativevillages/sounds/nativevillages_lion3.ogg new file mode 100644 index 0000000..db89d66 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lion3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_lion4.ogg b/mods/nativevillages/sounds/nativevillages_lion4.ogg new file mode 100644 index 0000000..bf5e469 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_lion4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannafemale.ogg b/mods/nativevillages/sounds/nativevillages_savannafemale.ogg new file mode 100644 index 0000000..94b960f Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannafemale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannafemale2.ogg b/mods/nativevillages/sounds/nativevillages_savannafemale2.ogg new file mode 100644 index 0000000..5fd21e0 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannafemale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannafemale3.ogg b/mods/nativevillages/sounds/nativevillages_savannafemale3.ogg new file mode 100644 index 0000000..81ee730 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannafemale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannafemale4.ogg b/mods/nativevillages/sounds/nativevillages_savannafemale4.ogg new file mode 100644 index 0000000..d7d635c Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannafemale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannamale.ogg b/mods/nativevillages/sounds/nativevillages_savannamale.ogg new file mode 100644 index 0000000..af45c38 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannamale.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannamale2.ogg b/mods/nativevillages/sounds/nativevillages_savannamale2.ogg new file mode 100644 index 0000000..9831ef5 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannamale2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannamale3.ogg b/mods/nativevillages/sounds/nativevillages_savannamale3.ogg new file mode 100644 index 0000000..d83af72 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannamale3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_savannamale4.ogg b/mods/nativevillages/sounds/nativevillages_savannamale4.ogg new file mode 100644 index 0000000..1c7f697 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_savannamale4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_tamedzombie.ogg b/mods/nativevillages/sounds/nativevillages_tamedzombie.ogg new file mode 100644 index 0000000..6ea30aa Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_tamedzombie.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_tamedzombie2.ogg b/mods/nativevillages/sounds/nativevillages_tamedzombie2.ogg new file mode 100644 index 0000000..2f8b4c9 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_tamedzombie2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_tamedzombie3.ogg b/mods/nativevillages/sounds/nativevillages_tamedzombie3.ogg new file mode 100644 index 0000000..3ffecc3 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_tamedzombie3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_tamedzombie4.ogg b/mods/nativevillages/sounds/nativevillages_tamedzombie4.ogg new file mode 100644 index 0000000..0aa7b7c Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_tamedzombie4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_toad.ogg b/mods/nativevillages/sounds/nativevillages_toad.ogg new file mode 100644 index 0000000..6dd9a66 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_toad.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_toad2.ogg b/mods/nativevillages/sounds/nativevillages_toad2.ogg new file mode 100644 index 0000000..bf335a9 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_toad2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_witch.ogg b/mods/nativevillages/sounds/nativevillages_witch.ogg new file mode 100644 index 0000000..9909909 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_witch.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_witch2.ogg b/mods/nativevillages/sounds/nativevillages_witch2.ogg new file mode 100644 index 0000000..1cfd720 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_witch2.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_witch3.ogg b/mods/nativevillages/sounds/nativevillages_witch3.ogg new file mode 100644 index 0000000..f40ccc5 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_witch3.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_witch4.ogg b/mods/nativevillages/sounds/nativevillages_witch4.ogg new file mode 100644 index 0000000..b1bc0d4 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_witch4.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_witchdoctor.ogg b/mods/nativevillages/sounds/nativevillages_witchdoctor.ogg new file mode 100644 index 0000000..b144705 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_witchdoctor.ogg differ diff --git a/mods/nativevillages/sounds/nativevillages_witchdoctor2.ogg b/mods/nativevillages/sounds/nativevillages_witchdoctor2.ogg new file mode 100644 index 0000000..cbd5ba4 Binary files /dev/null and b/mods/nativevillages/sounds/nativevillages_witchdoctor2.ogg differ diff --git a/mods/nativevillages/textures/ablanket.png b/mods/nativevillages/textures/ablanket.png new file mode 100644 index 0000000..9e08006 Binary files /dev/null and b/mods/nativevillages/textures/ablanket.png differ diff --git a/mods/nativevillages/textures/acannibalarcher.png b/mods/nativevillages/textures/acannibalarcher.png new file mode 100644 index 0000000..3ad51e7 Binary files /dev/null and b/mods/nativevillages/textures/acannibalarcher.png differ diff --git a/mods/nativevillages/textures/acannibalchild.png b/mods/nativevillages/textures/acannibalchild.png new file mode 100644 index 0000000..2975c24 Binary files /dev/null and b/mods/nativevillages/textures/acannibalchild.png differ diff --git a/mods/nativevillages/textures/acannibalking.png b/mods/nativevillages/textures/acannibalking.png new file mode 100644 index 0000000..29d2e03 Binary files /dev/null and b/mods/nativevillages/textures/acannibalking.png differ diff --git a/mods/nativevillages/textures/acannibalmurderer.png b/mods/nativevillages/textures/acannibalmurderer.png new file mode 100644 index 0000000..98bb76d Binary files /dev/null and b/mods/nativevillages/textures/acannibalmurderer.png differ diff --git a/mods/nativevillages/textures/acannibalshrine.png b/mods/nativevillages/textures/acannibalshrine.png new file mode 100644 index 0000000..a17a4f8 Binary files /dev/null and b/mods/nativevillages/textures/acannibalshrine.png differ diff --git a/mods/nativevillages/textures/acowdropping.png b/mods/nativevillages/textures/acowdropping.png new file mode 100644 index 0000000..f26f415 Binary files /dev/null and b/mods/nativevillages/textures/acowdropping.png differ diff --git a/mods/nativevillages/textures/adesertcage.png b/mods/nativevillages/textures/adesertcage.png new file mode 100644 index 0000000..58746b3 Binary files /dev/null and b/mods/nativevillages/textures/adesertcage.png differ diff --git a/mods/nativevillages/textures/adesertcarpet.png b/mods/nativevillages/textures/adesertcarpet.png new file mode 100644 index 0000000..5f27997 Binary files /dev/null and b/mods/nativevillages/textures/adesertcarpet.png differ diff --git a/mods/nativevillages/textures/adesertchicken.png b/mods/nativevillages/textures/adesertchicken.png new file mode 100644 index 0000000..e116edc Binary files /dev/null and b/mods/nativevillages/textures/adesertchicken.png differ diff --git a/mods/nativevillages/textures/adesertraider.png b/mods/nativevillages/textures/adesertraider.png new file mode 100644 index 0000000..4fe643d Binary files /dev/null and b/mods/nativevillages/textures/adesertraider.png differ diff --git a/mods/nativevillages/textures/adesertranger.png b/mods/nativevillages/textures/adesertranger.png new file mode 100644 index 0000000..0c6c949 Binary files /dev/null and b/mods/nativevillages/textures/adesertranger.png differ diff --git a/mods/nativevillages/textures/adesertseeds.png b/mods/nativevillages/textures/adesertseeds.png new file mode 100644 index 0000000..044e9c6 Binary files /dev/null and b/mods/nativevillages/textures/adesertseeds.png differ diff --git a/mods/nativevillages/textures/adesertslavetrader.png b/mods/nativevillages/textures/adesertslavetrader.png new file mode 100644 index 0000000..16b6030 Binary files /dev/null and b/mods/nativevillages/textures/adesertslavetrader.png differ diff --git a/mods/nativevillages/textures/adesertvillagerfemale.png b/mods/nativevillages/textures/adesertvillagerfemale.png new file mode 100644 index 0000000..4823db2 Binary files /dev/null and b/mods/nativevillages/textures/adesertvillagerfemale.png differ diff --git a/mods/nativevillages/textures/adesertvillagermale.png b/mods/nativevillages/textures/adesertvillagermale.png new file mode 100644 index 0000000..55932b7 Binary files /dev/null and b/mods/nativevillages/textures/adesertvillagermale.png differ diff --git a/mods/nativevillages/textures/afemalelion.png b/mods/nativevillages/textures/afemalelion.png new file mode 100644 index 0000000..ed384ac Binary files /dev/null and b/mods/nativevillages/textures/afemalelion.png differ diff --git a/mods/nativevillages/textures/afishtrap.png b/mods/nativevillages/textures/afishtrap.png new file mode 100644 index 0000000..b67c6ca Binary files /dev/null and b/mods/nativevillages/textures/afishtrap.png differ diff --git a/mods/nativevillages/textures/agrasslandaltar.png b/mods/nativevillages/textures/agrasslandaltar.png new file mode 100644 index 0000000..4ef08d8 Binary files /dev/null and b/mods/nativevillages/textures/agrasslandaltar.png differ diff --git a/mods/nativevillages/textures/agrasslandbarrel.png b/mods/nativevillages/textures/agrasslandbarrel.png new file mode 100644 index 0000000..b4c0852 Binary files /dev/null and b/mods/nativevillages/textures/agrasslandbarrel.png differ diff --git a/mods/nativevillages/textures/agrasslandcat.png b/mods/nativevillages/textures/agrasslandcat.png new file mode 100644 index 0000000..9f69936 Binary files /dev/null and b/mods/nativevillages/textures/agrasslandcat.png differ diff --git a/mods/nativevillages/textures/agrasslandcow.png b/mods/nativevillages/textures/agrasslandcow.png new file mode 100644 index 0000000..4dc766f Binary files /dev/null and b/mods/nativevillages/textures/agrasslandcow.png differ diff --git a/mods/nativevillages/textures/agrasslandfemale.png b/mods/nativevillages/textures/agrasslandfemale.png new file mode 100644 index 0000000..7ccd8ab Binary files /dev/null and b/mods/nativevillages/textures/agrasslandfemale.png differ diff --git a/mods/nativevillages/textures/agrasslandmale.png b/mods/nativevillages/textures/agrasslandmale.png new file mode 100644 index 0000000..eae0980 Binary files /dev/null and b/mods/nativevillages/textures/agrasslandmale.png differ diff --git a/mods/nativevillages/textures/agrasslandwitch.png b/mods/nativevillages/textures/agrasslandwitch.png new file mode 100644 index 0000000..dde665a Binary files /dev/null and b/mods/nativevillages/textures/agrasslandwitch.png differ diff --git a/mods/nativevillages/textures/ahangingfish.png b/mods/nativevillages/textures/ahangingfish.png new file mode 100644 index 0000000..de9a3f2 Binary files /dev/null and b/mods/nativevillages/textures/ahangingfish.png differ diff --git a/mods/nativevillages/textures/ahookah.png b/mods/nativevillages/textures/ahookah.png new file mode 100644 index 0000000..be38d31 Binary files /dev/null and b/mods/nativevillages/textures/ahookah.png differ diff --git a/mods/nativevillages/textures/aicedog.png b/mods/nativevillages/textures/aicedog.png new file mode 100644 index 0000000..38ac961 Binary files /dev/null and b/mods/nativevillages/textures/aicedog.png differ diff --git a/mods/nativevillages/textures/aicesledgetrader.png b/mods/nativevillages/textures/aicesledgetrader.png new file mode 100644 index 0000000..f82a60b Binary files /dev/null and b/mods/nativevillages/textures/aicesledgetrader.png differ diff --git a/mods/nativevillages/textures/aicevillagerfemale.png b/mods/nativevillages/textures/aicevillagerfemale.png new file mode 100644 index 0000000..5658932 Binary files /dev/null and b/mods/nativevillages/textures/aicevillagerfemale.png differ diff --git a/mods/nativevillages/textures/aicevillagermale.png b/mods/nativevillages/textures/aicevillagermale.png new file mode 100644 index 0000000..e899aa2 Binary files /dev/null and b/mods/nativevillages/textures/aicevillagermale.png differ diff --git a/mods/nativevillages/textures/alakecatfish.png b/mods/nativevillages/textures/alakecatfish.png new file mode 100644 index 0000000..44b6ffd Binary files /dev/null and b/mods/nativevillages/textures/alakecatfish.png differ diff --git a/mods/nativevillages/textures/alakevillagerfemale.png b/mods/nativevillages/textures/alakevillagerfemale.png new file mode 100644 index 0000000..3381d29 Binary files /dev/null and b/mods/nativevillages/textures/alakevillagerfemale.png differ diff --git a/mods/nativevillages/textures/alakevillagerfisher.png b/mods/nativevillages/textures/alakevillagerfisher.png new file mode 100644 index 0000000..78c1e0c Binary files /dev/null and b/mods/nativevillages/textures/alakevillagerfisher.png differ diff --git a/mods/nativevillages/textures/alakevillagermale.png b/mods/nativevillages/textures/alakevillagermale.png new file mode 100644 index 0000000..b418e42 Binary files /dev/null and b/mods/nativevillages/textures/alakevillagermale.png differ diff --git a/mods/nativevillages/textures/amalelion.png b/mods/nativevillages/textures/amalelion.png new file mode 100644 index 0000000..fc8ac17 Binary files /dev/null and b/mods/nativevillages/textures/amalelion.png differ diff --git a/mods/nativevillages/textures/asavannacorpse.png b/mods/nativevillages/textures/asavannacorpse.png new file mode 100644 index 0000000..33039ca Binary files /dev/null and b/mods/nativevillages/textures/asavannacorpse.png differ diff --git a/mods/nativevillages/textures/asavannadoctor.png b/mods/nativevillages/textures/asavannadoctor.png new file mode 100644 index 0000000..f70b85f Binary files /dev/null and b/mods/nativevillages/textures/asavannadoctor.png differ diff --git a/mods/nativevillages/textures/asavannafemale.png b/mods/nativevillages/textures/asavannafemale.png new file mode 100644 index 0000000..6ed6f6d Binary files /dev/null and b/mods/nativevillages/textures/asavannafemale.png differ diff --git a/mods/nativevillages/textures/asavannaking.png b/mods/nativevillages/textures/asavannaking.png new file mode 100644 index 0000000..7b5629c Binary files /dev/null and b/mods/nativevillages/textures/asavannaking.png differ diff --git a/mods/nativevillages/textures/asavannamale.png b/mods/nativevillages/textures/asavannamale.png new file mode 100644 index 0000000..8b4aba8 Binary files /dev/null and b/mods/nativevillages/textures/asavannamale.png differ diff --git a/mods/nativevillages/textures/asavannaqueen.png b/mods/nativevillages/textures/asavannaqueen.png new file mode 100644 index 0000000..4a43a36 Binary files /dev/null and b/mods/nativevillages/textures/asavannaqueen.png differ diff --git a/mods/nativevillages/textures/asavannashrine.png b/mods/nativevillages/textures/asavannashrine.png new file mode 100644 index 0000000..20e32ad Binary files /dev/null and b/mods/nativevillages/textures/asavannashrine.png differ diff --git a/mods/nativevillages/textures/asavannathrone.png b/mods/nativevillages/textures/asavannathrone.png new file mode 100644 index 0000000..aeb7d10 Binary files /dev/null and b/mods/nativevillages/textures/asavannathrone.png differ diff --git a/mods/nativevillages/textures/asavannavessels.png b/mods/nativevillages/textures/asavannavessels.png new file mode 100644 index 0000000..ca6de6a Binary files /dev/null and b/mods/nativevillages/textures/asavannavessels.png differ diff --git a/mods/nativevillages/textures/aslavechickenbreeder.png b/mods/nativevillages/textures/aslavechickenbreeder.png new file mode 100644 index 0000000..af42cf7 Binary files /dev/null and b/mods/nativevillages/textures/aslavechickenbreeder.png differ diff --git a/mods/nativevillages/textures/aslavecowherder.png b/mods/nativevillages/textures/aslavecowherder.png new file mode 100644 index 0000000..01c6d14 Binary files /dev/null and b/mods/nativevillages/textures/aslavecowherder.png differ diff --git a/mods/nativevillages/textures/aslavefemaledancer.png b/mods/nativevillages/textures/aslavefemaledancer.png new file mode 100644 index 0000000..adf7838 Binary files /dev/null and b/mods/nativevillages/textures/aslavefemaledancer.png differ diff --git a/mods/nativevillages/textures/aslaveliontrainer.png b/mods/nativevillages/textures/aslaveliontrainer.png new file mode 100644 index 0000000..f7a8952 Binary files /dev/null and b/mods/nativevillages/textures/aslaveliontrainer.png differ diff --git a/mods/nativevillages/textures/aslaveloyalcannibal.png b/mods/nativevillages/textures/aslaveloyalcannibal.png new file mode 100644 index 0000000..1e06323 Binary files /dev/null and b/mods/nativevillages/textures/aslaveloyalcannibal.png differ diff --git a/mods/nativevillages/textures/aslavemaledancer.png b/mods/nativevillages/textures/aslavemaledancer.png new file mode 100644 index 0000000..592320f Binary files /dev/null and b/mods/nativevillages/textures/aslavemaledancer.png differ diff --git a/mods/nativevillages/textures/asledge.png b/mods/nativevillages/textures/asledge.png new file mode 100644 index 0000000..da080ce Binary files /dev/null and b/mods/nativevillages/textures/asledge.png differ diff --git a/mods/nativevillages/textures/asledwithdog.png b/mods/nativevillages/textures/asledwithdog.png new file mode 100644 index 0000000..d3fde12 Binary files /dev/null and b/mods/nativevillages/textures/asledwithdog.png differ diff --git a/mods/nativevillages/textures/atoad.png b/mods/nativevillages/textures/atoad.png new file mode 100644 index 0000000..f3a9444 Binary files /dev/null and b/mods/nativevillages/textures/atoad.png differ diff --git a/mods/nativevillages/textures/azombietame.png b/mods/nativevillages/textures/azombietame.png new file mode 100644 index 0000000..0e96f3a Binary files /dev/null and b/mods/nativevillages/textures/azombietame.png differ diff --git a/mods/nativevillages/textures/mobs_glass_milk.png b/mods/nativevillages/textures/mobs_glass_milk.png new file mode 100644 index 0000000..59f1ba1 Binary files /dev/null and b/mods/nativevillages/textures/mobs_glass_milk.png differ diff --git a/mods/nativevillages/textures/nativevillages_bucket_milk.png b/mods/nativevillages/textures/nativevillages_bucket_milk.png new file mode 100644 index 0000000..12e5b93 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_bucket_milk.png differ diff --git a/mods/nativevillages/textures/nativevillages_butter.png b/mods/nativevillages/textures/nativevillages_butter.png new file mode 100644 index 0000000..f30e22c Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_butter.png differ diff --git a/mods/nativevillages/textures/nativevillages_catfish_cooked.png b/mods/nativevillages/textures/nativevillages_catfish_cooked.png new file mode 100644 index 0000000..8414824 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_catfish_cooked.png differ diff --git a/mods/nativevillages/textures/nativevillages_catfish_raw.png b/mods/nativevillages/textures/nativevillages_catfish_raw.png new file mode 100644 index 0000000..e550e90 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_catfish_raw.png differ diff --git a/mods/nativevillages/textures/nativevillages_cheese.png b/mods/nativevillages/textures/nativevillages_cheese.png new file mode 100644 index 0000000..b58e11e Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_cheese.png differ diff --git a/mods/nativevillages/textures/nativevillages_cheeseblock.png b/mods/nativevillages/textures/nativevillages_cheeseblock.png new file mode 100644 index 0000000..a14d185 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_cheeseblock.png differ diff --git a/mods/nativevillages/textures/nativevillages_chicken_cooked.png b/mods/nativevillages/textures/nativevillages_chicken_cooked.png new file mode 100644 index 0000000..48f9adc Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_chicken_cooked.png differ diff --git a/mods/nativevillages/textures/nativevillages_chicken_egg_fried.png b/mods/nativevillages/textures/nativevillages_chicken_egg_fried.png new file mode 100644 index 0000000..147d4c1 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_chicken_egg_fried.png differ diff --git a/mods/nativevillages/textures/nativevillages_chicken_raw.png b/mods/nativevillages/textures/nativevillages_chicken_raw.png new file mode 100644 index 0000000..12b1f23 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_chicken_raw.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedhumanmeat.png b/mods/nativevillages/textures/nativevillages_driedhumanmeat.png new file mode 100644 index 0000000..7160bb8 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedhumanmeat.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedpeople_back.png b/mods/nativevillages/textures/nativevillages_driedpeople_back.png new file mode 100644 index 0000000..03ece69 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedpeople_back.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedpeople_bottom.png b/mods/nativevillages/textures/nativevillages_driedpeople_bottom.png new file mode 100644 index 0000000..ec26260 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedpeople_bottom.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedpeople_front.png b/mods/nativevillages/textures/nativevillages_driedpeople_front.png new file mode 100644 index 0000000..abd798d Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedpeople_front.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedpeople_left.png b/mods/nativevillages/textures/nativevillages_driedpeople_left.png new file mode 100644 index 0000000..1984d8a Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedpeople_left.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedpeople_right.png b/mods/nativevillages/textures/nativevillages_driedpeople_right.png new file mode 100644 index 0000000..6c131f2 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedpeople_right.png differ diff --git a/mods/nativevillages/textures/nativevillages_driedpeople_top.png b/mods/nativevillages/textures/nativevillages_driedpeople_top.png new file mode 100644 index 0000000..df1808f Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_driedpeople_top.png differ diff --git a/mods/nativevillages/textures/nativevillages_fireball.png b/mods/nativevillages/textures/nativevillages_fireball.png new file mode 100644 index 0000000..0e86a14 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_fireball.png differ diff --git a/mods/nativevillages/textures/nativevillages_pearl.png b/mods/nativevillages/textures/nativevillages_pearl.png new file mode 100644 index 0000000..11f3541 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_pearl.png differ diff --git a/mods/nativevillages/textures/nativevillages_toadbag_back.png b/mods/nativevillages/textures/nativevillages_toadbag_back.png new file mode 100644 index 0000000..a6e858c Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_toadbag_back.png differ diff --git a/mods/nativevillages/textures/nativevillages_toadbag_bottom.png b/mods/nativevillages/textures/nativevillages_toadbag_bottom.png new file mode 100644 index 0000000..e2ef675 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_toadbag_bottom.png differ diff --git a/mods/nativevillages/textures/nativevillages_toadbag_front.png b/mods/nativevillages/textures/nativevillages_toadbag_front.png new file mode 100644 index 0000000..f01786c Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_toadbag_front.png differ diff --git a/mods/nativevillages/textures/nativevillages_toadbag_left.png b/mods/nativevillages/textures/nativevillages_toadbag_left.png new file mode 100644 index 0000000..d1f9247 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_toadbag_left.png differ diff --git a/mods/nativevillages/textures/nativevillages_toadbag_right.png b/mods/nativevillages/textures/nativevillages_toadbag_right.png new file mode 100644 index 0000000..8cca1ab Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_toadbag_right.png differ diff --git a/mods/nativevillages/textures/nativevillages_toadbag_top.png b/mods/nativevillages/textures/nativevillages_toadbag_top.png new file mode 100644 index 0000000..4b155b1 Binary files /dev/null and b/mods/nativevillages/textures/nativevillages_toadbag_top.png differ diff --git a/mods/nativevillages/textures/textureblanket.png b/mods/nativevillages/textures/textureblanket.png new file mode 100644 index 0000000..d2e104c Binary files /dev/null and b/mods/nativevillages/textures/textureblanket.png differ diff --git a/mods/nativevillages/textures/texturecannibalarcher.png b/mods/nativevillages/textures/texturecannibalarcher.png new file mode 100644 index 0000000..c797ebe Binary files /dev/null and b/mods/nativevillages/textures/texturecannibalarcher.png differ diff --git a/mods/nativevillages/textures/texturecannibalchild.png b/mods/nativevillages/textures/texturecannibalchild.png new file mode 100644 index 0000000..e4563e7 Binary files /dev/null and b/mods/nativevillages/textures/texturecannibalchild.png differ diff --git a/mods/nativevillages/textures/texturecannibalking.png b/mods/nativevillages/textures/texturecannibalking.png new file mode 100644 index 0000000..f8add91 Binary files /dev/null and b/mods/nativevillages/textures/texturecannibalking.png differ diff --git a/mods/nativevillages/textures/texturecannibalmurderer.png b/mods/nativevillages/textures/texturecannibalmurderer.png new file mode 100644 index 0000000..7dcbf07 Binary files /dev/null and b/mods/nativevillages/textures/texturecannibalmurderer.png differ diff --git a/mods/nativevillages/textures/texturecannibalshrine.png b/mods/nativevillages/textures/texturecannibalshrine.png new file mode 100644 index 0000000..e8667d5 Binary files /dev/null and b/mods/nativevillages/textures/texturecannibalshrine.png differ diff --git a/mods/nativevillages/textures/texturecatfish1.png b/mods/nativevillages/textures/texturecatfish1.png new file mode 100644 index 0000000..63d2694 Binary files /dev/null and b/mods/nativevillages/textures/texturecatfish1.png differ diff --git a/mods/nativevillages/textures/texturecatfish2.png b/mods/nativevillages/textures/texturecatfish2.png new file mode 100644 index 0000000..1852b95 Binary files /dev/null and b/mods/nativevillages/textures/texturecatfish2.png differ diff --git a/mods/nativevillages/textures/texturecatfish3.png b/mods/nativevillages/textures/texturecatfish3.png new file mode 100644 index 0000000..9124229 Binary files /dev/null and b/mods/nativevillages/textures/texturecatfish3.png differ diff --git a/mods/nativevillages/textures/texturecatfish4.png b/mods/nativevillages/textures/texturecatfish4.png new file mode 100644 index 0000000..59d0357 Binary files /dev/null and b/mods/nativevillages/textures/texturecatfish4.png differ diff --git a/mods/nativevillages/textures/texturecatfish5.png b/mods/nativevillages/textures/texturecatfish5.png new file mode 100644 index 0000000..d08d618 Binary files /dev/null and b/mods/nativevillages/textures/texturecatfish5.png differ diff --git a/mods/nativevillages/textures/texturecatfish6.png b/mods/nativevillages/textures/texturecatfish6.png new file mode 100644 index 0000000..5f300ed Binary files /dev/null and b/mods/nativevillages/textures/texturecatfish6.png differ diff --git a/mods/nativevillages/textures/texturecowdropping.png b/mods/nativevillages/textures/texturecowdropping.png new file mode 100644 index 0000000..1440a32 Binary files /dev/null and b/mods/nativevillages/textures/texturecowdropping.png differ diff --git a/mods/nativevillages/textures/texturedesertcage.png b/mods/nativevillages/textures/texturedesertcage.png new file mode 100644 index 0000000..35083dd Binary files /dev/null and b/mods/nativevillages/textures/texturedesertcage.png differ diff --git a/mods/nativevillages/textures/texturedesertcarpet.png b/mods/nativevillages/textures/texturedesertcarpet.png new file mode 100644 index 0000000..aad8a5d Binary files /dev/null and b/mods/nativevillages/textures/texturedesertcarpet.png differ diff --git a/mods/nativevillages/textures/texturedesertchicken.png b/mods/nativevillages/textures/texturedesertchicken.png new file mode 100644 index 0000000..5d2b4c5 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertchicken.png differ diff --git a/mods/nativevillages/textures/texturedesertchicken2.png b/mods/nativevillages/textures/texturedesertchicken2.png new file mode 100644 index 0000000..d7f2490 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertchicken2.png differ diff --git a/mods/nativevillages/textures/texturedesertchicken3.png b/mods/nativevillages/textures/texturedesertchicken3.png new file mode 100644 index 0000000..25027ed Binary files /dev/null and b/mods/nativevillages/textures/texturedesertchicken3.png differ diff --git a/mods/nativevillages/textures/texturedesertchicken4.png b/mods/nativevillages/textures/texturedesertchicken4.png new file mode 100644 index 0000000..b655033 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertchicken4.png differ diff --git a/mods/nativevillages/textures/texturedesertchickenbaby.png b/mods/nativevillages/textures/texturedesertchickenbaby.png new file mode 100644 index 0000000..80503d1 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertchickenbaby.png differ diff --git a/mods/nativevillages/textures/texturedesertraider.png b/mods/nativevillages/textures/texturedesertraider.png new file mode 100644 index 0000000..057dc4f Binary files /dev/null and b/mods/nativevillages/textures/texturedesertraider.png differ diff --git a/mods/nativevillages/textures/texturedesertranger.png b/mods/nativevillages/textures/texturedesertranger.png new file mode 100644 index 0000000..8c6b31a Binary files /dev/null and b/mods/nativevillages/textures/texturedesertranger.png differ diff --git a/mods/nativevillages/textures/texturedesertseeds.png b/mods/nativevillages/textures/texturedesertseeds.png new file mode 100644 index 0000000..628b457 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertseeds.png differ diff --git a/mods/nativevillages/textures/texturedesertslavetrader.png b/mods/nativevillages/textures/texturedesertslavetrader.png new file mode 100644 index 0000000..0c91124 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertslavetrader.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagerfemale.png b/mods/nativevillages/textures/texturedesertvillagerfemale.png new file mode 100644 index 0000000..137460b Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagerfemale.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagerfemale2.png b/mods/nativevillages/textures/texturedesertvillagerfemale2.png new file mode 100644 index 0000000..1bf2a19 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagerfemale2.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagerfemale3.png b/mods/nativevillages/textures/texturedesertvillagerfemale3.png new file mode 100644 index 0000000..832cfa8 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagerfemale3.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagerfemale4.png b/mods/nativevillages/textures/texturedesertvillagerfemale4.png new file mode 100644 index 0000000..5b98b47 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagerfemale4.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagerfemale5.png b/mods/nativevillages/textures/texturedesertvillagerfemale5.png new file mode 100644 index 0000000..6e241d3 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagerfemale5.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagerfemale6.png b/mods/nativevillages/textures/texturedesertvillagerfemale6.png new file mode 100644 index 0000000..4a9d446 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagerfemale6.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagermale.png b/mods/nativevillages/textures/texturedesertvillagermale.png new file mode 100644 index 0000000..48440f4 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagermale.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagermale2.png b/mods/nativevillages/textures/texturedesertvillagermale2.png new file mode 100644 index 0000000..c0d2953 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagermale2.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagermale3.png b/mods/nativevillages/textures/texturedesertvillagermale3.png new file mode 100644 index 0000000..6432672 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagermale3.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagermale4.png b/mods/nativevillages/textures/texturedesertvillagermale4.png new file mode 100644 index 0000000..2854804 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagermale4.png differ diff --git a/mods/nativevillages/textures/texturedesertvillagermale5.png b/mods/nativevillages/textures/texturedesertvillagermale5.png new file mode 100644 index 0000000..82b2f90 Binary files /dev/null and b/mods/nativevillages/textures/texturedesertvillagermale5.png differ diff --git a/mods/nativevillages/textures/texturefishtrap.png b/mods/nativevillages/textures/texturefishtrap.png new file mode 100644 index 0000000..001d213 Binary files /dev/null and b/mods/nativevillages/textures/texturefishtrap.png differ diff --git a/mods/nativevillages/textures/texturegrasslandaltar.png b/mods/nativevillages/textures/texturegrasslandaltar.png new file mode 100644 index 0000000..cea5985 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandaltar.png differ diff --git a/mods/nativevillages/textures/texturegrasslandbabyf.png b/mods/nativevillages/textures/texturegrasslandbabyf.png new file mode 100644 index 0000000..4c557de Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandbabyf.png differ diff --git a/mods/nativevillages/textures/texturegrasslandbabym.png b/mods/nativevillages/textures/texturegrasslandbabym.png new file mode 100644 index 0000000..1029dfd Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandbabym.png differ diff --git a/mods/nativevillages/textures/texturegrasslandbarrel.png b/mods/nativevillages/textures/texturegrasslandbarrel.png new file mode 100644 index 0000000..1e1a899 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandbarrel.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcat.png b/mods/nativevillages/textures/texturegrasslandcat.png new file mode 100644 index 0000000..d51d9a2 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcat.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcat2.png b/mods/nativevillages/textures/texturegrasslandcat2.png new file mode 100644 index 0000000..0d0e301 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcat2.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcat3.png b/mods/nativevillages/textures/texturegrasslandcat3.png new file mode 100644 index 0000000..33d5643 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcat3.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcat4.png b/mods/nativevillages/textures/texturegrasslandcat4.png new file mode 100644 index 0000000..1e5d59f Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcat4.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcat5.png b/mods/nativevillages/textures/texturegrasslandcat5.png new file mode 100644 index 0000000..eaa84cb Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcat5.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow.png b/mods/nativevillages/textures/texturegrasslandcow.png new file mode 100644 index 0000000..f2d10b3 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow2.png b/mods/nativevillages/textures/texturegrasslandcow2.png new file mode 100644 index 0000000..cd8890d Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow2.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow3.png b/mods/nativevillages/textures/texturegrasslandcow3.png new file mode 100644 index 0000000..cceafc4 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow3.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow4.png b/mods/nativevillages/textures/texturegrasslandcow4.png new file mode 100644 index 0000000..0bd914f Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow4.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow5.png b/mods/nativevillages/textures/texturegrasslandcow5.png new file mode 100644 index 0000000..44a91c9 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow5.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow6.png b/mods/nativevillages/textures/texturegrasslandcow6.png new file mode 100644 index 0000000..59b367a Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow6.png differ diff --git a/mods/nativevillages/textures/texturegrasslandcow7.png b/mods/nativevillages/textures/texturegrasslandcow7.png new file mode 100644 index 0000000..92a8f7a Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandcow7.png differ diff --git a/mods/nativevillages/textures/texturegrasslandfemale.png b/mods/nativevillages/textures/texturegrasslandfemale.png new file mode 100644 index 0000000..ef101b4 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandfemale.png differ diff --git a/mods/nativevillages/textures/texturegrasslandfemale2.png b/mods/nativevillages/textures/texturegrasslandfemale2.png new file mode 100644 index 0000000..b0cfdba Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandfemale2.png differ diff --git a/mods/nativevillages/textures/texturegrasslandfemale3.png b/mods/nativevillages/textures/texturegrasslandfemale3.png new file mode 100644 index 0000000..0f1b12a Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandfemale3.png differ diff --git a/mods/nativevillages/textures/texturegrasslandfemale4.png b/mods/nativevillages/textures/texturegrasslandfemale4.png new file mode 100644 index 0000000..b5d4e82 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandfemale4.png differ diff --git a/mods/nativevillages/textures/texturegrasslandmale.png b/mods/nativevillages/textures/texturegrasslandmale.png new file mode 100644 index 0000000..49556b9 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandmale.png differ diff --git a/mods/nativevillages/textures/texturegrasslandmale2.png b/mods/nativevillages/textures/texturegrasslandmale2.png new file mode 100644 index 0000000..74d34a7 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandmale2.png differ diff --git a/mods/nativevillages/textures/texturegrasslandmale3.png b/mods/nativevillages/textures/texturegrasslandmale3.png new file mode 100644 index 0000000..981f6ec Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandmale3.png differ diff --git a/mods/nativevillages/textures/texturegrasslandmale4.png b/mods/nativevillages/textures/texturegrasslandmale4.png new file mode 100644 index 0000000..f86098b Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandmale4.png differ diff --git a/mods/nativevillages/textures/texturegrasslandwitch.png b/mods/nativevillages/textures/texturegrasslandwitch.png new file mode 100644 index 0000000..7fd5e26 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandwitch.png differ diff --git a/mods/nativevillages/textures/texturegrasslandwitch2.png b/mods/nativevillages/textures/texturegrasslandwitch2.png new file mode 100644 index 0000000..17280d6 Binary files /dev/null and b/mods/nativevillages/textures/texturegrasslandwitch2.png differ diff --git a/mods/nativevillages/textures/texturehangingfish.png b/mods/nativevillages/textures/texturehangingfish.png new file mode 100644 index 0000000..396cad3 Binary files /dev/null and b/mods/nativevillages/textures/texturehangingfish.png differ diff --git a/mods/nativevillages/textures/texturehookah.png b/mods/nativevillages/textures/texturehookah.png new file mode 100644 index 0000000..e366a36 Binary files /dev/null and b/mods/nativevillages/textures/texturehookah.png differ diff --git a/mods/nativevillages/textures/textureicedog.png b/mods/nativevillages/textures/textureicedog.png new file mode 100644 index 0000000..c47aadc Binary files /dev/null and b/mods/nativevillages/textures/textureicedog.png differ diff --git a/mods/nativevillages/textures/textureicedog2.png b/mods/nativevillages/textures/textureicedog2.png new file mode 100644 index 0000000..0ef1f43 Binary files /dev/null and b/mods/nativevillages/textures/textureicedog2.png differ diff --git a/mods/nativevillages/textures/textureicedog3.png b/mods/nativevillages/textures/textureicedog3.png new file mode 100644 index 0000000..6f857d0 Binary files /dev/null and b/mods/nativevillages/textures/textureicedog3.png differ diff --git a/mods/nativevillages/textures/textureicesledgetrader.png b/mods/nativevillages/textures/textureicesledgetrader.png new file mode 100644 index 0000000..b11544b Binary files /dev/null and b/mods/nativevillages/textures/textureicesledgetrader.png differ diff --git a/mods/nativevillages/textures/textureicevillagerfemale.png b/mods/nativevillages/textures/textureicevillagerfemale.png new file mode 100644 index 0000000..bf0e0c2 Binary files /dev/null and b/mods/nativevillages/textures/textureicevillagerfemale.png differ diff --git a/mods/nativevillages/textures/textureicevillagerfemalebaby.png b/mods/nativevillages/textures/textureicevillagerfemalebaby.png new file mode 100644 index 0000000..4ef2305 Binary files /dev/null and b/mods/nativevillages/textures/textureicevillagerfemalebaby.png differ diff --git a/mods/nativevillages/textures/textureicevillagermale.png b/mods/nativevillages/textures/textureicevillagermale.png new file mode 100644 index 0000000..d9e32b9 Binary files /dev/null and b/mods/nativevillages/textures/textureicevillagermale.png differ diff --git a/mods/nativevillages/textures/textureicevillagermalebaby.png b/mods/nativevillages/textures/textureicevillagermalebaby.png new file mode 100644 index 0000000..6215d7c Binary files /dev/null and b/mods/nativevillages/textures/textureicevillagermalebaby.png differ diff --git a/mods/nativevillages/textures/texturelakecatfish.png b/mods/nativevillages/textures/texturelakecatfish.png new file mode 100644 index 0000000..1e46684 Binary files /dev/null and b/mods/nativevillages/textures/texturelakecatfish.png differ diff --git a/mods/nativevillages/textures/texturelakevillagerfemale.png b/mods/nativevillages/textures/texturelakevillagerfemale.png new file mode 100644 index 0000000..295add9 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagerfemale.png differ diff --git a/mods/nativevillages/textures/texturelakevillagerfemale2.png b/mods/nativevillages/textures/texturelakevillagerfemale2.png new file mode 100644 index 0000000..a9df9e0 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagerfemale2.png differ diff --git a/mods/nativevillages/textures/texturelakevillagerfemale3.png b/mods/nativevillages/textures/texturelakevillagerfemale3.png new file mode 100644 index 0000000..428a675 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagerfemale3.png differ diff --git a/mods/nativevillages/textures/texturelakevillagerfisher.png b/mods/nativevillages/textures/texturelakevillagerfisher.png new file mode 100644 index 0000000..edc8e30 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagerfisher.png differ diff --git a/mods/nativevillages/textures/texturelakevillagermale.png b/mods/nativevillages/textures/texturelakevillagermale.png new file mode 100644 index 0000000..202a428 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagermale.png differ diff --git a/mods/nativevillages/textures/texturelakevillagermale2.png b/mods/nativevillages/textures/texturelakevillagermale2.png new file mode 100644 index 0000000..f0290c5 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagermale2.png differ diff --git a/mods/nativevillages/textures/texturelakevillagermale3.png b/mods/nativevillages/textures/texturelakevillagermale3.png new file mode 100644 index 0000000..9e43ba7 Binary files /dev/null and b/mods/nativevillages/textures/texturelakevillagermale3.png differ diff --git a/mods/nativevillages/textures/texturelionfemale.png b/mods/nativevillages/textures/texturelionfemale.png new file mode 100644 index 0000000..3004955 Binary files /dev/null and b/mods/nativevillages/textures/texturelionfemale.png differ diff --git a/mods/nativevillages/textures/texturelionmale.png b/mods/nativevillages/textures/texturelionmale.png new file mode 100644 index 0000000..9f45669 Binary files /dev/null and b/mods/nativevillages/textures/texturelionmale.png differ diff --git a/mods/nativevillages/textures/texturesavannacorpse.png b/mods/nativevillages/textures/texturesavannacorpse.png new file mode 100644 index 0000000..a0bde96 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannacorpse.png differ diff --git a/mods/nativevillages/textures/texturesavannadoctor.png b/mods/nativevillages/textures/texturesavannadoctor.png new file mode 100644 index 0000000..526f280 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannadoctor.png differ diff --git a/mods/nativevillages/textures/texturesavannafemale.png b/mods/nativevillages/textures/texturesavannafemale.png new file mode 100644 index 0000000..b4cb731 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannafemale.png differ diff --git a/mods/nativevillages/textures/texturesavannafemale2.png b/mods/nativevillages/textures/texturesavannafemale2.png new file mode 100644 index 0000000..dde7a15 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannafemale2.png differ diff --git a/mods/nativevillages/textures/texturesavannafemale3.png b/mods/nativevillages/textures/texturesavannafemale3.png new file mode 100644 index 0000000..ec4e5bf Binary files /dev/null and b/mods/nativevillages/textures/texturesavannafemale3.png differ diff --git a/mods/nativevillages/textures/texturesavannaking.png b/mods/nativevillages/textures/texturesavannaking.png new file mode 100644 index 0000000..e92b0e3 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannaking.png differ diff --git a/mods/nativevillages/textures/texturesavannamale.png b/mods/nativevillages/textures/texturesavannamale.png new file mode 100644 index 0000000..7cbc5f9 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannamale.png differ diff --git a/mods/nativevillages/textures/texturesavannamale2.png b/mods/nativevillages/textures/texturesavannamale2.png new file mode 100644 index 0000000..9da47e6 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannamale2.png differ diff --git a/mods/nativevillages/textures/texturesavannamale3.png b/mods/nativevillages/textures/texturesavannamale3.png new file mode 100644 index 0000000..77c7553 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannamale3.png differ diff --git a/mods/nativevillages/textures/texturesavannamale4.png b/mods/nativevillages/textures/texturesavannamale4.png new file mode 100644 index 0000000..4794df5 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannamale4.png differ diff --git a/mods/nativevillages/textures/texturesavannaqueen.png b/mods/nativevillages/textures/texturesavannaqueen.png new file mode 100644 index 0000000..368fc77 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannaqueen.png differ diff --git a/mods/nativevillages/textures/texturesavannashrine.png b/mods/nativevillages/textures/texturesavannashrine.png new file mode 100644 index 0000000..91296ce Binary files /dev/null and b/mods/nativevillages/textures/texturesavannashrine.png differ diff --git a/mods/nativevillages/textures/texturesavannathrone.png b/mods/nativevillages/textures/texturesavannathrone.png new file mode 100644 index 0000000..f37172e Binary files /dev/null and b/mods/nativevillages/textures/texturesavannathrone.png differ diff --git a/mods/nativevillages/textures/texturesavannavessels.png b/mods/nativevillages/textures/texturesavannavessels.png new file mode 100644 index 0000000..42b6b59 Binary files /dev/null and b/mods/nativevillages/textures/texturesavannavessels.png differ diff --git a/mods/nativevillages/textures/textureslavechickenbreeder.png b/mods/nativevillages/textures/textureslavechickenbreeder.png new file mode 100644 index 0000000..c0d93c1 Binary files /dev/null and b/mods/nativevillages/textures/textureslavechickenbreeder.png differ diff --git a/mods/nativevillages/textures/textureslavechickenbreeder2.png b/mods/nativevillages/textures/textureslavechickenbreeder2.png new file mode 100644 index 0000000..9d5208d Binary files /dev/null and b/mods/nativevillages/textures/textureslavechickenbreeder2.png differ diff --git a/mods/nativevillages/textures/textureslavechickenbreeder3.png b/mods/nativevillages/textures/textureslavechickenbreeder3.png new file mode 100644 index 0000000..74b79a0 Binary files /dev/null and b/mods/nativevillages/textures/textureslavechickenbreeder3.png differ diff --git a/mods/nativevillages/textures/textureslavecowherder.png b/mods/nativevillages/textures/textureslavecowherder.png new file mode 100644 index 0000000..658f9fd Binary files /dev/null and b/mods/nativevillages/textures/textureslavecowherder.png differ diff --git a/mods/nativevillages/textures/textureslavecowherder2.png b/mods/nativevillages/textures/textureslavecowherder2.png new file mode 100644 index 0000000..caaa075 Binary files /dev/null and b/mods/nativevillages/textures/textureslavecowherder2.png differ diff --git a/mods/nativevillages/textures/textureslavefemaledancer.png b/mods/nativevillages/textures/textureslavefemaledancer.png new file mode 100644 index 0000000..1fda38d Binary files /dev/null and b/mods/nativevillages/textures/textureslavefemaledancer.png differ diff --git a/mods/nativevillages/textures/textureslavefemaledancer2.png b/mods/nativevillages/textures/textureslavefemaledancer2.png new file mode 100644 index 0000000..903a229 Binary files /dev/null and b/mods/nativevillages/textures/textureslavefemaledancer2.png differ diff --git a/mods/nativevillages/textures/textureslavefemaledancer3.png b/mods/nativevillages/textures/textureslavefemaledancer3.png new file mode 100644 index 0000000..e5c7df6 Binary files /dev/null and b/mods/nativevillages/textures/textureslavefemaledancer3.png differ diff --git a/mods/nativevillages/textures/textureslavefemaledancer4.png b/mods/nativevillages/textures/textureslavefemaledancer4.png new file mode 100644 index 0000000..8704aff Binary files /dev/null and b/mods/nativevillages/textures/textureslavefemaledancer4.png differ diff --git a/mods/nativevillages/textures/textureslavefemaledancer5.png b/mods/nativevillages/textures/textureslavefemaledancer5.png new file mode 100644 index 0000000..0f73564 Binary files /dev/null and b/mods/nativevillages/textures/textureslavefemaledancer5.png differ diff --git a/mods/nativevillages/textures/textureslaveliontrainer.png b/mods/nativevillages/textures/textureslaveliontrainer.png new file mode 100644 index 0000000..0885798 Binary files /dev/null and b/mods/nativevillages/textures/textureslaveliontrainer.png differ diff --git a/mods/nativevillages/textures/textureslaveliontrainer2.png b/mods/nativevillages/textures/textureslaveliontrainer2.png new file mode 100644 index 0000000..d9fc61e Binary files /dev/null and b/mods/nativevillages/textures/textureslaveliontrainer2.png differ diff --git a/mods/nativevillages/textures/textureslaveliontrainer3.png b/mods/nativevillages/textures/textureslaveliontrainer3.png new file mode 100644 index 0000000..be6e6db Binary files /dev/null and b/mods/nativevillages/textures/textureslaveliontrainer3.png differ diff --git a/mods/nativevillages/textures/textureslaveloyalcannibal.png b/mods/nativevillages/textures/textureslaveloyalcannibal.png new file mode 100644 index 0000000..480d266 Binary files /dev/null and b/mods/nativevillages/textures/textureslaveloyalcannibal.png differ diff --git a/mods/nativevillages/textures/textureslaveloyalcannibal2.png b/mods/nativevillages/textures/textureslaveloyalcannibal2.png new file mode 100644 index 0000000..6ed4268 Binary files /dev/null and b/mods/nativevillages/textures/textureslaveloyalcannibal2.png differ diff --git a/mods/nativevillages/textures/textureslaveloyalcannibal3.png b/mods/nativevillages/textures/textureslaveloyalcannibal3.png new file mode 100644 index 0000000..3ccd9ea Binary files /dev/null and b/mods/nativevillages/textures/textureslaveloyalcannibal3.png differ diff --git a/mods/nativevillages/textures/textureslavemaledancer.png b/mods/nativevillages/textures/textureslavemaledancer.png new file mode 100644 index 0000000..f8196f1 Binary files /dev/null and b/mods/nativevillages/textures/textureslavemaledancer.png differ diff --git a/mods/nativevillages/textures/textureslavemaledancer2.png b/mods/nativevillages/textures/textureslavemaledancer2.png new file mode 100644 index 0000000..149508c Binary files /dev/null and b/mods/nativevillages/textures/textureslavemaledancer2.png differ diff --git a/mods/nativevillages/textures/textureslavemaledancer3.png b/mods/nativevillages/textures/textureslavemaledancer3.png new file mode 100644 index 0000000..2f09aae Binary files /dev/null and b/mods/nativevillages/textures/textureslavemaledancer3.png differ diff --git a/mods/nativevillages/textures/textureslavemaledancer4.png b/mods/nativevillages/textures/textureslavemaledancer4.png new file mode 100644 index 0000000..08bd0e2 Binary files /dev/null and b/mods/nativevillages/textures/textureslavemaledancer4.png differ diff --git a/mods/nativevillages/textures/texturesledge.png b/mods/nativevillages/textures/texturesledge.png new file mode 100644 index 0000000..6a368a1 Binary files /dev/null and b/mods/nativevillages/textures/texturesledge.png differ diff --git a/mods/nativevillages/textures/texturesledgewithdog.png b/mods/nativevillages/textures/texturesledgewithdog.png new file mode 100644 index 0000000..741f3b0 Binary files /dev/null and b/mods/nativevillages/textures/texturesledgewithdog.png differ diff --git a/mods/nativevillages/textures/texturetoad.png b/mods/nativevillages/textures/texturetoad.png new file mode 100644 index 0000000..ec52f22 Binary files /dev/null and b/mods/nativevillages/textures/texturetoad.png differ diff --git a/mods/nativevillages/textures/texturezombietame.png b/mods/nativevillages/textures/texturezombietame.png new file mode 100644 index 0000000..02e965b Binary files /dev/null and b/mods/nativevillages/textures/texturezombietame.png differ diff --git a/mods/nativevillages/villages.lua b/mods/nativevillages/villages.lua new file mode 100644 index 0000000..e050a52 --- /dev/null +++ b/mods/nativevillages/villages.lua @@ -0,0 +1,85 @@ +local S = minetest.get_translator("nativevillages") + +minetest.register_decoration({ + name = "nativevillages:lakevillage", + deco_type = "schematic", + place_on = {"default:dirt", "default:sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00008, + biomes = {"deciduous_forest_ocean", "grassland_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"}, + y_max = -0.5, + y_min = -0.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/lakevillage3_0_180.mts", + flags = "force_placement", +}) + +minetest.register_decoration({ + name = "nativevillages:junglevillage", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = -4, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"rainforest", "rainforest_swamp"}, + y_max = 3.5, + y_min = 2.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/junglevillage_4_180.mts", + flags = "force_placement", +}) + +minetest.register_decoration({ + name = "nativevillages:grasslandvillage", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = -4, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"grassland", "grassland_dunes", "deciduous_forest_shore"}, + y_max = 3.5, + y_min = 2.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandvillage_4_270.mts", + flags = "force_placement", +}) + +minetest.register_decoration({ + name = "nativevillages:savannavillge", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = -4, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"savanna"}, + y_max = 3.5, + y_min = 2.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/savannavillage_4_180.mts", + flags = "force_placement", +}) + +minetest.register_decoration({ + name = "nativevillages:desertvillage", + deco_type = "schematic", + place_on = {"default:desert_sand", "default:sand"}, + place_offset_y = -4, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"desert"}, + y_max = 3.5, + y_min = 2.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/desertvillage_4_180.mts", + flags = "force_placement", +}) + +minetest.register_decoration({ + name = "nativevillages:icevillage", + deco_type = "schematic", + place_on = {"default:snowblock"}, + place_offset_y = -4, + sidelen = 16, + fill_ratio = 0.0001, + biomes = {"icesheet", "icesheet_ocean", "tundra", "tundra_ocean", "tundra_highland", }, + y_max = 3.5, + y_min = 2.5, + schematic = minetest.get_modpath("nativevillages").."/schematics/icevillage_4_90.mts", + flags = "force_placement", +}) \ No newline at end of file diff --git a/mods/naturalbiomes/LICENSE b/mods/naturalbiomes/LICENSE new file mode 100644 index 0000000..7bb56d2 --- /dev/null +++ b/mods/naturalbiomes/LICENSE @@ -0,0 +1,26 @@ +MIT License + +Copyright (c) 2022 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Textures and Models by Liil/Wilhelmine/ under (MIT) License (c) 2022 +Thanks to ShadMOrdre (https://github.com/ShadMOrdre) for fixing the schematics/leaf decay. + diff --git a/mods/naturalbiomes/alderswamp.lua b/mods/naturalbiomes/alderswamp.lua new file mode 100644 index 0000000..4db9624 --- /dev/null +++ b/mods/naturalbiomes/alderswamp.lua @@ -0,0 +1,612 @@ + +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:alderswamp_litter", { + description = S("Alder Swamp dirt with Grass"), + tiles = {"naturalbiomes_alderswamp_litter.png", "naturalbiomes_alderswamp_dirt.png", + {name = "naturalbiomes_alderswamp_dirt.png^naturalbiomes_alderswamp_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:alderswamp_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:alderswamp_dirt", { + description = S("Alder Swamp Dirt"), + tiles = {"naturalbiomes_alderswamp_dirt.png"}, + groups = {crumbly = 3, soil = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:alderswamp", + node_top = "naturalbiomes:alderswamp_litter", + depth_top = 1, + node_filler = "naturalbiomes:alderswamp_dirt", + depth_filler = 3, + node_riverbed = "naturalbiomes:alderswamp_dirt", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 5, + y_min = 0, + heat_point = 55, + humidity_point = 70, +}) + +-- +-- Tree generation +-- + +-- New alder tree + +local function grow_new_alder_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_aldertree_0_270.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:alder_sapling", grow_new_alder_tree, "soil"}, +}) +end + +-- alder trunk +minetest.register_node("naturalbiomes:alder_trunk", { + description = S("Alder Trunk"), + tiles = { + "naturalbiomes_alderswamp_alder_trunk_top.png", + "naturalbiomes_alderswamp_alder_trunk_top.png", + "naturalbiomes_alderswamp_alder_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- alder wood +minetest.register_node("naturalbiomes:alder_wood", { + description = S("Alder Wood"), + tiles = {"naturalbiomes_alderswamp_alder_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:alder_wood 4", + recipe = {{"naturalbiomes:alder_trunk"}} +}) + +minetest.register_node("naturalbiomes:alder_leaves", { + description = S("Alder Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_alderswamp_alder_leaves.png"}, + special_tiles = {"naturalbiomes_alderswamp_alder_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:alder_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:alder_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alder_sapling", { + description = S("Alder Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alderswamp_sapling.png"}, + inventory_image = "naturalbiomes_alderswamp_sapling.png", + wield_image = "naturalbiomes_alderswamp_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alder_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alder_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_alderswamp_alder_wood", + "naturalbiomes:alder_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alderswamp_alder_wood.png"}, + S("Alder Stair"), + S("Alder Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alderswamp_alder_trunk", + "naturalbiomes:alder_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alderswamp_alder_trunk_top.png", "naturalbiomes_alderswamp_alder_trunk_top.png", "naturalbiomes_alderswamp_alder_trunk.png"}, + S("Alder Trunk Stair"), + S("Alder Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_alder_wood", + { + description = S("Alder Wood Fence Gate"), + texture = "naturalbiomes_alderswamp_alder_wood.png", + material = "naturalbiomes:alder_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_alder_wood", + { + description = S("Alder Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_alderswamp_alder_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_alderswamp_alder_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alder_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_alder_wood", + { + description = S("Alder Fence Rail"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_alderswamp_alder_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_alderswamp_alder_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alder_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:alder_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.01115, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_aldertree_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:alder_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00615, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_aldertree2_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:alder_tree3", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00615, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_aldertree3_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_node("naturalbiomes:alderswamp_reed", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds.png", + wield_image = "naturalbiomes_alderswamp_reeds.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_reed", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_reed", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_reed", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds.png", + wield_image = "naturalbiomes_alderswamp_reeds.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_reed2", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 8, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_reed2", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_reed2", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds2.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds2.png", + wield_image = "naturalbiomes_alderswamp_reeds2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_reed3", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_reed3", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_reed3", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reeds3.png"}, + inventory_image = "naturalbiomes_alderswamp_reeds3.png", + wield_image = "naturalbiomes_alderswamp_reeds3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alder_log", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alder_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:alderswamp_litter", + num_spawn_by = 8, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alder_swamppit", + deco_type = "schematic", + place_on = {"naturalbiomes:alderswamp_litter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 3, + persist = 2, + }, + biomes = {"naturalbiomes:alderswamp"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts", + flags = "place_center_x, place_center_z", + flags = "force_placement", + rotation = "random", + spawn_by = "naturalbiomes:alderswamp_litter", + }) + + minetest.register_decoration({ + name = "naturalbiomes:waterlily", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + y_max = 0, + y_min = 0, + decoration = "naturalbiomes:waterlily", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) + +minetest.register_node("naturalbiomes:waterlily", { + description = S("Waterlily"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"naturalbiomes_alderswamp_waterlily.png", "naturalbiomes_alderswamp_waterlily_bottom.png"}, + inventory_image = "naturalbiomes_alderswamp_waterlily.png", + wield_image = "naturalbiomes_alderswamp_waterlily.png", + use_texture_alpha = "clip", + liquids_pointable = true, + walkable = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flower = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + node_placement_prediction = "", + node_box = { + type = "fixed", + fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5} + }, + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16} + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, + pointed_thing) + end + + if def and def.liquidtype == "source" and + minetest.get_item_group(node.name, "water") > 0 then + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = "naturalbiomes:waterlily", + param2 = math.random(0, 3)}) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, ("Node is protected.")) + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +}) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_yellowflower", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alderswamp_yellowflower", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_yellowflower", { + description = S"Alderswamp flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_adler_yellowflower.png"}, + inventory_image = "naturalbiomes_adler_yellowflower.png", + wield_image = "naturalbiomes_adler_yellowflower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alderswamp_brownreed", + deco_type = "simple", + place_on = {"naturalbiomes:alderswamp_litter"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 1, + y_min = 0, + decoration = "naturalbiomes:alderswamp_brownreed", + spawn_by = "naturalbiomes:alderswamp_litter" + }) + +minetest.register_node("naturalbiomes:alderswamp_brownreed", { + description = S"Alderswamp reed", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_alderswamp_reedbrown.png"}, + inventory_image = "naturalbiomes_alderswamp_reedbrown.png", + wield_image = "naturalbiomes_alderswamp_reedbrown.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:alderswamp_litter", {"naturalbiomes:alderswamp_brownreed", "naturalbiomes:alderswamp_yellowflower", "naturalbiomes:alderswamp_reed", "naturalbiomes:alderswamp_reed2", "naturalbiomes:alderswamp_reed3"}, {}} + }) +end \ No newline at end of file diff --git a/mods/naturalbiomes/alpine.lua b/mods/naturalbiomes/alpine.lua new file mode 100644 index 0000000..77af028 --- /dev/null +++ b/mods/naturalbiomes/alpine.lua @@ -0,0 +1,851 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:alpine_litter", { + description = S("Dirt with Alpine Grass"), + tiles = {"naturalbiomes_alpine_litter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_alpine_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:alpine_rock", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:alpine_rock", { + description = S("Alpine Rock"), + tiles = {"naturalbiomes_alpine_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:alpine_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:alpine", + node_top = "naturalbiomes:alpine_litter", + depth_top = 1, + node_filler = "naturalbiomes:alpine_rock", + depth_filler = 50, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:stone", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 30, + heat_point = 55, + humidity_point = 60, +}) + +-- Tree generation +-- + +-- New pine tree + +local function grow_new_alppine1_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 5, y = pos.y - 0, z = pos.z - 5}, modpath.."/schematics/naturalbiomes_alpine_pine1_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:alppine1_sapling", grow_new_alppine1_tree, "soil"}, +}) +end + +-- Pine1 trunk +minetest.register_node("naturalbiomes:alppine1_trunk", { + description = S("Silver Fir Trunk"), + tiles = { + "naturalbiomes_alpine_pine1_trunk_top.png", + "naturalbiomes_alpine_pine1_trunk_top.png", + "naturalbiomes_alpine_pine1_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- Pine wood +minetest.register_node("naturalbiomes:alppine1_wood", { + description = S("Silver Fir Wood"), + tiles = {"naturalbiomes_alpine_pine1_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:alppine1_wood 4", + recipe = {{"naturalbiomes:alppine1_trunk"}} +}) + +minetest.register_node("naturalbiomes:alppine1_leaves", { + description = S("Silver Fir Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_alpine_pine1_leaves.png"}, + special_tiles = {"naturalbiomes_alpine_pine1_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:alppine1_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:alppine1_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alppine1_sapling", { + description = S("Silver Fir Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alpine_pine1_sapling.png"}, + inventory_image = "naturalbiomes_alpine_pine1_sapling.png", + wield_image = "naturalbiomes_alpine_pine1_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alppine1_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alppine1_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine1_wood", + "naturalbiomes:alppine1_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine1_wood.png"}, + S("Silver Fir Stair"), + S("Silver Fir Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine1_trunk", + "naturalbiomes:alppine1_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine1_trunk_top.png", "naturalbiomes_alpine_pine1_trunk_top.png", "naturalbiomes_alpine_pine1_trunk.png"}, + S("Silver Fir Trunk Stair"), + S("Silver Fir Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_alppine1_wood", + { + description = S("Silver Fir Wood Fence Gate"), + texture = "naturalbiomes_alpine_pine1_wood.png", + material = "naturalbiomes:alppine1_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_alppine1_wood", + { + description = S("Silver Fir Fence"), + texture = "naturalbiomes_pine_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_alpine_pine1_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_alpine_pine1_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine1_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_alppine1_wood", + { + description = S("Silver Fir Fence Rail"), + texture = "naturalbiomes_pine_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine1_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine1_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine1_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:alppine1_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 30, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_alpine_pine1_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- Tree generation +-- + +-- New alppine2 tree + +local function grow_new_alppine2_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_alpine_pine2_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:alppine2_sapling", grow_new_alppine2_tree, "soil"}, +}) +end + +-- Pine2 trunk +minetest.register_node("naturalbiomes:alppine2_trunk", { + description = S("Jack Pine Trunk"), + tiles = { + "naturalbiomes_alpine_pine2_trunk_top.png", + "naturalbiomes_alpine_pine2_trunk_top.png", + "naturalbiomes_alpine_pine2_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- Pine2 wood +minetest.register_node("naturalbiomes:alppine2_wood", { + description = S("Jack Pine Wood"), + tiles = {"naturalbiomes_alpine_pine2_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:alppine2_wood 4", + recipe = {{"naturalbiomes:alppine2_trunk"}} +}) + +minetest.register_node("naturalbiomes:alppine2_leaves", { + description = S("Jack Pine Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_alpine_pine2_leaves.png"}, + special_tiles = {"naturalbiomes_alpine_pine2_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:alppine2_sapling'}, + rarity = 15, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:alppine2_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alppine2_sapling", { + description = S("Jack Pine Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alpine_pine2_sapling.png"}, + inventory_image = "naturalbiomes_alpine_pine2_sapling.png", + wield_image = "naturalbiomes_alpine_pine2_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_alppine2_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alppine2_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine2_wood", + "naturalbiomes:alppine2_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine2_wood.png"}, + S("Jack Pine Stair"), + S("Jack Pine Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_pine2_trunk", + "naturalbiomes:alppine2_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_alpine_pine2_trunk_top.png", "naturalbiomes_alpine_pine2_trunk_top.png", "naturalbiomes_alpine_pine2_trunk.png"}, + S("Jack Pine Trunk Stair"), + S("Jack Pine Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_alppine2_wood", + { + description = S("Jack Pine Wood Fence Gate"), + texture = "naturalbiomes_alpine_pine2_wood.png", + material = "naturalbiomes:alppine2_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_pine2_wood", + { + description = S("Jack Pine Fence"), + texture = "naturalbiomes_pine2_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_alpine_pine2_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_alpine_pine2_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine2_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_pine2_wood", + { + description = S("Jack Pine Fence Rail"), + texture = "naturalbiomes_pine2_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine2_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_alpine_pine2_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:alppine2_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:alppine2_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00715, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 30, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_alpine_pine2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- Tree generation +-- + +-- New cowberry bush + +local function grow_new_outback_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_alpine_cowberrybush.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:alpine_cowberrybush_sapling", grow_new_outback_bush, "soil"}, +}) +end + + minetest.register_decoration({ + name = "naturalbiomes:cowberry_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 30, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alpine_cowberrybush.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:alpine_cowberrybush_stem", { + description = S("Cowberry Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_alpine_cowberry_stem.png"}, + inventory_image = "naturalbiomes_alpine_cowberry_stem.png", + wield_image = "naturalbiomes_alpine_cowberry_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:alpine_cowberrybush_leaves", { + description = S("Cowberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_alpine_cowberry_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:alpine_cowberrybush_sapling"}, rarity = 20}, + {items = {"naturalbiomes:cowberry"}, rarity = 2}, + {items = {"naturalbiomes:alpine_cowberrybush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:alpine_cowberrybush_sapling", { + description = S("Cowberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_alpine_cowberry_sapling.png"}, + inventory_image = "naturalbiomes_alpine_cowberry_sapling.png", + wield_image = "naturalbiomes_alpine_cowberry_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_outback_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:alpine_cowberrybush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:cowberry", { + description = S("Cowberry"), + drawtype = "torchlike", + tiles = {"naturalbiomes_alpine_cowberry_fruit.png"}, + inventory_image = "naturalbiomes_alpine_cowberry_fruit.png", + wield_image = "naturalbiomes_alpine_cowberry_fruit.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:cowberry", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:cowberry", param2 = 1}) + end + end +}) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_mushroom", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = 7133, + octaves = 3, + persist = 0.6 + }, + y_max = 31000, + y_min = 30, + decoration = "naturalbiomes:alpine_mushroom", + spawn_by = "naturalbiomes:alpine_litter", + +}) + + +minetest.register_node("naturalbiomes:alpine_mushroom", { + description = S("Alpine Mushroom"), + tiles = {"naturalbiomes_alpine_mushroom.png"}, + inventory_image = "naturalbiomes_alpine_mushroom.png", + wield_image = "naturalbiomes_alpine_mushroom.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {mushroom = 1, food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(1), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } +}) + + + minetest.register_decoration({ + name = "naturalbiomes:alpine_grass1", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:alpine_grass1", + spawn_by = "naturalbiomes:alpine_litter" + }) + +minetest.register_node("naturalbiomes:alpine_grass1", { + description = S"Alpine Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_grass1.png"}, + inventory_image = "naturalbiomes_alpine_grass1.png", + wield_image = "naturalbiomes_alpine_grass1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 8, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:alpine_grass2", + spawn_by = "naturalbiomes:alpine_litter" + }) + +minetest.register_node("naturalbiomes:alpine_grass2", { + description = S"Alpine Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_grass2.png"}, + inventory_image = "naturalbiomes_alpine_grass2.png", + wield_image = "naturalbiomes_alpine_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:alpine_grass3", + spawn_by = "naturalbiomes:alpine_litter" + }) + +minetest.register_node("naturalbiomes:alpine_grass3", { + description = S"Alpine Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_grass3.png"}, + inventory_image = "naturalbiomes_alpine_grass3.png", + wield_image = "naturalbiomes_alpine_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_dandelion", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:alpine_dandelion", + spawn_by = "naturalbiomes:alpine_litter" + }) + +minetest.register_node("naturalbiomes:alpine_dandelion", { + description = S"Alpine Dandelion Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_dandelion.png"}, + inventory_image = "naturalbiomes_alpine_dandelion.png", + wield_image = "naturalbiomes_alpine_dandelion.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_edelweiss", + deco_type = "simple", + place_on = {"naturalbiomes:alpine_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 8, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:alpine_edelweiss", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:alpine_edelweiss", { + description = S"Edelweiss Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_alpine_edelweiss.png"}, + inventory_image = "naturalbiomes_alpine_edelweiss.png", + wield_image = "naturalbiomes_alpine_edelweiss.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_log", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes__alpine_pine1_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:alpine_litter", + num_spawn_by = 4, + }) + + minetest.register_decoration({ + name = "naturalbiomes:alpine_log2", + deco_type = "schematic", + place_on = {"naturalbiomes:alpine_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:alpine"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_alpine_pine2_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:alpine_litter", + num_spawn_by = 4, + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:alpine_litter", {"naturalbiomes:alpine_edelweiss", "naturalbiomes:alpine_dandelion", "naturalbiomes:alpine_grass3", "naturalbiomes:alpine_grass2", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_mushroom"}, {}} + }) +end \ No newline at end of file diff --git a/mods/naturalbiomes/bambooforest.lua b/mods/naturalbiomes/bambooforest.lua new file mode 100644 index 0000000..81fa1cb --- /dev/null +++ b/mods/naturalbiomes/bambooforest.lua @@ -0,0 +1,562 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:bambooforest_litter", { + description = S("Bamboo Forest Litter"), + tiles = {"naturalbiomes_bambooforest_litter.png", "naturalbiomes_bambooforest_rock.png", + {name = "naturalbiomes_bambooforest_rock.png^naturalbiomes_bambooforest_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:bambooforest_rock", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_biome({ + name = "bambooforest", + node_top = "naturalbiomes:bambooforest_litter", + depth_top = 1, + node_filler = "naturalbiomes:bambooforest_rock", + depth_filler = 70, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 5, + heat_point = 89, + humidity_point = 77, +}) + +-- Tree generation +-- + +-- New bamboo tree + +local function grow_new_bamboo_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_bambootree_large_0_270.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:bamboo_sapling", grow_new_bamboo_tree, "soil"}, +}) +end + +-- bamboo trunk +minetest.register_node("naturalbiomes:bamboo_trunk", { + description = S("Bamboo Trunk"), + tiles = { + "naturalbiomes_bambooforest_bamboo_trunk_top.png", + "naturalbiomes_bambooforest_bamboo_trunk_top.png", + "naturalbiomes_bambooforest_bamboo_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- bamboo wood +minetest.register_node("naturalbiomes:bamboo_wood", { + description = S("Bamboo Wood"), + tiles = {"naturalbiomes_bambooforest_bamboo_wood2.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:bamboo_wood 4", + recipe = {{"naturalbiomes:bamboo_trunk"}} +}) + +minetest.register_node("naturalbiomes:bamboo_leaves", { + description = S("Bamboo Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_Bambooforest_bamboo_leaves.png"}, + special_tiles = {"naturalbiomes_Bambooforest_bamboo_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:bamboo_sapling'}, + rarity = 10, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:bamboo_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bamboo_sapling", { + description = S("Bamboo Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bambooforest_bamboo_sapling.png"}, + inventory_image = "naturalbiomes_bambooforest_bamboo_sapling.png", + wield_image = "naturalbiomes_bambooforest_bamboo_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_bamboo_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bamboo_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_bambooforest_bamboo_wood2", + "naturalbiomes:bamboo_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_bambooforest_bamboo_wood2.png"}, + S("Bamboo Stair"), + S("Bamboo Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_bambooforest_bamboo_trunk", + "naturalbiomes:bamboo_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_bambooforest_bamboo_trunk_top.png", "naturalbiomes_bambooforest_bamboo_trunk_top.png", "naturalbiomes_bambooforest_bamboo_trunk.png"}, + S("Bamboo Trunk Stair"), + S("Bamboo Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_bamboo_wood", + { + description = S("Bamboo Wood Fence Gate"), + texture = "naturalbiomes_bambooforest_bamboo_wood2.png", + material = "naturalbiomes:bamboo_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_bamboo_wood", + { + description = S("Bamboo Fence"), + texture = "naturalbiomes_bamboo_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:bamboo_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_bamboo_wood", + { + description = S("Bamboo Fence Rail"), + texture = "naturalbiomes_bamboo_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_bambooforest_bamboo_wood2.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:bamboo_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:bamboo_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.02115, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_bambootree_large_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:bamboo_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.02115, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_bambootree_small_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + + minetest.register_decoration({ + name = "naturalbiomes:smallbamboo", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.05, + spread = {x = 100, y = 100, z = 100}, + seed = 936, + octaves = 3, + persist = 0.7 + }, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 0, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bambootree_small_micro_0_270.mts", + }) + +minetest.register_node("naturalbiomes:smallbamboo", { + description = S("Small Bamboo Grass"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bambooforest_bamboo_trunksmall.png"}, + inventory_image = "naturalbiomes_bambooforest_bamboo_trunksmall.png", + wield_image = "naturalbiomes_bambooforest_bamboo_trunksmall.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("naturalbiomes:bambooforest_rock", { + description = S("Bamboo Forest Rock"), + tiles = {"naturalbiomes_bambooforest_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:bambooforest_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "naturalbiomes:bambooforest_groundgrass", + deco_type = "simple", + place_on = {"naturalbiomes:bambooforest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:bambooforest_groundgrass", + spawn_by = "naturalbiomes:bambooforest_litter" + }) + +minetest.register_node("naturalbiomes:bambooforest_groundgrass", { + description = S"Babmooforest Gorund Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bambooforest_groundgrass.png"}, + inventory_image = "naturalbiomes_bambooforest_groundgrass.png", + wield_image = "naturalbiomes_bambooforest_groundgrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:bambooforest_groundgrass2", + deco_type = "simple", + place_on = {"naturalbiomes:bambooforest_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:bambooforest_groundgrass2", + spawn_by = "naturalbiomes:bambooforest_litter" + }) + +minetest.register_node("naturalbiomes:bambooforest_groundgrass2", { + description = S"Babmooforest Gorund Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bambooforest_groundgrass2.png"}, + inventory_image = "naturalbiomes_bambooforest_groundgrass2.png", + wield_image = "naturalbiomes_bambooforest_groundgrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +-- +-- Tree generation +-- + +-- New banana tree + +local function grow_new_banana_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_banana_palm_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:banana_sapling", grow_new_banana_tree, "soil"}, +}) +end + +-- banana trunk +minetest.register_node("naturalbiomes:banana_trunk", { + description = S("Banana Trunk"), + tiles = { + "naturalbiomes__banana_trunk_top.png", + "naturalbiomes__banana_trunk_top.png", + "naturalbiomes__banana_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- banana wood +minetest.register_node("naturalbiomes:banana_wood", { + description = S("Banana Wood"), + tiles = {"naturalbiomes__banana_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:banana_wood 4", + recipe = {{"naturalbiomes:banana_trunk"}} +}) + +minetest.register_node("naturalbiomes:banana_leaves", { + description = S("Banana Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes__banana_leaf.png"}, + special_tiles = {"naturalbiomes__banana_leaf.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:banana_sapling'}, + rarity = 10, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:banana_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:banana_sapling", { + description = S("Banana Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes__banana_tree_sapling.png"}, + inventory_image = "naturalbiomes__banana_tree_sapling.png", + wield_image = "naturalbiomes__banana_tree_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_banana_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:banana_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_banana_wood", + "naturalbiomes:banana_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_banana_wood.png"}, + S("Banana Stair"), + S("Banana Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_banana_trunk", + "naturalbiomes:banana_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_banana_trunk_top.png", "naturalbiomes_banana_trunk_top.png", "naturalbiomes_banana_trunk.png"}, + S("Banana Trunk Stair"), + S("Banana Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_banana_wood", + { + description = S("Banana Wood Fence Gate"), + texture = "naturalbiomes_banana_wood.png", + material = "naturalbiomes:banana_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_banana_wood", + { + description = S("Banana Fence"), + texture = "naturalbiomes_banana_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_banana_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_banana_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:banana_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_banana_wood", + { + description = S("Banana Fence Rail"), + texture = "naturalbiomes_banana_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_banana_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_banana_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:banana_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:banana_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:bambooforest_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00515, + biomes = {"naturalbiomes:bambooforest"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_banana_palm_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:bambooforest_litter", {"naturalbiomes:smallbamboo", "naturalbiomes:bambooforest_groundgrass", "naturalbiomes:bambooforest_groundgrass2"}, {}} + }) +end \ No newline at end of file diff --git a/mods/naturalbiomes/bushland.lua b/mods/naturalbiomes/bushland.lua new file mode 100644 index 0000000..ac9cdb9 --- /dev/null +++ b/mods/naturalbiomes/bushland.lua @@ -0,0 +1,1035 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:bushland_bushlandlitter2", { + description = S("Bushland Litter"), + tiles = { + "naturalbiomes_bushland_bushlandlitter2_top.png", + "naturalbiomes_bushland_bushlandlitter2_bottom.png", + "naturalbiomes_bushland_bushlandlitter2_right.png", + "naturalbiomes_bushland_bushlandlitter2_left.png", + "naturalbiomes_bushland_bushlandlitter2_back.png", + "naturalbiomes_bushland_bushlandlitter2_front.png"}, + groups = {crumbly = 3, sand = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("naturalbiomes:bushland_bushlandlitter3", { + description = S("Bushland Litter"), + tiles = { + "naturalbiomes_bushland_bushlandlitter3_top.png", + "naturalbiomes_bushland_bushlandlitter3_bottom.png", + "naturalbiomes_bushland_bushlandlitter3_right.png", + "naturalbiomes_bushland_bushlandlitter3_left.png", + "naturalbiomes_bushland_bushlandlitter3_back.png", + "naturalbiomes_bushland_bushlandlitter3_front.png"}, + groups = {crumbly = 3, sand = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:bushland", + node_top = "naturalbiomes:bushland_bushlandlitter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 5, + node_riverbed = "default:sand", + depth_riverbed = 3, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone", + y_max = 500, + y_min = 1, + heat_point = 68, + humidity_point = 83, +}) + +minetest.register_node("naturalbiomes:bushland_bushlandlitter", { + description = S("Bushland Litter"), + tiles = {"naturalbiomes_bushland_bushlandlitter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_bushland_bushlandlitter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.3, + y_max = 20, + y_min = 3, + decoration = "naturalbiomes:bushland_bushlandlitter2" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 0.3, + y_max = 500, + y_min = 3, + decoration = "naturalbiomes:bushland_bushlandlitter3" + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + fill_ratio = 10, + y_max = 3, + y_min = 0, + decoration = "default:sand" + }) + +minetest.register_node("naturalbiomes:bushland_grass", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_grass.png"}, + inventory_image = "naturalbiomes_bushland_grass.png", + wield_image = "naturalbiomes_bushland_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 9478, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass", + }) + +minetest.register_node("naturalbiomes:bushland_grass2", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_grass2.png"}, + inventory_image = "naturalbiomes_bushland_grass2.png", + wield_image = "naturalbiomes_bushland_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass2", + }) + +minetest.register_node("naturalbiomes:bushland_grass3", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_grass3.png"}, + inventory_image = "naturalbiomes_bushland_grass3.png", + wield_image = "naturalbiomes_bushland_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter2", "naturalbiomes:bushland_bushlandlitter3"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 1549, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass3", + }) + +minetest.register_node("naturalbiomes:bushland_grass4", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass4.png"}, + inventory_image = "naturalbiomes_bushland_grass4.png", + wield_image = "naturalbiomes_bushland_grass4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 6687, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass4", + }) + +minetest.register_node("naturalbiomes:bushland_grass5", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass5.png"}, + inventory_image = "naturalbiomes_bushland_grass5.png", + wield_image = "naturalbiomes_bushland_grass5.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter2", "naturalbiomes:bushland_bushlandlitter3"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4663, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass5", + }) + +minetest.register_node("naturalbiomes:bushland_grass6", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass6.png"}, + inventory_image = "naturalbiomes_bushland_grass6.png", + wield_image = "naturalbiomes_bushland_grass6.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter2", "naturalbiomes:bushland_bushlandlitter3"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass6", + }) + +minetest.register_node("naturalbiomes:bushland_grass7", { + description = S"Bushland Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_bushland_grass7.png"}, + inventory_image = "naturalbiomes_bushland_grass7.png", + wield_image = "naturalbiomes_bushland_grass7.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 9932, + octaves = 9, + persist = 1, + }, + y_max = 30000, + y_min = 3, + decoration = "naturalbiomes:bushland_grass7", + }) + +-- New blackberry bush + +local function grow_new_blackberry_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_bushland_blackberrybush.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:bushland_blackberrybush_sapling", grow_new_blackberry_bush, "soil"}, +}) +end + + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_blackberrybush.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_blackberrybush2.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_blackberrybush3.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:bushland_blackberry_stem", { + description = S("Blackberry Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_blackberry_stem.png"}, + inventory_image = "naturalbiomes_bushland_blackberry_stem.png", + wield_image = "naturalbiomes_bushland_blackberry_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:bushland_blackberry_leaves2", { + description = S("Blackberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_blackberry_leaves2.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_blackberrybush_sapling"}, rarity = 3}, + {items = {"naturalbiomes:blackberry"}, rarity = 2}, + {items = {"naturalbiomes:bushland_blackberry_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_blackberry_leaves", { + description = S("Blackberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_blackberry_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_blackberrybush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:blackberry"}, rarity = 2}, + {items = {"naturalbiomes:bushland_blackberry_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_blackberrybush_sapling", { + description = S("Blackberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bushland_blackberry_sapling.png"}, + inventory_image = "naturalbiomes_bushland_blackberry_sapling.png", + wield_image = "naturalbiomes_bushland_blackberry_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_blackberry_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bushland_blackberrybush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:blackberry", { + description = S("Blackberry"), + drawtype = "torchlike", + tiles = {"naturalbiomes_bushland_blackberries.png"}, + inventory_image = "naturalbiomes_bushland_blackberries.png", + wield_image = "naturalbiomes_bushland_blackberries.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:blackberry", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:blackberry", param2 = 1}) + end + end +}) + + +-- New wildrose bush + +local function grow_new_wildrose_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 1, y = pos.y - 0, z = pos.z - 1}, modpath.."/schematics/naturalbiomes_bushland_wildrosebush.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:bushland_wildrosebush_sapling", grow_new_wildrose_bush, "soil"}, +}) +end + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_wildrosebush.mts", + flags = "place_center_x, place_center_z", + }) + + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_wildrosebush2.mts", + flags = "place_center_x, place_center_z", + }) + + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_wildrosebush3.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:bushland_wildrose_stem", { + description = S("Wildrose Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.40, + tiles = {"naturalbiomes_bushland_wildrose_stem.png"}, + inventory_image = "naturalbiomes_bushland_wildrose_stem.png", + wield_image = "naturalbiomes_bushland_wildrose_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:bushland_wildrose_leaves2", { + description = S("Wildrose Bush Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_bushland_wildrose_leaves2.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_wildrosebush_sapling"}, rarity = 3}, + {items = {"naturalbiomes:wildrose"}, rarity = 2}, + {items = {"naturalbiomes:bushland_wildrose_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_wildrose_leaves", { + description = S("Wildrose Bush Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_bushland_wildrose_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_wildrosebush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:wildrose"}, rarity = 2}, + {items = {"naturalbiomes:bushland_wildrose_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_wildrosebush_sapling", { + description = S("Wildrose Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bushland_wildrose_sapling.png"}, + inventory_image = "naturalbiomes_bushland_wildrose_sapling.png", + wield_image = "naturalbiomes_bushland_wildrose_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_wildrose_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bushland_wildrosebush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:wildrose", { + description = S("Wildrose"), + drawtype = "torchlike", + tiles = {"naturalbiomes_bushland_wildrose.png"}, + inventory_image = "naturalbiomes_bushland_wildrose.png", + wield_image = "naturalbiomes_bushland_wildrose.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:wildrose", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:wildrose", param2 = 1}) + end + end +}) + +-- New hazelnut bush + +local function grow_new_hazelnut_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 3, y = pos.y - 0, z = pos.z - 3}, modpath.."/schematics/naturalbiomes_bushland_hazelnutbush.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:bushland_hazelnutbush_sapling", grow_new_hazelnut_bush, "soil"}, +}) +end + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00215, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_hazelnutbush.mts", + flags = "place_center_x, place_center_z", + }) + + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00215, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_hazelnutbush2.mts", + flags = "place_center_x, place_center_z", + }) + + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00215, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_hazelnutbush3.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:bushland_hazelnut_stem", { + description = S("Hazelnut Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"naturalbiomes_bushland_hazelnut_stem.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut_stem.png", + wield_image = "naturalbiomes_bushland_hazelnut_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:bushland_hazelnut_leaves2", { + description = S("Hazelnut Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_hazelnut_leaves2.png"}, + paramtype = "light", + waving = 1, + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_hazelnutbush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:hazelnut"}, rarity = 2}, + {items = {"naturalbiomes:bushland_hazelnut_leaves2"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_hazelnut_leaves", { + description = S("Hazelnut Bush Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_bushland_hazelnut_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_hazelnutbush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:hazelnut"}, rarity = 2}, + {items = {"naturalbiomes:bushland_hazelnut_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:bushland_hazelnutbush_sapling", { + description = S("Hazelnut Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_bushland_hazelnut_sapling.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut_sapling.png", + wield_image = "naturalbiomes_bushland_hazelnut_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_hazelnut_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:bushland_hazelnutbush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("naturalbiomes:hazelnut", { + description = S("Hazelnut"), + drawtype = "torchlike", + tiles = {"naturalbiomes_bushland_hazelnut.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut.png", + wield_image = "naturalbiomes_bushland_hazelnut.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:hazelnut", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:hazelnut", param2 = 1}) + end + end +}) + +--- dead bush + +minetest.register_node("naturalbiomes:bushland_deadbush_leaves", { + description = S("Dead Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_bushland_deadbush_leaves.png"}, + paramtype = "light", + waving = 1, + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:bushland_deadbush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_deadbush3.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_deadbush2.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"naturalbiomes:bushland_bushlandlitter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:bushland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_bushland_deadbush.mts", + flags = "place_center_x, place_center_z", + }) + +-- cracked hazelnut +minetest.register_craftitem("naturalbiomes:hazelnut_cracked", { + description = S("Cracked Hazelnut"), + inventory_image = "naturalbiomes_bushland_hazelnut_cracked.png", + on_use = minetest.item_eat(5), + groups = {food = 1, flammable = 2}, +}) + +minetest.register_craft({ + output = "naturalbiomes:hazelnut_cracked", +type = "shapeless", + recipe = + {"naturalbiomes:hazelnut", "group:stone"} +}) + + +xpanes.register_pane("hazelnut_pane", { + description = S("Hazelnut Woven Fence"), + textures = {"naturalbiomes_bushland_hazelnut_fence.png", "", "naturalbiomes_bushland_hazelnut_fence.png"}, + inventory_image = "naturalbiomes_bushland_hazelnut_fence.png", + wield_image = "naturalbiomes_bushland_hazelnut_fence.png", + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, +recipe = { + {"", "farming:string", ""}, + {"naturalbiomes:bushland_hazelnut_stem", "naturalbiomes:bushland_hazelnut_stem", "naturalbiomes:bushland_hazelnut_stem"} + } +}) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:bushland_bushlandlitter", {"naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:bushland_bushlandlitter2", {"naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:bushland_bushlandlitter3", {"naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7"}, {}} + }) +end \ No newline at end of file diff --git a/mods/naturalbiomes/crafting.lua b/mods/naturalbiomes/crafting.lua new file mode 100644 index 0000000..d852824 --- /dev/null +++ b/mods/naturalbiomes/crafting.lua @@ -0,0 +1,692 @@ +local S = minetest.get_translator("naturalbiomes") + + stairs.register_stair_and_slab( + "naturalbiomes_adler_reed_bundle", + "naturalbiomes:reed_bundle", + {snappy = 3, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_adler_reed_bundle.png"}, + S("Reed Bundle Stair"), + S("Reed Bundle Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_alpine_rock_brick", + "naturalbiomes:alpine_brick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_alpine_rock_brick.png"}, + S("Alpine Brick Stair"), + S("Alpine Brick Slab"), + default.node_sound_wood_defaults() + ) + + + stairs.register_stair_and_slab( + "naturalbiomes_bambooforest_rock_brick", + "naturalbiomes:bamboo_brick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_bambooforest_rock_brick.png"}, + S("Bamboo Brick Stair"), + S("Bamboo Brick Slab"), + default.node_sound_wood_defaults() + ) + + + stairs.register_stair_and_slab( + "naturalbiomes_beach_rock_brick", + "naturalbiomes:beach_brick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_beach_rock_brick.png"}, + S("Beach Brick Stair"), + S("Beach Brick Slab"), + default.node_sound_wood_defaults() + ) + + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_rock_brick", + "naturalbiomes:med_brick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_mediterran_rock_brick.png"}, + S("Med Brick Stair"), + S("Med Brick Slab"), + default.node_sound_wood_defaults() + ) + + + stairs.register_stair_and_slab( + "naturalbiomes_outback_rock_brick", + "naturalbiomes:outback_brick", + {cracky = 2, oddly_breakable_by_hand = 0, flammable = 0}, + {"naturalbiomes_outback_rock_brick.png"}, + S("Outback Brick Stair"), + S("Outback Brick Slab"), + default.node_sound_wood_defaults() + ) + +walls.register(":naturalbiomes:alpine_brick_wall", S"Alpine Brick Wall", "naturalbiomes_alpine_rock_brick.png", + "naturalbiomes:alpine_brick_wall", default.node_sound_stone_defaults()) + +walls.register(":naturalbiomes:bamboo_brick_wall", S"Bambooforest Wall", "naturalbiomes_bambooforest_rock_brick.png", + "naturalbiomes:bamboo_brick_wall", default.node_sound_stone_defaults()) + +walls.register(":naturalbiomes:med_brick_wall", S"Mediterranean Wall", "naturalbiomes_mediterran_rock_brick.png", + "naturalbiomes:med_brick_wall", default.node_sound_stone_defaults()) + +walls.register(":naturalbiomes:outback_brick_wall", S"Outback Wall", "naturalbiomes_outback_rock_brick.png", + "naturalbiomes:outback_brick_wall", default.node_sound_stone_defaults()) + +walls.register(":naturalbiomes:beach_brick_wall", S"Palmbeach Wall", "naturalbiomes_beach_rock_brick.png", + "naturalbiomes:beach_brick_wall", default.node_sound_stone_defaults()) + +minetest.register_node("naturalbiomes:reed_bundle", { + description = S("Reed Bundle"), + tiles = { + "naturalbiomes_adler_reed_bundle_top.png", + "naturalbiomes_adler_reed_bundle_top.png", + "naturalbiomes_adler_reed_bundle.png" + }, + is_ground_content = false, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("naturalbiomes:alpine_brick", { + description = S("Alpine Brick"), + tiles = {"naturalbiomes_alpine_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:bamboo_brick", { + description = S("Bambooforest Brick"), + tiles = {"naturalbiomes_bambooforest_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:beach_brick", { + description = S("Beach Brick"), + tiles = {"naturalbiomes_beach_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:med_brick", { + description = S("Meditteranean Brick"), + tiles = {"naturalbiomes_mediterran_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:outback_brick", { + description = S("Outback Brick"), + tiles = {"naturalbiomes_outback_rock_brick.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:reed_bundle", + type = "shapeless", + recipe = + {"naturalbiomes:alderswamp_reed", "naturalbiomes:alderswamp_reed"} + +}) + +minetest.register_craft({ + output = "naturalbiomes:reed_bundle", + type = "shapeless", + recipe = + {"naturalbiomes:alderswamp_reed2", "naturalbiomes:alderswamp_reed2"} + +}) + +minetest.register_craft({ + output = "naturalbiomes:reed_bundle", + type = "shapeless", + recipe = + {"naturalbiomes:alderswamp_reed3", "naturalbiomes:alderswamp_reed3"} + +}) + +minetest.register_craft({ + output = "naturalbiomes:alpine_brick", + type = "shapeless", + recipe = + {"naturalbiomes:alpine_rock", "naturalbiomes:alpine_rock"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:bamboo_brick", + type = "shapeless", + recipe = + {"naturalbiomes:bambooforest_rock", "naturalbiomes:bambooforest_rock"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:beach_brick", + type = "shapeless", + recipe = + {"naturalbiomes:palmbeach_rock", "naturalbiomes:palmbeach_rock"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:med_brick", + type = "shapeless", + recipe = + {"naturalbiomes:mediterran_rock", "naturalbiomes:mediterran_rock"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:outback_brick", + type = "shapeless", + recipe = + {"naturalbiomes:outback_rock", "naturalbiomes:outback_rock"} + + +}) + +---- + +minetest.register_craft({ + output = "naturalbiomes:alpine_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:alpine_brick"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:bamboo_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:bamboo_brick"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:beach_brick", + type = "shapeless", + recipe = + {"naturalbiomes:beach_brick"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:med_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:med_brick"} + + +}) + +minetest.register_craft({ + output = "naturalbiomes:outback_brick_wall", + type = "shapeless", + recipe = + {"naturalbiomes:outback_brick"} + + +}) + +--- doors + +doors.register_trapdoor("naturalbiomes:acacia_trapdoor", { + description = S"Wet Savanna Acacia Trapdoor", + inventory_image = "naturalbiomes_acacia_trapdoor.png", + wield_image = "naturalbiomes_acacia_trapdoor.png", + tile_front = "naturalbiomes_acacia_trapdoor.png", + tile_side = "naturalbiomes_acacia_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:acacia_trapdoor 2", + recipe = { + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood"}, + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_trunk", "naturalbiomes:acacia_wood"}, + } +}) + +doors.register("naturalbiomes_acacia_door", { + tiles = {{ name = "naturalbiomes_acacia_door.png", backface_culling = true }}, + description = S"Wet Savanna Acacia Door", + inventory_image = "naturalbiomes_item_acacia_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood"}, + {"naturalbiomes:acacia_trunk", "naturalbiomes:acacia_trunk"}, + {"naturalbiomes:acacia_wood", "naturalbiomes:acacia_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:alder_trapdoor", { + description = S"Alder Trapdoor", + inventory_image = "naturalbiomes_alder_trapdoor.png", + wield_image = "naturalbiomes_alder_trapdoor.png", + tile_front = "naturalbiomes_alder_trapdoor.png", + tile_side = "naturalbiomes_alder_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:alder_trapdoor 2", + recipe = { + {"naturalbiomes:alder_wood", "naturalbiomes:alder_wood", "naturalbiomes:alder_wood"}, + {"naturalbiomes:alder_wood", "naturalbiomes:alder_trunk", "naturalbiomes:alder_wood"}, + } +}) + +doors.register("naturalbiomes_alder_door", { + tiles = {{ name = "naturalbiomes_alder_door.png", backface_culling = true }}, + description = S"Alder Door", + inventory_image = "naturalbiomes_item_alder_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:alder_wood", "naturalbiomes:alder_wood"}, + {"naturalbiomes:alder_trunk", "naturalbiomes:alder_trunk"}, + {"naturalbiomes:alder_wood", "naturalbiomes:alder_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:alpine_trapdoor", { + description = S"Alpine Underground Trapdoor", + inventory_image = "naturalbiomes_alpine1_trapdoor.png", + wield_image = "naturalbiomes_alpine1_trapdoor.png", + tile_front = "naturalbiomes_alpine1_trapdoor.png", + tile_side = "naturalbiomes_alpine1_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:alpine_trapdoor 2", + recipe = { + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood"}, + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_trunk", "naturalbiomes:alppine1_wood"}, + } +}) + +doors.register("naturalbiomes_alpine_door", { + tiles = {{ name = "naturalbiomes_alpine1_door.png", backface_culling = true }}, + description = S"Alpine Underground Door", + inventory_image = "naturalbiomes_item_alpine1_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood"}, + {"naturalbiomes:alppine1_trunk", "naturalbiomes:alppine1_trunk"}, + {"naturalbiomes:alppine1_wood", "naturalbiomes:alppine1_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:alpine2_trapdoor", { + description = S"Alpine Trapdoor", + inventory_image = "naturalbiomes_alpine2_trapdoor.png", + wield_image = "naturalbiomes_alpine2_trapdoor.png", + tile_front = "naturalbiomes_alpine2_trapdoor.png", + tile_side = "naturalbiomes_alpine2_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:alpine2_trapdoor 2", + recipe = { + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood"}, + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_trunk", "naturalbiomes:alppine2_wood"}, + } +}) + +doors.register("naturalbiomes_alpine2_door", { + tiles = {{ name = "naturalbiomes_alpine2_door.png", backface_culling = true }}, + description = S"Alpine Door", + inventory_image = "naturalbiomes_item_alpine2_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood"}, + {"naturalbiomes:alppine2_trunk", "naturalbiomes:alppine2_trunk"}, + {"naturalbiomes:alppine2_wood", "naturalbiomes:alppine2_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:bamboo_trapdoor", { + description = S"Bamboo Trapdoor", + inventory_image = "naturalbiomes_bamboo_trapdoor.png", + wield_image = "naturalbiomes_bamboo_trapdoor.png", + tile_front = "naturalbiomes_bamboo_trapdoor.png", + tile_side = "naturalbiomes_bamboo_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:bamboo_trapdoor 2", + recipe = { + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood"}, + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_trunk", "naturalbiomes:bamboo_wood"}, + } +}) + +doors.register("naturalbiomes_bamboo_door", { + tiles = {{ name = "naturalbiomes_bamboo_door.png", backface_culling = true }}, + description = S"Bamboo Door", + inventory_image = "naturalbiomes_item_bamboo_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood"}, + {"naturalbiomes:bamboo_trunk", "naturalbiomes:bamboo_trunk"}, + {"naturalbiomes:bamboo_wood", "naturalbiomes:bamboo_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:banana_trapdoor", { + description = S"Banana Trapdoor", + inventory_image = "naturalbiomes_banana_trapdoor.png", + wield_image = "naturalbiomes_banana_trapdoor.png", + tile_front = "naturalbiomes_banana_trapdoor.png", + tile_side = "naturalbiomes_banana_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:banana_trapdoor 2", + recipe = { + {"naturalbiomes:banana_wood", "naturalbiomes:banana_wood", "naturalbiomes:banana_wood"}, + {"naturalbiomes:banana_wood", "naturalbiomes:banana_trunk", "naturalbiomes:banana_wood"}, + } +}) + +doors.register("naturalbiomes_banana_door", { + tiles = {{ name = "naturalbiomes_banana_door.png", backface_culling = true }}, + description = S"Banana Door", + inventory_image = "naturalbiomes_item_banana_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:banana_wood", "naturalbiomes:banana_wood"}, + {"naturalbiomes:banana_trunk", "naturalbiomes:banana_trunk"}, + {"naturalbiomes:banana_wood", "naturalbiomes:banana_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:birch_trapdoor", { + description = S"Birch Trapdoor", + inventory_image = "naturalbiomes_birch_trapdoor.png", + wield_image = "naturalbiomes_birch_trapdoor.png", + tile_front = "naturalbiomes_birch_trapdoor.png", + tile_side = "naturalbiomes_birch_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:birch_trapdoor 2", + recipe = { + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood"}, + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_trunk", "naturalbiomes:heath_birch_wood"}, + } +}) + +doors.register("naturalbiomes_birch_door", { + tiles = {{ name = "naturalbiomes_birch_door.png", backface_culling = true }}, + description = S"Birch Door", + inventory_image = "naturalbiomes_item_birch_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood"}, + {"naturalbiomes:heath_birch_trunk", "naturalbiomes:heath_birch_trunk"}, + {"naturalbiomes:heath_birch_wood", "naturalbiomes:heath_birch_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:coconut_trapdoor", { + description = S"Coconut Trapdoor", + inventory_image = "naturalbiomes_cocopalm_trapdoor.png", + wield_image = "naturalbiomes_cocopalm_trapdoor.png", + tile_front = "naturalbiomes_cocopalm_trapdoor.png", + tile_side = "naturalbiomes_cocopalm_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:coconut_trapdoor 2", + recipe = { + {"naturalbiomes:palm_wood", "naturalbiomes:palm_wood", "naturalbiomes:palm_wood"}, + {"naturalbiomes:palm_wood", "naturalbiomes:palm_trunk", "naturalbiomes:palm_wood"}, + } +}) + +doors.register("naturalbiomes_coconut_door", { + tiles = {{ name = "naturalbiomes_cocopalm_door.png", backface_culling = true }}, + description = S"Coconut Door", + inventory_image = "naturalbiomes_item_cocopalm_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:palm_wood", "naturalbiomes:palm_wood"}, + {"naturalbiomes:palm_trunk", "naturalbiomes:palm_trunk"}, + {"naturalbiomes:palm_wood", "naturalbiomes:palm_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:juniper_trapdoor", { + description = S"Juniper Trapdoor", + inventory_image = "naturalbiomes_juniper_trapdoor.png", + wield_image = "naturalbiomes_juniper_trapdoor.png", + tile_front = "naturalbiomes_juniper_trapdoor.png", + tile_side = "naturalbiomes_juniper_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:juniper_trapdoor 2", + recipe = { + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood"}, + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_trunk", "naturalbiomes:heath_juniper_wood"}, + } +}) + +doors.register("naturalbiomes_juniper_door", { + tiles = {{ name = "naturalbiomes_juniper_door.png", backface_culling = true }}, + description = S"Juniper Door", + inventory_image = "naturalbiomes_item_juniper_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood"}, + {"naturalbiomes:heath_juniper_trunk", "naturalbiomes:heath_juniper_trunk"}, + {"naturalbiomes:heath_juniper_wood", "naturalbiomes:heath_juniper_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:medpine_trapdoor", { + description = S"Mediterranean Pine Trapdoor", + inventory_image = "naturalbiomes_medpine_trapdoor.png", + wield_image = "naturalbiomes_medpine_trapdoor.png", + tile_front = "naturalbiomes_medpine_trapdoor.png", + tile_side = "naturalbiomes_medpine_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:medpine_trapdoor 2", + recipe = { + {"naturalbiomes:pine_wood", "naturalbiomes:pine_wood", "naturalbiomes:pine_wood"}, + {"naturalbiomes:pine_wood", "naturalbiomes:pine_trunk", "naturalbiomes:pine_wood"}, + } +}) + +doors.register("naturalbiomes_medpine_door", { + tiles = {{ name = "naturalbiomes_medpine_door.png", backface_culling = true }}, + description = S"Mediterranean Pine Door", + inventory_image = "naturalbiomes_item_medpine_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:pine_wood", "naturalbiomes:pine_wood"}, + {"naturalbiomes:pine_trunk", "naturalbiomes:pine_trunk"}, + {"naturalbiomes:pine_wood", "naturalbiomes:pine_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:olive_trapdoor", { + description = S"Olive Trapdoor", + inventory_image = "naturalbiomes_olive_trapdoor.png", + wield_image = "naturalbiomes_olive_trapdoor.png", + tile_front = "naturalbiomes_olive_trapdoor.png", + tile_side = "naturalbiomes_olive_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:olive_trapdoor 2", + recipe = { + {"naturalbiomes:olive_wood", "naturalbiomes:olive_wood", "naturalbiomes:olive_wood"}, + {"naturalbiomes:olive_wood", "naturalbiomes:olive_trunk", "naturalbiomes:olive_wood"}, + } +}) + +doors.register("naturalbiomes_olive_door", { + tiles = {{ name = "naturalbiomes_olive_door.png", backface_culling = true }}, + description = S"Olive Door", + inventory_image = "naturalbiomes_item_olive_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:olive_wood", "naturalbiomes:olive_wood"}, + {"naturalbiomes:olive_trunk", "naturalbiomes:olive_trunk"}, + {"naturalbiomes:olive_wood", "naturalbiomes:olive_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:eucalyptus_trapdoor", { + description = S"Eucalyptus Trapdoor", + inventory_image = "naturalbiomes_outback_trapdoor.png", + wield_image = "naturalbiomes_outback_trapdoor.png", + tile_front = "naturalbiomes_outback_trapdoor.png", + tile_side = "naturalbiomes_outback_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:eucalyptus_trapdoor 2", + recipe = { + {"naturalbiomes:outback_wood", "naturalbiomes:outback_wood", "naturalbiomes:outback_wood"}, + {"naturalbiomes:outback_wood", "naturalbiomes:outback_trunk", "naturalbiomes:outback_wood"}, + } +}) + +doors.register("naturalbiomes_eucalyptus_door", { + tiles = {{ name = "naturalbiomes_outback_door.png", backface_culling = true }}, + description = S"Eucalyptus Door", + inventory_image = "naturalbiomes_item_outback_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:outback_wood", "naturalbiomes:outback_wood"}, + {"naturalbiomes:outback_trunk", "naturalbiomes:outback_trunk"}, + {"naturalbiomes:outback_wood", "naturalbiomes:outback_wood"}, + } +}) + +doors.register_trapdoor("naturalbiomes:willow_trapdoor", { + description = S"Willow Trapdoor", + inventory_image = "naturalbiomes_willow_trapdoor.png", + wield_image = "naturalbiomes_willow_trapdoor.png", + tile_front = "naturalbiomes_willow_trapdoor.png", + tile_side = "naturalbiomes_willow_trapdoor_side.png", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, + gain_open = 0.06, + gain_close = 0.13, + +}) + +minetest.register_craft({ + output = "naturalbiomes:willow_trapdoor 2", + recipe = { + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood"}, + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_trunk", "naturalbiomes:heath_willow_wood"}, + } +}) + +doors.register("naturalbiomes_willow_door", { + tiles = {{ name = "naturalbiomes_willow_door.png", backface_culling = true }}, + description = S"Willow Door", + inventory_image = "naturalbiomes_item_willow_door.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood"}, + {"naturalbiomes:heath_willow_trunk", "naturalbiomes:heath_willow_trunk"}, + {"naturalbiomes:heath_willow_wood", "naturalbiomes:heath_willow_wood"}, + } +}) \ No newline at end of file diff --git a/mods/naturalbiomes/depends.txt b/mods/naturalbiomes/depends.txt new file mode 100644 index 0000000..1e9ce49 --- /dev/null +++ b/mods/naturalbiomes/depends.txt @@ -0,0 +1,7 @@ +default +stairs +doors +xpanes +bonemeal? +hunger_ng? +ethereal? diff --git a/mods/naturalbiomes/description.txt b/mods/naturalbiomes/description.txt new file mode 100644 index 0000000..6216af1 --- /dev/null +++ b/mods/naturalbiomes/description.txt @@ -0,0 +1 @@ +Adds 7 new biomes to your Minetest Game world. \ No newline at end of file diff --git a/mods/naturalbiomes/dye.lua b/mods/naturalbiomes/dye.lua new file mode 100644 index 0000000..908654b --- /dev/null +++ b/mods/naturalbiomes/dye.lua @@ -0,0 +1,127 @@ +local S = minetest.get_translator("naturalbiomes") + +minetest.register_craft({ + output = "dye:yellow 2", + recipe = { + {"naturalbiomes:alderswamp_yellowflower"} + }, +}) + +minetest.register_craft({ + output = "dye:orange 2", + recipe = { + {"naturalbiomes:alpine_dandelion"} + }, +}) + +minetest.register_craft({ + output = "dye:red 2", + recipe = { + {"naturalbiomes:cowberry"} + }, +}) + +minetest.register_craft({ + output = "dye:white 2", + recipe = { + {"naturalbiomes:alpine_edelweiss"} + }, +}) + +minetest.register_craft({ + output = "dye:pink 2", + recipe = { + {"naturalbiomes:med_flower1"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"naturalbiomes:med_flower3"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"naturalbiomes:med_grass2"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"naturalbiomes:med_grass1"} + }, +}) + +minetest.register_craft({ + output = "dye:orange 2", + recipe = { + {"naturalbiomes:outback_grass6"} + }, +}) + +minetest.register_craft({ + output = "dye:brown 2", + recipe = { + {"naturalbiomes:savanna_flowergrass"} + }, +}) + +minetest.register_craft({ + output = "dye:green 2", + recipe = { + {"naturalbiomes:palmbeach_grass1"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"naturalbiomes:heatherflower"} + }, +}) + +minetest.register_craft({ + output = "dye:magenta 2", + recipe = { + {"naturalbiomes:heatherflower2"} + }, +}) + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"naturalbiomes:heatherflower3"} + }, +}) + +minetest.register_craft({ + output = "dye:pink 2", + recipe = { + {"naturalbiomes:heatherflower4"} + }, +}) + +minetest.register_craft({ + output = "dye:white 2", + recipe = { + {"naturalbiomes:med_flower2"} + }, +}) + +minetest.register_craft({ + output = "dye:grey 2", + recipe = { + {"naturalbiomes:outback_grass5"} + }, +}) + +minetest.register_craft({ + output = "dye:dark_green 2", + recipe = { + {"naturalbiomes:outback_grass2"} + }, +}) \ No newline at end of file diff --git a/mods/naturalbiomes/heath.lua b/mods/naturalbiomes/heath.lua new file mode 100644 index 0000000..08dbbe4 --- /dev/null +++ b/mods/naturalbiomes/heath.lua @@ -0,0 +1,1268 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:heath_litter", { + description = S("Heath sand with dirt"), + tiles = {"naturalbiomes_heath_litter.png", "default_sand.png", + {name = "default_sand.png^naturalbiomes_heath_litter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:heath_litter2", { + description = S("Heath sand with dirt"), + tiles = {"naturalbiomes_heath_litter2.png", "default_sand.png", + {name = "default_sand.png^naturalbiomes_heath_litter_side2.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + noise_params = { + offset = -0, + scale = 0.5, + spread = {x = 50, y = 50, z = 50}, + seed = 5792, + octaves = 6, + persist = 1, + }, + y_max = 60, + y_min = 5, + decoration = "naturalbiomes:heath_litter3" + }) + +minetest.register_node("naturalbiomes:heath_litter3", { + description = S("Heath sand with dirt"), + tiles = {"naturalbiomes_heath_litter3.png", "default_sand.png", + {name = "default_sand.png^naturalbiomes_heath_litter_side3.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:sand", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + place_offset_y = -1, + flags = "force_placement", + noise_params = { + offset = -0, + scale = 2, + spread = {x = 100, y = 100, z = 100}, + seed = 1874, + octaves = 11, + persist = 1, + }, + y_max = 60, + y_min = 5, + decoration = "naturalbiomes:heath_litter2" + }) + +minetest.register_biome({ + name = "naturalbiomes:heath", + node_top = "naturalbiomes:heath_litter", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 50, + y_min = 0, + heat_point = 47, + humidity_point = 89, +}) + + minetest.register_decoration({ + name = "naturalbiomes:heath_grass", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.04115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heath_grass", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heath_grass", { + description = S"Heath Grass", + drawtype = "plantlike", + waving = 2, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_grass.png"}, + inventory_image = "naturalbiomes_heath_grass.png", + wield_image = "naturalbiomes_heath_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + fill_ratio = 0.06115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heath_grass2", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heath_grass2", { + description = S"Heath Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_grass2.png"}, + inventory_image = "naturalbiomes_heath_grass2.png", + wield_image = "naturalbiomes_heath_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heath_grass3", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heath_grass3", { + description = S"Heath Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_grass3.png"}, + inventory_image = "naturalbiomes_heath_grass3.png", + wield_image = "naturalbiomes_heath_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower", { + description = S"Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_heatherflower.png"}, + inventory_image = "naturalbiomes_heath_heatherflower.png", + wield_image = "naturalbiomes_heath_heatherflower.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower2", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower2", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower2", { + description = S"Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_heatherflower2.png"}, + inventory_image = "naturalbiomes_heath_heatherflower2.png", + wield_image = "naturalbiomes_heath_heatherflower2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower3", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower3", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower3", { + description = S"Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.5, + tiles = {"naturalbiomes_heath_heatherflower3.png"}, + inventory_image = "naturalbiomes_heath_heatherflower3.png", + wield_image = "naturalbiomes_heath_heatherflower3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower4", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + fill_ratio = 0.04115, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower4", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower4", { + description = S"Heather Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.5, + tiles = {"naturalbiomes_heath_heatherflower4.png"}, + inventory_image = "naturalbiomes_heath_heatherflower4.png", + wield_image = "naturalbiomes_heath_heatherflower4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:swampgrass", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = -1, + decoration = "naturalbiomes:swampgrass", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:swampgrass", { + description = S"Swamp Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_swampgrass.png"}, + inventory_image = "naturalbiomes_heath_swampgrass.png", + wield_image = "naturalbiomes_heath_swampgrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:swampgrass2", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter"}, + sidelen = 16, + fill_ratio = 0.08115, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = -1, + decoration = "naturalbiomes:swampgrass2", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:swampgrass2", { + description = S"Swamp Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_heath_swampgrass2.png"}, + inventory_image = "naturalbiomes_heath_swampgrass2.png", + wield_image = "naturalbiomes_heath_swampgrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +-- Tree generation +-- + +-- New willow tree + +local function grow_new_willow_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_willowtree11.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:willow_sapling", grow_new_willow_tree, "soil"}, +}) +end + +-- willow trunk +minetest.register_node("naturalbiomes:heath_willow_trunk", { + description = S("Willow Trunk"), + tiles = { + "naturalbiomes_heath_willow_trunk_top.png", + "naturalbiomes_heath_willow_trunk_top.png", + "naturalbiomes_heath_willow_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- willow wood +minetest.register_node("naturalbiomes:heath_willow_wood", { + description = S("Willow Wood"), + tiles = {"naturalbiomes_heath_willow_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:heath_willow_wood 4", + recipe = {{"naturalbiomes:heath_willow_trunk"}} +}) + +minetest.register_node("naturalbiomes:heath_willow_leaves", { + description = S("Willow Leaves"), + drawtype = "plantlike", + visual_scale = 4.0, + waving = 1, + tiles = {"naturalbiomes_heath_willow_leaves.png"}, + special_tiles = {"naturalbiomes_heath_willow_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:willow_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_willow_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:heath_willow_leaves2", { + description = S("Willow Leaves"), + drawtype = "allfaces_optional", + visual_scale = 1.0, + waving = 1, + tiles = {"naturalbiomes_heath_willow_leaves2.png"}, + special_tiles = {"naturalbiomes_heath_willow_leaves2.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:willow_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_willow_leaves2'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:willow_sapling", { + description = S("Willow Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_heath_willow_sapling.png"}, + inventory_image = "naturalbiomes_heath_willow_sapling.png", + wield_image = "naturalbiomes_heath_willow_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_willow_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:willow_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_heath_willow_wood", + "naturalbiomes:heath_willow_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_willow_wood.png"}, + S("Willow Stair"), + S("Willow Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_heath_willow_trunk", + "naturalbiomes:heath_willow_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_willow_trunk_top.png", "naturalbiomes_heath_willow_trunk_top.png", "naturalbiomes_heath_willow_trunk.png"}, + S("Willow Trunk Stair"), + S("Willow Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_willow_wood", + { + description = S("Willow Wood Fence Gate"), + texture = "naturalbiomes_heath_willow_wood.png", + material = "naturalbiomes:heath_willow_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_willow_wood", + { + description = S("Willow Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_heath_willow_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_heath_willow_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_willow_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_willow_wood", + { + description = S("Willow Fence Rail"), + texture = "naturalbiomes_heath_willow_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_heath_willow_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_heath_willow_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_willow_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:heath_willow_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00515, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_willowtree11.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_willow_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00515, + biomes = {"naturalbiomes:heath"}, + y_max = 5, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_willowtree22.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- New juniper tree + +local function grow_new_juniper_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_junipertree.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:juniper_sapling", grow_new_juniper_tree, "soil"}, +}) +end + +-- juniper trunk +minetest.register_node("naturalbiomes:heath_juniper_trunk", { + description = S("Juniper Trunk"), + tiles = { + "naturalbiomes_heath_juniper_trunk_top.png", + "naturalbiomes_heath_juniper_trunk_top.png", + "naturalbiomes_heath_juniper_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- juniper wood +minetest.register_node("naturalbiomes:heath_juniper_wood", { + description = S("Juniper Wood"), + tiles = {"naturalbiomes_heath_juniper_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:heath_juniper_wood 4", + recipe = {{"naturalbiomes:heath_juniper_trunk"}} +}) + +minetest.register_node("naturalbiomes:heath_juniper_leaves", { + description = S("Juniper Leaves"), + drawtype = "allfaces_optional", + visual_scale = 1.0, + waving = 1, + tiles = {"naturalbiomes_heath_juniper_leaves.png"}, + special_tiles = {"naturalbiomes_heath_juniper_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:juniper_sapling'}, + rarity = 6, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_juniper_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:juniper_sapling", { + description = S("Juniper Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_heath_juniper_sapling.png"}, + inventory_image = "naturalbiomes_heath_juniper_sapling.png", + wield_image = "naturalbiomes_heath_juniper_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_juniper_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:juniper_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_heath_juniper_wood", + "naturalbiomes:heath_juniper_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_juniper_wood.png"}, + S("Juniper Stair"), + S("Juniper Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_heath_juniper_trunk", + "naturalbiomes:heath_juniper_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_juniper_trunk_top.png", "naturalbiomes_heath_juniper_trunk_top.png", "naturalbiomes_heath_juniper_trunk.png"}, + S("Juniper Trunk Stair"), + S("Juniper Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_juniper_wood", + { + description = S("Juniper Wood Fence Gate"), + texture = "naturalbiomes_heath_juniper_wood.png", + material = "naturalbiomes:heath_juniper_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_juniper_wood", + { + description = S("Juniper Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_heath_juniper_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_heath_juniper_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_juniper_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_juniper_wood", + { + description = S("Juniper Fence Rail"), + texture = "naturalbiomes_heath_juniper_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_heath_juniper_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_heath_juniper_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_juniper_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:heath_juniper_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter3"}, + place_offset_y = 1, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:heath"}, + y_max = 50, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_junipertree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_juniper_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter3"}, + place_offset_y = 1, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:heath"}, + y_max = 50, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_junipertree2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- New birch tree + +local function grow_new_birch_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_birchtree.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:birch_sapling", grow_new_birch_tree, "soil"}, +}) +end + +-- birch trunk +minetest.register_node("naturalbiomes:heath_birch_trunk", { + description = S("Birch Trunk"), + tiles = { + "naturalbiomes_heath_birch_trunk_top.png", + "naturalbiomes_heath_birch_trunk_top.png", + "naturalbiomes_heath_birch_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- birch wood +minetest.register_node("naturalbiomes:heath_birch_wood", { + description = S("Birch Wood"), + tiles = {"naturalbiomes_heath_birch_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:heath_birch_wood 4", + recipe = {{"naturalbiomes:heath_birch_trunk"}} +}) + +minetest.register_node("naturalbiomes:heath_birch_leaves", { + description = S("Birch Leaves"), + drawtype = "allfaces_optional", + visual_scale = 1.0, + waving = 1, + tiles = {"naturalbiomes_heath_birch_leaves.png"}, + special_tiles = {"naturalbiomes_heath_birch_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:birch_sapling'}, + rarity = 40, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:heath_birch_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:birch_sapling", { + description = S("Birch Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_heath_birch_sapling.png"}, + inventory_image = "naturalbiomes_heath_birch_sapling.png", + wield_image = "naturalbiomes_heath_birch_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_birch_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:birch_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + + + + + stairs.register_stair_and_slab( + "naturalbiomes_heath_birch_wood", + "naturalbiomes:heath_birch_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_birch_wood.png"}, + S("Birch Stair"), + S("Birch Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_heath_birch_trunk", + "naturalbiomes:heath_birch_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_heath_birch_trunk_top.png", "naturalbiomes_heath_birch_trunk_top.png", "naturalbiomes_heath_birch_trunk.png"}, + S("Birch Trunk Stair"), + S("Birch Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_birch_wood", + { + description = S("Birch Wood Fence Gate"), + texture = "naturalbiomes_heath_birch_wood.png", + material = "naturalbiomes:heath_birch_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_birch_wood", + { + description = S("Birch Fence"), + texture = "naturalbiomes_adler_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_heath_birch_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_heath_birch_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_birch_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_birch_wood", + { + description = S("Birch Fence Rail"), + texture = "naturalbiomes_heath_birch_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_heath_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_heath_birch_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:heath_birch_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:heath_birch_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter3"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:heath"}, + y_max = 50, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_birchtree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:heath_birch_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter3"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00315, + biomes = {"naturalbiomes:heath"}, + y_max = 50, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_birchtree2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflowernode", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0, + scale = 0.6, + spread = {x = 150, y = 150, z = 150}, + seed = 1456, + octaves = 8, + persist = 1, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflowernode", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflowernode", { + description = S"Heather Flower Node", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_heath_heatherflowernode.png"}, + inventory_image = "naturalbiomes_heath_heatherflowernode.png", + wield_image = "naturalbiomes_heath_heatherflowernode.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower2node", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0, + scale = 0.6, + spread = {x = 150, y = 150, z = 150}, + seed = 7358, + octaves = 8, + persist = 1, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower2node", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower2node", { + description = S"Heather Flower Node", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1, + tiles = {"naturalbiomes_heath_heatherflower2node.png"}, + inventory_image = "naturalbiomes_heath_heatherflower2node.png", + wield_image = "naturalbiomes_heath_heatherflower2node.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower3node", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0, + scale = 0.6, + spread = {x = 150, y = 150, z = 150}, + seed = 2935, + octaves = 8, + persist = 1, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower3node", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower3node", { + description = S"Heather Flower Node", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1, + tiles = {"naturalbiomes_heath_heatherflower3node.png"}, + inventory_image = "naturalbiomes_heath_heatherflower3node.png", + wield_image = "naturalbiomes_heath_heatherflower3node.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heatherflower4node", + deco_type = "simple", + place_on = {"naturalbiomes:heath_litter2"}, + sidelen = 16, + place_offset_y = 0, + flags = "force_placement", + noise_params = { + offset = -0, + scale = 0.6, + spread = {x = 150, y = 150, z = 150}, + seed = 989, + octaves = 8, + persist = 1, + }, + y_max = 31000, + y_min = 4, + decoration = "naturalbiomes:heatherflower4node", + spawn_by = "naturalbiomes:heath_litter" + }) + +minetest.register_node("naturalbiomes:heatherflower4node", { + description = S"Heather Flower Node", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1, + tiles = {"naturalbiomes_heath_heatherflower4node.png"}, + inventory_image = "naturalbiomes_heath_heatherflower4node.png", + wield_image = "naturalbiomes_heath_heatherflower4node.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_stoneformation", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter", "naturalbiomes:heath_litter2"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00007, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_heath_stoneformation.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_stoneformation2", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter", "naturalbiomes:heath_litter2"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00007, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_heath_stoneformation2.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:heath_stoneformation3", + deco_type = "schematic", + place_on = {"naturalbiomes:heath_litter", "naturalbiomes:heath_litter2"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00007, + biomes = {"naturalbiomes:heath"}, + y_max = 31000, + y_min = 5, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_heath_stoneformation3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:heath_litter", {"naturalbiomes:heath_grass", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:heatherflower", "naturalbiomes:heatherflower2", "naturalbiomes:heatherflower3", "naturalbiomes:heatherflower4", "naturalbiomes:swampgrass", "naturalbiomes:swampgrass2"}, {}} + }) +end + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:heath_litter2", {"naturalbiomes:heath_grass", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:heatherflower", "naturalbiomes:heatherflower2", "naturalbiomes:heatherflower3", "naturalbiomes:heatherflower4"}, {}} + }) +end + diff --git a/mods/naturalbiomes/hunger.lua b/mods/naturalbiomes/hunger.lua new file mode 100644 index 0000000..101a01c --- /dev/null +++ b/mods/naturalbiomes/hunger.lua @@ -0,0 +1,42 @@ +if minetest.get_modpath("hunger_ng") ~= nil then + hunger_ng.add_hunger_data('naturalbiomes:alpine_mushroom', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:olives', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:coconut', { + satiates = 3.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:coconut_slice', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:banana', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:banana_bunch', { + satiates = 5.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:cowberry', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:blackberry', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:wildrose', { + satiates = 1.0, + }) + + hunger_ng.add_hunger_data('naturalbiomes:hazelnut_cracked', { + satiates = 2.0, + }) + +end diff --git a/mods/naturalbiomes/init.lua b/mods/naturalbiomes/init.lua new file mode 100644 index 0000000..04ce3ad --- /dev/null +++ b/mods/naturalbiomes/init.lua @@ -0,0 +1,49 @@ +--This creates the naturalbiomes object. +naturalbiomes = {} + +--This creates the naturalbiomes.settings object, and fills it with either the menu selected choices as defined in settingtypes.txt, or default values, (In this case, false). +naturalbiomes.settings = { + clear_biomes = minetest.settings:get_bool("naturalbiomes.clear_biomes") or false, + clear_decos = minetest.settings:get_bool("naturalbiomes.clear_decos") or false, + clear_ores = minetest.settings:get_bool("naturalbiomes.clear_ores") or false, +} + +if naturalbiomes.settings.clear_biomes then + minetest.clear_registered_biomes() +end +if naturalbiomes.settings.clear_decos then + minetest.clear_registered_decorations() +end +if naturalbiomes.settings.clear_ores then + minetest.clear_registered_ores() +end + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("naturalbiomes") or + dofile(path .. "intllib.lua") + + +-- biomes + +dofile(path .. "wetsavanna.lua") -- +dofile(path .. "alderswamp.lua") -- +dofile(path .. "alpine.lua") -- +dofile(path .. "bambooforest.lua") -- +dofile(path .. "palmbeach.lua") -- +dofile(path .. "outback.lua") -- +dofile(path .. "mediterranean.lua") -- +dofile(path .. "crafting.lua") -- +dofile(path .. "heath.lua") -- +dofile(path .. "dye.lua") -- +dofile(path .. "bushland.lua") -- +dofile(path .. "leafdecay.lua") -- +dofile(path .. "hunger.lua") -- + + + diff --git a/mods/naturalbiomes/intllib.lua b/mods/naturalbiomes/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/naturalbiomes/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/naturalbiomes/leafdecay.lua b/mods/naturalbiomes/leafdecay.lua new file mode 100644 index 0000000..58e541f --- /dev/null +++ b/mods/naturalbiomes/leafdecay.lua @@ -0,0 +1,114 @@ + +default.register_leafdecay({ + trunks = {"naturalbiomes:alder_trunk"}, + leaves = {"naturalbiomes:alder_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:alppine1_trunk"}, + leaves = {"naturalbiomes:alppine1_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:alppine2_trunk"}, + leaves = {"naturalbiomes:alppine2_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bamboo_trunk"}, + leaves = {"naturalbiomes:bamboo_leaves"}, + radius = 4 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:banana_trunk"}, + leaves = {"naturalbiomes:banana_leaves", "naturalbiomes:banana", "naturalbiomes:banana_bunch"}, + radius = 4 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:olive_trunk"}, + leaves = {"naturalbiomes:olive_leaves", "naturalbiomes:olives"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:pine_trunk"}, + leaves = {"naturalbiomes:pine_leaves"}, + radius = 8 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:med_bush_stem"}, + leaves = {"naturalbiomes:med_bush_leaves"}, + radius = 16 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:outback_trunk"}, + leaves = {"naturalbiomes:outback_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:outback_bush_stem"}, + leaves = {"naturalbiomes:outback_bush_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:palm_trunk"}, + leaves = {"naturalbiomes:palm_leaves", "naturalbiomes:coconut"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:beach_bush_stem"}, + leaves = {"naturalbiomes:beach_bush_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:acacia_trunk"}, + leaves = {"naturalbiomes:acacia_leaves"}, + radius = 7 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:heath_willow_trunk"}, + leaves = {"naturalbiomes:heath_willow_leaves2"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:heath_juniper_trunk"}, + leaves = {"naturalbiomes:heath_juniper_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:heath_birch_trunk"}, + leaves = {"naturalbiomes:heath_birch_leaves"}, + radius = 6 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bushland_hazelnut_stem"}, + leaves = {"naturalbiomes:bushland_hazelnut_leaves", "naturalbiomes:bushland_hazelnut_leaves2"}, + radius = 4 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bushland_wildrose_stem"}, + leaves = {"naturalbiomes:bushland_wildrose_leaves2", "naturalbiomes:bushland_wildrose_leaves"}, + radius = 4 +}) + +default.register_leafdecay({ + trunks = {"naturalbiomes:bushland_blackberry_stem"}, + leaves = {"naturalbiomes:bushland_blackberry_leaves2", "naturalbiomes:bushland_blackberry_leaves"}, + radius = 4 +}) diff --git a/mods/naturalbiomes/locale/naturalbiomes.de.tr b/mods/naturalbiomes/locale/naturalbiomes.de.tr new file mode 100644 index 0000000..e814cee --- /dev/null +++ b/mods/naturalbiomes/locale/naturalbiomes.de.tr @@ -0,0 +1,280 @@ +# textdomain: naturalbiomes + +Alder Swamp dirt with Grass=Erlensumpfschlamm mit Gras +Alder Swamp Dirt=Erlensumpfschlamm +Alder Trunk=Erlenstamm +Alder Wood=Erlenholz +Alder Leaves=Erlenblätter +Alder Sapling=Erlensetzling +Alder Stair=Erlenholztreppe +Alder Slab=Erlenholzplatte +Alder Trunk Stair=Erlenstamm Treppe +Alder Trunk Slab=Erlenstamm Platte +Alder Wood Fence Gate=Erlenholz Zauntor +Alder Fence=Erlenzaun +Alder Fence Rail=Erlenholz Geländer +Alderswamp reed=Erlensumpf Schilf +Waterlily=Kleine Seerosen +Alderswamp flower=Sumpfdotterblume +Dirt with Alpine Grass=Dreck mit Alpinem Gras +Alpine Rock=Alpiner Stein +Silver Fir Trunk=Weißtannenstamm +Silver Fir Wood=Weißtannenholz +Silver Fir Leaves=Weißtannen Nadeln +Silver Fir Sapling=Weißtannensetzling +Silver Fir Stair=Weißtannentreppe +Silver Fir Slab=Weißtannenplatte +Silver Fir Trunk Stair=Weißtannen Stamm Treppe +Silver Fir Trunk Slab=Weißtannen Stamm Platte +Silver Fir Wood Fence Gate=Weißtannen Holzzauntor +Silver Fir Fence=Weißtannenzaun +Silver Fir Fence Rail=Weißtannengeländer +Jack Pine Trunk=Banks Kiefer Stamm +Jack Pine Wood=Banks Kiefer Holz +Jack Pine Leaves=Banks Kiefer Nadeln +Jack Pine Sapling=Banks Kiefer Setzling +Jack Pine Stair=Banks Kiefer Holztreppe +Jack Pine Slab=Banks Kiefer Holzplatte +Jack Pine Trunk Stair=Banks Kiefer Stamm Treppe +Jack Pine Trunk Slab=Banks Kiefer Stamm Platte +Jack Pine Wood Fence Gate=Banks Kiefer Holzzauntor +Jack Pine Fence=Banks Kiefer Holzzaun +Jack Pine Fence Rail=Banks Kiefer Geländer +Cowberry Bush Stem=Preiselbeerstamm +Cowberry Bush Leaves=Preiselbeerblätter +Cowberry Bush Sapling=Preiselbeer Setzling +Cowberry=Preiselbeeren +Alpine Mushroom=Alpiner Pilz +Alpine Grass=Alpines Gras +Alpine Dandelion Flower=Alpiner Löwenzahn +Edelweiss Flower=Eidelweiss +Bamboo Forest Litter=Bumbuswald Boden +Bamboo Trunk=Bambusstamm +Bamboo Wood=Bambusholz +Bamboo Leaves=Bambusblätter +Bamboo Sapling=Bambussetzling +Bamboo Stair=Bambus Holztreppe +Bamboo Slab=Bambus Holzplatte +Bamboo Trunk Stair=Bambus Stammtreppe +Bamboo Trunk Slab=Bambus Stammplatte +Bamboo Wood Fence Gate=Bambus Holzzauntor +Bamboo Fence=Bambuszaun +Bamboo Fence Rail=Bambusgeländer +Small Bamboo Grass=Kleiner Bambus +Bamboo Forest Rock=Bambuswald Fels +Babmooforest Gorund Grass=Bambuswald Bodenbewuchs +Banana Trunk=Bananenstamm +Banana Wood=Bananenholz +Banana Leaves=Bananenwedel +Banana Sapling=Bananensetzling +Banana Stair=Bananenholz Treppe +Banana Slab=Bananenholz Platte +Banana Trunk Stair=Bananenstamm Streppe +Banana Trunk Slab=Bananenstamm Platte +Banana Wood Fence Gate=Bananen Holzzauntor +Banana Fence=Bananenzaun +Banana Fence Rail=Bananengeländer +Reed Bundle Stair=Schilfbündeltreppe +Reed Bundle Slab=Schilfbündelplatte +Alpine Brick Stair=Alpine Ziegeltreppe +Alpine Brick Slab=Alpine Ziegelplatte +Bamboo Brick Stair=Bambuswald Ziegeltreppe +Bamboo Brick Slab=Bambuswald Ziegelplatte +Beach Brick Stair=Strandziegel Treppe +Beach Brick Slab=Strandziegel Platte +Med Brick Stair=Mediterrane Ziegeltreppe +Med Brick Slab=Mediterrane Ziegelplatte +Outback Brick Stair=Outback Ziegeltreppe +Outback Brick Slab=Outback Ziegelplatte +Alpine Brick Wall=Alpine Ziegelmauer +Bambooforest Wall=Bambuswald Ziegelmauer +Mediterranean Wall=Mediterrane Ziegelmauer +Outback Wall=Outback Ziegelmauer +Palmbeach Wall=Strand Ziegelmauer +Reed Bundle=Schilfbündel +Alpine Brick=Alpine Ziegel +Bambooforest Brick=Bambuswald Ziegel +Beach Brick=Strandziegel +Meditteranean Brick=Mediterrane Ziegel +Outback Brick=Outback Ziegel +Heath sand with dirt=Heidesand mit Dreck +Heath Grass=Heidegras +Heather Flower=Heideblume +Swamp Grass=Sumpfgras +Willow Trunk=Weidenstamm +Willow Wood=Weidenholz +Willow Leaves=Weidenblätter +Willow Sapling=Weidensetzling +Willow Stair=Weidenholztreppe +Willow Slab=Weidenholzplatte +Willow Trunk Stair=Weidenstamm Treppe +Willow Trunk Slab=Weidenstamm Platte +Willow Wood Fence Gate=Weiden Holzzauntor +Willow Fence=Weidenholzzaun +Willow Fence Rail=Weidengeländer +Juniper Trunk=Wacholder Stamm +Juniper Wood=Wacholder Holz +Juniper Leaves=Wacholder Nadeln +Juniper Sapling=Wacholder Setzling +Juniper Stair=Wacholder Treppe +Juniper Slab=Wacholder Platte +Juniper Trunk Stair=Wacholder Stammtreppe +Juniper Trunk Slab=Wacholder Stammplatte +Juniper Wood Fence Gate=Wacholder Holzzauntor +Juniper Fence=Wacholderzaun +Juniper Fence Rail= Wacholder Geländer +Birch Trunk=Birkenstamm +Birch Wood=Birkenholz +Birch Leaves=Birkenblätter +Birch Sapling=Birkensetzling +Birch Stair=Birkenholz Treppe +Birch Slab=Birkenholz Platte +Birch Trunk Stair=Birkenstamm Treppe +Birch Trunk Slab=Birkenstamm Platte +Birch Wood Fence Gate=Birken Zauntor +Birch Fence=Birkenzaun +Birch Fence Rail=Birkengeländer +Heather Flower Node=Heidekrautblock +Mediterranean litter with grass=Mediterraner Boden mit Gras +Mediterranean Rock=Mediterraner Fels +Mediterranean Ruin=Mediterrane Ruine +Mediterranean Ruin Column=Mediterrane Säule +Olive Trunk=Olivenstamm +Olive Wood=Olivenholz +Olive Leaves=Olivenblätter +Olive Sapling=Olivensetzling +Olive Stair=Olivenholz Treppe +Olive Slab=Olivenholz Platte +Alder Trunk Stair=Olivenstamm Treppe +Alder Trunk Slab=Olivenstamm Platte +Olive Wood Fence Gate=Oliven Holzzauntor +Olive Fence=Olivenzaun +Olive Fence Rail=Olivengeländer +Mediterranean Pine Trunk=Mediterraner Kiefernstamm +Mediterranean Pine Wood=Mediterranes Kiefernholz +Mediterranean Pine Leaves=Mediterrane Kiefernnadeln +Mediterranean Pine Sapling=Mediterraner Kiefernsetzling +Mediterranean Pine Stair=Mediterrane Kiefernholz Treppe +Mediterranean Pine Slab=Mediterrane Kiefernholz Platte +Mediterranean Pine Trunk Stair=Mediterrane Kiefernstamm Treppe +Mediterranean Pine Trunk Slab=Mediterrane Kiefernstamm Platte +Mediterranean Pine Wood Fence Gate=Mediterranes Kiefernholztor +Mediterranean Pine Fence=Mediterraner Kiefernzaun +Mediterranean Pine Fence Rail=Mediterranes Kieferngeländer +Cypress Bush Stem=Zypressenstamm +Cypress Bush Leaves=Zypressennadeln +Cypress Bush Sapling=Zypressensetzling +Mediterranean Flower=Mediterrane Blume +Lavender=Lavendel +Mediterranean Grass=Mediterranes Gras +Fresh Olives=Frische Oliven +Outback ground with grass=Outback Boden +Outback Rock=Outback Fels +Outback Ground Sand=Outback Bodensand +Outback Eucalyptus Trunk=Eukalyptus Stamm +Outback Eucalyptus Wood=Eukalyptus Holz +Outback Eucalyptus Leaves=Eukalyptus Blätter +Outback Eucalyptus Sapling=Eukalyptus Setzling +Outback Eucalyptus Stair=Eukalyptus Holztreppe +Outback Eucalyptus Slab=Eukalyptus Holzplatte +Outback Eucalyptus Trunk Stair=Eukalyptus Stammtreppe +Outback Eucalyptus Trunk Slab=Eukalyptus Stammplatte +Outback Eucalyptus Wood Fence Gate=Eukalyptus Holzzauntor +Outback Eucalyptus Fence=Eukalyptus Zaun +Outback Eucalyptus Fence Rail=Eukalyptus Geländer +Outback Bush Stem=Outback Buschstamm +Outback Bush Leaves=Outback Buschblätter +Outback Bush Sapling=Outback Buschsetzling +Outback Grass=Outback Gras +Outback Rock Formation=Outback Fels +Beach Sand=Strandsand +Beach Rock=Strandfels +Coconut Palm Trunk=Kokospalmen Stamm +Coconut Palm Wood=Kokospalmen Holz +Coconut Palm Leaves=Kokospalmen Wedel +Coconut Palm Sapling=Kokospalmen Setzling +Coconut Palm Stair=Kokospalmen Holztreppe +Coconut Palm Slab=Kokospalmen Holzplatte +Coconut Palm Trunk Stair=Kokospalmen Stammtreppe +Coconut Palm Trunk Slab=Kokospalmen Stammplatte +Coconut Palm Wood Fence Gate=Kokospalmen Holzzauntor +Coconut Palm Fence=Kokospalmenzaun +Coconut Palm Fence Rail=Kokospalmengeländer +Beach Bush Stem=Strandbuschstamm +Beach Bush Leaves=Strandbuschblätter +Beach Bush Sapling=Strandbuschsetzling +Palmbeach Grass=Strandgras +Banana Bunch=Bananenstaude +Banana=Banane +Coconut Slice=Kokosnusstück +Coconut=Kokosnuss +Wet Savanna dirt with Grass=Feuchtsavannenboden mit Gras +Acacia Trunk=Akazienstamm +Acacia Wood=Akazienholz +Acacia Leaves=Akazienblätter +Acacia Sapling=Akaziensetzling +Acacia Stair=Akazien Holztreppe +Acacia Slab=Akazien Holzplatte +Acacia Trunk Stair=Akazien Stammtreppe +Acacia Trunk Slab=Akazien Stammplatte +Acacia Wood Fence Gate=Akazien Holzzauntor +Acacia Fence=Akazienzaun +Acacia Fence Rail=Akaziengeländer +Savanna Grass=Savannengras +Savanna Flowergrass=Savannen Blumengras +Bushland Litter=Buschland Boden +Bushland Grass=Buschland Gras +Blackberry Bush Stem=Brombeerbusch Stamm +Blackberry Bush Leaves=Brombeerblätter +Blackberry Bush Sapling=Brombeerbusch Setzling +Blackberry=Brombeere +Wildrose Bush Stem=Wildrosenbusch Stamm +Wildrose Bush Leaves=Wildrosenbusch Blätter +Wildrose Bush Sapling=Wildrosenbusch Setzling +Wildrose=Hagebutte +Hazelnut Bush Stem=Haselnussbusch Stamm +Hazelnut Bush Leaves=Haselnussbusch Blätter +Hazelnut Bush Sapling=Haselnussbusch Setzling +Hazelnut=Haselnuss +Dead Bush Leaves=Verwelkte Buschblätter +Cracked Hazelnut=Geknackte Haselnuss +Hazelnut Woven Fence=Haselnuss Flechtzaun +Wet Savanna Acacia Trapdoor=Akazien Falltür +Wet Savanna Acacia Door=Akazientür +Alder Trapdoor=Erlen Falltür +Alder Door=Erlentür +Alpine Underground Door=Alpine Untergrundtür +Alpine Underground Trapdoor=Alpine Untergrundfalltür +Alpine Trapdoor=Alm Falltür +Alpine Door=Almtür +Bamboo Trapdoor=Bambus Falltür +Bamboo Door=Bambustür +Banana Door=Bananentür +Banana Trapdoor=Bananen Falltür +Birch Trapdoor=Birken Falltür +Birch Door=Birkentür +Coconut Trapdoor=Kokospalmen Falltür +Coconut Door=Kokospalmentür +Juniper Trapdoor=Wacholder Falltür +Juniper Door=Wacholder Tür +Mediterranean Pine Trapdoor=Mediterrane Pinien Falltür +Mediterranean Pine Door=Mediterrane Pinientür +Olive Trapdoor=Oliven Falltür +Olive Door=Oliventür +Eucalyptus Trapdoor=Eukalyptus Falltür +Eucalyptus Door=Eukalyptus Tür +Willow Trapdoor=Weiden Falltür +Willow Door=Weidentür + + + + + + + + + + + + + diff --git a/mods/naturalbiomes/mediterranean.lua b/mods/naturalbiomes/mediterranean.lua new file mode 100644 index 0000000..3bbdea1 --- /dev/null +++ b/mods/naturalbiomes/mediterranean.lua @@ -0,0 +1,857 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:mediterran_litter", { + description = S("Mediterranean litter with grass"), + tiles = {"naturalbiomes_mediterran_litter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_mediterran_litte_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:mediterran_rock", { + description = S("Mediterranean Rock"), + tiles = {"naturalbiomes_mediterran_rock.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:mediterran_ruin", { + description = S("Mediterranean Ruin"), + tiles = {"naturalbiomes_mediterran_ruins.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:mediterran_ruin2", { + description = S("Mediterranean Ruin Column"), + tiles = {"naturalbiomes_mediterran_ruins2.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:mediterranean", + node_top = "naturalbiomes:mediterran_litter", + depth_top = 1, + node_filler = "naturalbiomes:mediterran_rock", + depth_filler = 50, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:sandstone", + node_dungeon_alt = "default:desert_stonebrick", + node_dungeon_stair = "stairs:stair_desert_stone", + y_max = 100, + y_min = 5, + heat_point = 58, + humidity_point = 30, +}) + +-- Tree generation +-- + +-- New olive tree + +local function grow_new_olive_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 5, y = pos.y - 0, z = pos.z - 5}, modpath.."/schematics/naturalbiomes_olive_tree2_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:olive_sapling", grow_new_olive_tree, "soil"}, +}) +end + +-- olive trunk +minetest.register_node("naturalbiomes:olive_trunk", { + description = S("Olive Trunk"), + tiles = { + "naturalbiomes_mediterran_olive_trunk_top.png", + "naturalbiomes_mediterran_olive_trunk_top.png", + "naturalbiomes_mediterran_olive_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- olive wood +minetest.register_node("naturalbiomes:olive_wood", { + description = S("Olive Wood"), + tiles = {"naturalbiomes_mediterran_olive_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:olive_wood 4", + recipe = {{"naturalbiomes:olive_trunk"}} +}) + +minetest.register_node("naturalbiomes:olive_leaves", { + description = S("Olive Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_mediterran_olive_leaves.png"}, + special_tiles = {"naturalbiomes_mediterran_olive_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:olive_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:olive_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:olive_sapling", { + description = S("Olive Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_mediterran_olive_sapling.png"}, + inventory_image = "naturalbiomes_mediterran_olive_sapling.png", + wield_image = "naturalbiomes_mediterran_olive_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_olive_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:olive_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_olive_wood", + "naturalbiomes:olive_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_olive_wood.png"}, + S("Olive Stair"), + S("Olive Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_olive_trunk", + "naturalbiomes:olive_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_olive_trunk_top.png", "naturalbiomes_mediterran_olive_trunk_top.png", "naturalbiomes_mediterran_olive_trunk.png"}, + S("Alder Trunk Stair"), + S("Alder Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_olive_wood", + { + description = S("Olive Wood Fence Gate"), + texture = "naturalbiomes_mediterran_olive_wood.png", + material = "naturalbiomes:olive_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_olive_wood", + { + description = S("Olive Fence"), + texture = "naturalbiomes_olive_fence_woode.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_mediterran_olive_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_mediterran_olive_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:olive_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_olive_wood", + { + description = S("Olive Fence Rail"), + texture = "naturalbiomes_olive_fence_woode.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_olive_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_olive_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:olive_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:olive_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00105, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_olive_tree2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +-- Tree generation +-- + +-- New pine tree + +local function grow_new_pine_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 9, y = pos.y - 0, z = pos.z - 8}, modpath.."/schematics/naturalbiomes_med_pinetree_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:pine_sapling", grow_new_pine_tree, "soil"}, +}) +end + +-- pine trunk +minetest.register_node("naturalbiomes:pine_trunk", { + description = S("Mediterranean Pine Trunk"), + tiles = { + "naturalbiomes_mediterran_pine_trunk_top.png", + "naturalbiomes_mediterran_pine_trunk_top.png", + "naturalbiomes_mediterran_pine_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- pine wood +minetest.register_node("naturalbiomes:pine_wood", { + description = S("Mediterranean Pine Wood"), + tiles = {"naturalbiomes_mediterran_pine_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:pine_wood 4", + recipe = {{"naturalbiomes:pine_trunk"}} +}) + +minetest.register_node("naturalbiomes:pine_leaves", { + description = S("Mediterranean Pine Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_mediterran_pine_leaves.png"}, + special_tiles = {"naturalbiomes_mediterran_pine_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:pine_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:pine_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:pine_sapling", { + description = S("Mediterranean Pine Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_mediterran_pine_sapling.png"}, + inventory_image = "naturalbiomes_mediterran_pine_sapling.png", + wield_image = "naturalbiomes_mediterran_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_pine_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:pine_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_pine_wood", + "naturalbiomes:pine_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_pine_wood.png"}, + S("Mediterranean Pine Stair"), + S("Mediterranean Pine Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_mediterran_pine_trunk", + "naturalbiomes:pine_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_mediterran_pine_trunk_top.png", "naturalbiomes_mediterran_pine_trunk_top.png", "naturalbiomes_mediterran_pine_trunk.png"}, + S("Mediterranean Pine Trunk Stair"), + S("Mediterranean Pine Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_pine_wood", + { + description = S("Mediterranean Pine Wood Fence Gate"), + texture = "naturalbiomes_mediterran_pine_wood.png", + material = "naturalbiomes:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_pine_wood", + { + description = S("Mediterranean Pine Fence"), + texture = "naturalbiomes_medpine_fence_woode.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_mediterran_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_mediterran_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_pine_wood", + { + description = S("Mediterranean Pine Fence Rail"), + texture = "naturalbiomes_medpine_fence_woode.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_mediterran_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:pine_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:pine_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_med_pinetree_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:pine_treesmall", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00105, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_med_pinetree_small_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + -- Cypress Bush + +-- New cypress tree + +local function grow_new_cypress_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_cypress_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:med_bush_sapling", grow_new_cypress_tree, "soil"}, +}) +end + + minetest.register_decoration({ + name = "naturalbiomes:med_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 3876, + octaves = 3, + persist = 0.4, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_cypress_0_90.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:med_bush_stem", { + description = S("Cypress Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_mediterran_cypress_stem.png"}, + inventory_image = "naturalbiomes_mediterran_cypress_stem.png", + wield_image = "naturalbiomes_mediterran_cypress_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:med_bush_leaves", { + description = S("Cypress Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_mediterran_cypress_leavese.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:med_bush_sapling"}, rarity = 25}, + {items = {"naturalbiomes:med_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:med_bush_sapling", { + description = S("Cypress Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_mediterran_cypress_stem.png"}, + inventory_image = "naturalbiomes_mediterran_cypress_stem.png", + wield_image = "naturalbiomes_mediterran_cypress_stem.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_cypress_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:med_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:med_flower1", + deco_type = "simple", + place_on = {"naturalbiomes:mediterranean_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_flower1", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_flower1", { + description = S"Mediterranean Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_flower1.png"}, + inventory_image = "naturalbiomes_mediterran_flower1.png", + wield_image = "naturalbiomes_mediterran_flower1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_flower2", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 8, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_flower2", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_flower2", { + description = S"Mediterranean Flower", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_flower2.png"}, + inventory_image = "naturalbiomes_mediterran_flower2.png", + wield_image = "naturalbiomes_mediterran_flower2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_flower3", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 7, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_flower3", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_flower3", { + description = S"Lavender", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_flower3.png"}, + inventory_image = "naturalbiomes_mediterran_flower3.png", + wield_image = "naturalbiomes_mediterran_flower3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_grass1", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 300, y = 300, z = 300}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_grass1", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_grass1", { + description = S"Mediterranean Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_grass.png"}, + inventory_image = "naturalbiomes_mediterran_grass.png", + wield_image = "naturalbiomes_mediterran_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:mediterran_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 300, y = 300, z = 300}, + seed = 4602, + octaves = 8, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:med_grass2", + spawn_by = "naturalbiomes:mediterran_litter" + }) + +minetest.register_node("naturalbiomes:med_grass2", { + description = S"Mediterranean Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_mediterran_grass2.png"}, + inventory_image = "naturalbiomes_mediterran_grass2.png", + wield_image = "naturalbiomes_mediterran_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_ruin1", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 1, + persist = 0.1, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_medruin1_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_ruin2", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 1, + persist = 0.1, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_medruin2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:med_ruin3", + deco_type = "schematic", + place_on = {"naturalbiomes:mediterran_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.008, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 1, + persist = 0.1, + }, + biomes = {"naturalbiomes:mediterranean"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_medruin3_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +-- Olives +minetest.register_node("naturalbiomes:olives", { + description = S("Fresh Olives"), + drawtype = "plantlike", + tiles = {"naturalbiomes__fresholives.png"}, + inventory_image = "naturalbiomes__fresholives.png", + wield_image = "naturalbiomes__fresholives.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:olives", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:olives", param2 = 1}) + end + end +}) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:mediterran_litter", {"naturalbiomes:med_flower1", "naturalbiomes:med_flower2", "naturalbiomes:med_flower3", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2"}, {}} + }) +end + diff --git a/mods/naturalbiomes/mod.conf b/mods/naturalbiomes/mod.conf new file mode 100644 index 0000000..64087e6 --- /dev/null +++ b/mods/naturalbiomes/mod.conf @@ -0,0 +1,4 @@ +name = naturalbiomes +description = 7 New Biomes +depends = default, stairs, doors, xpanes +optional_depends = hunger_ng, ethereal, bonemeal \ No newline at end of file diff --git a/mods/naturalbiomes/outback.lua b/mods/naturalbiomes/outback.lua new file mode 100644 index 0000000..22eff5d --- /dev/null +++ b/mods/naturalbiomes/outback.lua @@ -0,0 +1,716 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:outback_litter", { + description = S("Outback ground with grass"), + tiles = {"naturalbiomes_outbacklitter.png", "naturalbiomes_outback_ground.png", + {name = "naturalbiomes_outback_ground.png^naturalbiomes_outbacklitter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "naturalbiomes:outback_ground", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("naturalbiomes:outback_rock", { + description = S("Outback Rock"), + tiles = {"naturalbiomes_outback_rock.png"}, + groups = {cracky = 3, stone = 1}, +legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("naturalbiomes:outback_ground", { + description = S("Outback Ground Sand"), + tiles = {"naturalbiomes_outback_ground.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:outback", + node_top = "naturalbiomes:outback_litter", + depth_top = 1, + node_filler = "naturalbiomes:outback_ground", + depth_filler = 50, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:sandstone", + node_dungeon_alt = "default:desert_stonebrick", + node_dungeon_stair = "stairs:stair_desert_stone", + y_max = 40, + y_min = 3, + heat_point = 82, + humidity_point = 32, +}) + +-- Tree generation +-- + +-- New outback tree + +local function grow_new_outback_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_outback_tree1_0_90.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:outback_sapling", grow_new_outback_tree, "soil"}, +}) +end + +-- outback trunk +minetest.register_node("naturalbiomes:outback_trunk", { + description = S("Outback Eucalyptus Trunk"), + tiles = { + "naturalbiomes_outbackeukalyptus_trunk_top.png", + "naturalbiomes_outbackeukalyptus_trunk_top.png", + "naturalbiomes_outbackeucalyptus_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- outback wood +minetest.register_node("naturalbiomes:outback_wood", { + description = S("Outback Eucalyptus Wood"), + tiles = {"naturalbiomes_outback_eukalyptus_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:outback_wood 4", + recipe = {{"naturalbiomes:outback_trunk"}} +}) + +minetest.register_node("naturalbiomes:outback_leaves", { + description = S("Outback Eucalyptus Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_outbackeukalyptus_leaves.png"}, + special_tiles = {"naturalbiomes_outbackeukalyptus_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:outback_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:outback_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:outback_sapling", { + description = S("Outback Eucalyptus Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_outbackeukaplyptus_sapling.png"}, + inventory_image = "naturalbiomes_outbackeukaplyptus_sapling.png", + wield_image = "naturalbiomes_outbackeukaplyptus_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_outback_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:outback_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_outback_eukalyptus_wood", + "naturalbiomes:outback_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_outback_eukalyptus_wood.png"}, + S("Outback Eucalyptus Stair"), + S("Outback Eucalyptus Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_outbackeucalyptus_trunk", + "naturalbiomes:outback_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_outbackeukalyptus_trunk_top.png", "naturalbiomes_outbackeukalyptus_trunk_top.png", "naturalbiomes_outbackeucalyptus_trunk.png"}, + S("Outback Eucalyptus Trunk Stair"), + S("Outback Eucalyptus Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_outback_wood", + { + description = S("Outback Eucalyptus Wood Fence Gate"), + texture = "naturalbiomes_outback_eukalyptus_wood.png", + material = "naturalbiomes:outback_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_outback_wood", + { + description = S("Outback Eucalyptus Fence"), + texture = "naturalbiomes_eukalyptus_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:outback_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_outback_wood", + { + description = S("Outback Eucalyptus Fence Rail"), + texture = "naturalbiomes_eukalyptus_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_outback_eukalyptus_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:outback_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:outback_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:outback"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_outback_tree1_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:outback_tree2", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00115, + biomes = {"naturalbiomes:outback"}, + y_max = 31, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_outback_tree2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + minetest.register_decoration({ + name = "naturalbiomes:outback_log", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0002, + scale = 0.0005, + spread = {x = 550, y = 550, z = 550}, + seed = 2, + octaves = 3, + persist = 0.36 + }, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:outback_litter", + num_spawn_by = 2, + }) + + -- Outback Bush + +-- New outback bush + +local function grow_new_outback_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 2, y = pos.y - 0, z = pos.z - 2}, modpath.."/schematics/naturalbiomes_outback_bush_small2_0_270.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:outback_bush_sapling", grow_new_outback_bush, "soil"}, +}) +end + minetest.register_decoration({ + name = "naturalbiomes:outback_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 391, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_bush_small2_0_270.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:outback_bush_stem", { + description = S("Outback Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_outback_bush_stem.png"}, + inventory_image = "naturalbiomes_outback_bush_stem.png", + wield_image = "naturalbiomes_outback_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:outback_bush_leaves", { + description = S("Outback Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_outbackbush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:outback_bush_sapling"}, rarity = 50}, + {items = {"naturalbiomes:outback_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:outback_bush_sapling", { + description = S("Outback Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_outback_bush_stem.png"}, + inventory_image = "naturalbiomes_outback_bush_stem.png", + wield_image = "naturalbiomes_outback_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_outback_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:outback_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 8, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass.png"}, + inventory_image = "naturalbiomes_outbackgrass.png", + wield_image = "naturalbiomes_outbackgrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 500, y = 500, z = 500}, + seed = 687, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass2", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass2", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass2.png"}, + inventory_image = "naturalbiomes_outbackgrass2.png", + wield_image = "naturalbiomes_outbackgrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 500, y = 500, z = 500}, + seed = 6072, + octaves = 2, + persist = 3, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass3", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass3", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass3.png"}, + inventory_image = "naturalbiomes_outbackgrass3.png", + wield_image = "naturalbiomes_outbackgrass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass4", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 500, y = 500, z = 500}, + seed = 457, + octaves = 3, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:outback_grass4", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass4", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass4.png"}, + inventory_image = "naturalbiomes_outbackgrass4.png", + wield_image = "naturalbiomes_outbackgrass4.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass5", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 4602, + octaves = 6, + persist = 1, + }, + y_max = 31000, + y_min = 1, + decoration = "naturalbiomes:outback_grass5", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass5", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + noise_params = { + offset = -0.03, + scale = 0.15, + spread = {x = 500, y = 500, z = 500}, + seed = 457, + octaves = 3, + persist = 1, + }, + tiles = {"naturalbiomes_outbackgrass5.png"}, + inventory_image = "naturalbiomes_outbackgrass5.png", + wield_image = "naturalbiomes_outbackgrass5.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:outback_grass6", + deco_type = "simple", + place_on = {"naturalbiomes:outback_litter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:outback_grass6", + spawn_by = "naturalbiomes:outback_litter" + }) + +minetest.register_node("naturalbiomes:outback_grass6", { + description = S"Outback Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_outbackgrass6.png"}, + inventory_image = "naturalbiomes_outbackgrass6.png", + wield_image = "naturalbiomes_outbackgrass6.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +minetest.register_node("naturalbiomes:outback_rockformation1", { + description = S("Outback Rock Formation"), + tiles = {"naturalbiomes_beach_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:palmbeach_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "naturalbiomes:outback_rockformation1", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_rock1_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + minetest.register_decoration({ + name = "naturalbiomes:outback_rockformation2", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_rock2_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + + minetest.register_decoration({ + name = "naturalbiomes:outback_rockformation3", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = -3, + sidelen = 16, + fill_ratio = 0.00005, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_rock3_0_90.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + +-- Outback Bush 3 + + minetest.register_decoration({ + name = "naturalbiomes:outback_bush2", + deco_type = "schematic", + place_on = {"naturalbiomes:outback_litter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 391, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:outback"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_outback_bush2_0_90.mts", + flags = "place_center_x, place_center_z", + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:outback_litter", {"naturalbiomes:outback_grass", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6"}, {}} + }) +end + diff --git a/mods/naturalbiomes/palmbeach.lua b/mods/naturalbiomes/palmbeach.lua new file mode 100644 index 0000000..9cf770c --- /dev/null +++ b/mods/naturalbiomes/palmbeach.lua @@ -0,0 +1,686 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:palmbeach_sand", { + description = S("Beach Sand"), + tiles = {"naturalbiomes_beach_sand.png"}, + groups = {crumbly = 3, sand = 1, falling_node = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_biome({ + name = "naturalbiomes:palmbeach", + node_top = "naturalbiomes:palmbeach_sand", + depth_top = 3, + node_filler = "default:sandstone", + depth_filler = 5, + node_riverbed = "naturalbiomes:palmbeach_sand", + depth_riverbed = 3, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone", + y_max = 5, + y_min = -1, + heat_point = 86, + humidity_point = 78, +}) + +minetest.register_node("naturalbiomes:palmbeach_rock", { + description = S("Beach Rock"), + tiles = {"naturalbiomes_beach_rock.png"}, + groups = {cracky = 3, stone = 1}, + drop = "naturalbiomes:palmbeach_rock", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_large_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock2", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_small_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock3", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = -2, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_medium2_0_180.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "naturalbiomes:beach_rock4", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = -2, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.02, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beachrock_medium_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + +-- Tree generation +-- + +-- New palm tree + +local function grow_new_palm_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 4, y = pos.y - 0, z = pos.z - 4}, modpath.."/schematics/naturalbiomes_cocopalm_tree_0_270.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:palm_sapling", grow_new_palm_tree, "soil"}, +}) +end + +-- palm trunk +minetest.register_node("naturalbiomes:palm_trunk", { + description = S("Coconut Palm Trunk"), + tiles = { + "naturalbiomes_savannapalm_trunk_top.png", + "naturalbiomes_savannapalm_trunk_top.png", + "naturalbiomes_savannapalm_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- palm wood +minetest.register_node("naturalbiomes:palm_wood", { + description = S("Coconut Palm Wood"), + tiles = {"naturalbiomes_savannapalm_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:palm_wood 4", + recipe = {{"naturalbiomes:palm_trunk"}} +}) + +minetest.register_node("naturalbiomes:palm_leaves", { + description = S("Coconut Palm Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_savannapalm_leaves.png"}, + special_tiles = {"naturalbiomes_savannapalm_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:palm_sapling'}, + rarity = 35, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:palm_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:palm_sapling", { + description = S("Coconut Palm Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannapalm_sapling.png"}, + inventory_image = "naturalbiomes_savannapalm_sapling.png", + wield_image = "naturalbiomes_savannapalm_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_palm_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:palm_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_savannapalm_wood", + "naturalbiomes:palm_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannapalm_wood.png"}, + S("Coconut Palm Stair"), + S("Coconut Palm Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_savannapalm_trunk", + "naturalbiomes:palm_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannapalm_trunk_top.png", "naturalbiomes_savannapalm_trunk_top.png", "naturalbiomes_savannapalm_trunk.png"}, + S("Coconut Palm Trunk Stair"), + S("Coconut Palm Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_palm_wood", + { + description = S("Coconut Palm Wood Fence Gate"), + texture = "naturalbiomes_savannapalm_wood.png", + material = "naturalbiomes:palm_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_palm_wood", + { + description = S("Coconut Palm Fence"), + texture = "naturalbiomes_palm_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_savannapalm_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_savannapalm_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:palm_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_palm_wood", + { + description = S("Coconut Palm Fence Rail"), + texture = "naturalbiomes_palm_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_savannapalm_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_savannapalm_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:palm_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:palm_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.01115, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 5, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_cocopalm_tree_0_270.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + -- Beach Bush + +-- New palm buh + +local function grow_new_palm_bush(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 1, y = pos.y - 0, z = pos.z - 1}, modpath.."/schematics/naturalbiomes_beach_bush_0_270.mts", "0", nil, false) +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:beach_bush_sapling", grow_new_palm_bush, "soil"}, +}) +end + + + minetest.register_decoration({ + name = "naturalbiomes:beach_bush", + deco_type = "schematic", + place_on = {"naturalbiomes:palmbeach_sand"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { +offset = -0.004, + scale = 0.06, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"naturalbiomes:palmbeach"}, + y_max = 31000, + y_min = 3, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_beach_bush_0_270.mts", + flags = "place_center_x, place_center_z", + }) + +minetest.register_node("naturalbiomes:beach_bush_stem", { + description = S("Beach Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"naturalbiomes_beach_bush_stem.png"}, + inventory_image = "naturalbiomes_beach_bush_stem.png", + wield_image = "naturalbiomes_beach_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("naturalbiomes:beach_bush_leaves", { + description = S("Beach Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"naturalbiomes_beach_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + {items = {"naturalbiomes:beach_bush_sapling"}, rarity = 3}, + {items = {"naturalbiomes:beach_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("naturalbiomes:beach_bush_sapling", { + description = S("Beach Bush Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_beach_bush_stem.png"}, + inventory_image = "naturalbiomes_beach_bush_stem.png", + wield_image = "naturalbiomes_beach_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_palm_bush, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:beach_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:palmbeach_grass1", + deco_type = "simple", + place_on = {"naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 1987, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 2, + decoration = "naturalbiomes:palmbeach_grass1", + spawn_by = "naturalbiomes:palmbeach_sand" + }) + +minetest.register_node("naturalbiomes:palmbeach_grass1", { + description = S"Palmbeach Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_beach_grass.png"}, + inventory_image = "naturalbiomes_beach_grass.png", + wield_image = "naturalbiomes_beach_grass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:palmbeach_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 834, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 2, + decoration = "naturalbiomes:palmbeach_grass2", + spawn_by = "naturalbiomes:palmbeach_sand" + }) + +minetest.register_node("naturalbiomes:palmbeach_grass2", { + description = S"Palmbeach Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_beach_grass2.png"}, + inventory_image = "naturalbiomes_beach_grass2.png", + wield_image = "naturalbiomes_beach_grass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:palmbeach_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:palmbeach_sand"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 834, + octaves = 3, + persist = 2, + }, + y_max = 30000, + y_min = 2, + decoration = "naturalbiomes:palmbeach_grass3", + spawn_by = "naturalbiomes:palmbeach:_sand" + }) + +minetest.register_node("naturalbiomes:palmbeach_grass3", { + description = S"Palmbeach Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_beach_grass3.png"}, + inventory_image = "naturalbiomes_beach_grass3.png", + wield_image = "naturalbiomes_beach_grass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + +-- Banana Bunch +minetest.register_node("naturalbiomes:banana_bunch", { + description = S("Banana Bunch"), + drawtype = "plantlike", + tiles = {"naturalbiomes_banana_bunch.png"}, + inventory_image = "naturalbiomes_banana_bunch.png", + wield_image = "naturalbiomes_banana_bunch.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:banana_bunch", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:banana_bunch", param2 = 1}) + end + end +}) + +-- Bunch to Single +minetest.register_craft({ + type = "shapeless", + output = "naturalbiomes:banana 3", + recipe = {"naturalbiomes:banana_bunch"} +}) + +minetest.register_craft({ + type = "shapeless", + output = "naturalbiomes:banana_bunch", + recipe = {"naturalbiomes:banana", "naturalbiomes:banana", "naturalbiomes:banana"} +}) + +minetest.register_node("naturalbiomes:banana", { + description = S("Banana"), + drawtype = "torchlike", + tiles = {"naturalbiomes_banana_single.png"}, + inventory_image = "naturalbiomes_banana_single.png", + wield_image = "naturalbiomes_banana_single.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:banana", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:banana", param2 = 1}) + end + end +}) + +minetest.register_node("naturalbiomes:coconut_slice", { + description = S("Coconut Slice"), + drawtype = "torchlike", + tiles = {"naturalbiomes_coconut_slice.png"}, + inventory_image = "naturalbiomes_coconut_slice.png", + wield_image = "naturalbiomes_coconut_slice.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + food_banana = 1, fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1 + }, + drop = "naturalbiomes:naturalbiomes:coconut_slice", + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:coconut_slice", param2 = 1}) + end + end +}) + +-- Coco +minetest.register_node("naturalbiomes:coconut", { + description = S("Coconut"), + drawtype = "plantlike", + tiles = {"naturalbiomes_coconut.png"}, + inventory_image = "naturalbiomes_coconut.png", + wield_image = "naturalbiomes_coconut.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.31, -0.5, -0.31, 0.31, 0.5, 0.31} + }, + groups = { + fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 1, leafdecay_drop = 1, winleafdecay_drop = 1, winleafdecay = 3 + }, + drop = "naturalbiomes:coconut", + on_use = minetest.item_eat(6), + sounds = default.node_sound_leaves_defaults(), + after_place_node = function(pos, placer) + if placer:is_player() then + minetest.set_node(pos, {name = "naturalbiomes:coconut", param2 = 1}) + end + end +}) + +-- Bunch to Single + + +minetest.register_craft({ + type = "shapeless", + output = "naturalbiomes:coconut_bunch", + recipe = {"naturalbiomes:coconut_slice", "naturalbiomes:coconut_slice", "naturalbiomes:coconut_slice"} +}) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:palmbeach_sand", {"naturalbiomes:palmbeach_grass1", "naturalbiomes:palmbeach_grass2", "naturalbiomes:palmbeach_grass3"}, {}} + }) +end + diff --git a/mods/naturalbiomes/schematics/naturalbiomes__alpine_pine1_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes__alpine_pine1_log_0_90.mts new file mode 100644 index 0000000..27d24bf Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes__alpine_pine1_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acacia_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_acacia_log_0_90.mts new file mode 100644 index 0000000..68e257d Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acacia_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acaciatree3.mts b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree3.mts new file mode 100644 index 0000000..6e94996 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acaciatree4.mts b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree4.mts new file mode 100644 index 0000000..f0e49aa Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree4.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_acaciatree_0_180.mts b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree_0_180.mts new file mode 100644 index 0000000..c4ccf46 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_acaciatree_0_180.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alder_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alder_log_0_90.mts new file mode 100644 index 0000000..2377120 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alder_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_boghole_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_boghole_0_270.mts new file mode 100644 index 0000000..780883b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_boghole_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts new file mode 100644 index 0000000..16e3780 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alderswamp_spwamphole_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_aldertree2_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_aldertree2_0_270.mts new file mode 100644 index 0000000..05e5fe0 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_aldertree2_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_aldertree3_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_aldertree3_0_270.mts new file mode 100644 index 0000000..f860370 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_aldertree3_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_aldertree_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_aldertree_0_270.mts new file mode 100644 index 0000000..1c9c683 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_aldertree_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_berrybush_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_berrybush_0_90.mts new file mode 100644 index 0000000..b784644 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_berrybush_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush.mts new file mode 100644 index 0000000..624b5f6 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush2.mts new file mode 100644 index 0000000..4497a36 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush3.mts new file mode 100644 index 0000000..8194870 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_bush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_cowberrybush.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_cowberrybush.mts new file mode 100644 index 0000000..09d1ce3 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_cowberrybush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine1_0_90.mts new file mode 100644 index 0000000..b998c31 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_0_90.mts new file mode 100644 index 0000000..f3809c3 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_log_0_90.mts new file mode 100644 index 0000000..c4fde8b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_alpine_pine2_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bambootree_large_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_large_0_270.mts new file mode 100644 index 0000000..955cc81 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_large_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_0_270.mts new file mode 100644 index 0000000..eb2b8be Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_micro_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_micro_0_270.mts new file mode 100644 index 0000000..5c78d0f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bambootree_small_micro_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_banana_palm_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_banana_palm_0_90.mts new file mode 100644 index 0000000..1b67941 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_banana_palm_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beach_bush_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beach_bush_0_270.mts new file mode 100644 index 0000000..72761a3 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beach_bush_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_large_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_large_0_270.mts new file mode 100644 index 0000000..56af121 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_large_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium2_0_180.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium2_0_180.mts new file mode 100644 index 0000000..a7d936e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium2_0_180.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium_0_270.mts new file mode 100644 index 0000000..4d36968 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_medium_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_beachrock_small_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_small_0_270.mts new file mode 100644 index 0000000..d2a1721 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_beachrock_small_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_birchtree.mts b/mods/naturalbiomes/schematics/naturalbiomes_birchtree.mts new file mode 100644 index 0000000..6701e62 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_birchtree.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_birchtree2.mts b/mods/naturalbiomes/schematics/naturalbiomes_birchtree2.mts new file mode 100644 index 0000000..cd0abc5 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_birchtree2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush.mts new file mode 100644 index 0000000..46e451b Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush2.mts new file mode 100644 index 0000000..13a679c Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush3.mts new file mode 100644 index 0000000..1644499 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_blackberrybush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush.mts new file mode 100644 index 0000000..ccf1acd Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush2.mts new file mode 100644 index 0000000..92f2e62 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush3.mts new file mode 100644 index 0000000..cb84496 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_deadbush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush.mts new file mode 100644 index 0000000..84cbe08 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush2.mts new file mode 100644 index 0000000..4bc9973 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush3.mts new file mode 100644 index 0000000..7e27843 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_hazelnutbush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush.mts new file mode 100644 index 0000000..7cbd5eb Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush2.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush2.mts new file mode 100644 index 0000000..892a896 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush3.mts b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush3.mts new file mode 100644 index 0000000..e49385c Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_bushland_wildrosebush3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_cocopalm_tree_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_cocopalm_tree_0_270.mts new file mode 100644 index 0000000..ca1490e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_cocopalm_tree_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_cypress_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_cypress_0_90.mts new file mode 100644 index 0000000..8bb92d5 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_cypress_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation.mts b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation.mts new file mode 100644 index 0000000..2e60b2c Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation2.mts b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation2.mts new file mode 100644 index 0000000..28cdb0f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation3.mts b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation3.mts new file mode 100644 index 0000000..430609d Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_heath_stoneformation3.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_junipertree.mts b/mods/naturalbiomes/schematics/naturalbiomes_junipertree.mts new file mode 100644 index 0000000..cc18e71 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_junipertree.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_junipertree2.mts b/mods/naturalbiomes/schematics/naturalbiomes_junipertree2.mts new file mode 100644 index 0000000..a49e1d9 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_junipertree2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_0_90.mts new file mode 100644 index 0000000..74e9253 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_small_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_small_0_90.mts new file mode 100644 index 0000000..c1de727 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_med_pinetree_small_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_medruin1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_medruin1_0_90.mts new file mode 100644 index 0000000..feca153 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_medruin1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_medruin2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_medruin2_0_90.mts new file mode 100644 index 0000000..8ca18b1 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_medruin2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_medruin3_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_medruin3_0_90.mts new file mode 100644 index 0000000..b2a2683 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_medruin3_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_olive_tree2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree2_0_90.mts new file mode 100644 index 0000000..f4c9865 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_olive_tree_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree_0_90.mts new file mode 100644 index 0000000..f4c9865 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_olive_tree_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_bush2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush2_0_90.mts new file mode 100644 index 0000000..f2fce13 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_bush_small2_0_270.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush_small2_0_270.mts new file mode 100644 index 0000000..28df820 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_bush_small2_0_270.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_log_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_log_0_90.mts new file mode 100644 index 0000000..fc3bafd Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_log_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_rock1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock1_0_90.mts new file mode 100644 index 0000000..406fe03 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_rock2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock2_0_90.mts new file mode 100644 index 0000000..2393c6f Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_rock3_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock3_0_90.mts new file mode 100644 index 0000000..27636c2 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_rock3_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_tree1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree1_0_90.mts new file mode 100644 index 0000000..a3bba0d Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_outback_tree2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree2_0_90.mts new file mode 100644 index 0000000..424940e Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_outback_tree2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_savannagrass1_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass1_0_90.mts new file mode 100644 index 0000000..1f8ed71 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass1_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_savannagrass2_0_90.mts b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass2_0_90.mts new file mode 100644 index 0000000..7fd76a7 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_savannagrass2_0_90.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree.mts new file mode 100644 index 0000000..8bc8ffb Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree11.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree11.mts new file mode 100644 index 0000000..b5aceb1 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree11.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree2.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree2.mts new file mode 100644 index 0000000..34522f5 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree2.mts differ diff --git a/mods/naturalbiomes/schematics/naturalbiomes_willowtree22.mts b/mods/naturalbiomes/schematics/naturalbiomes_willowtree22.mts new file mode 100644 index 0000000..6e8f533 Binary files /dev/null and b/mods/naturalbiomes/schematics/naturalbiomes_willowtree22.mts differ diff --git a/mods/naturalbiomes/screenshot.png b/mods/naturalbiomes/screenshot.png new file mode 100644 index 0000000..520cb1c Binary files /dev/null and b/mods/naturalbiomes/screenshot.png differ diff --git a/mods/naturalbiomes/settingtypes.txt b/mods/naturalbiomes/settingtypes.txt new file mode 100644 index 0000000..f7e7b5d --- /dev/null +++ b/mods/naturalbiomes/settingtypes.txt @@ -0,0 +1,10 @@ +#naturalbiomes settings + +#If enabled, will clear all registered biomes. +naturalbiomes.clear_biomes (Enable to clear registered biomes. true / false) bool true + +#If enabled, will clear all registered decorations. +naturalbiomes.clear_decos (Enable to clear registered decorations. true / false) bool true + +#If enabled, will clear all registered ores. +naturalbiomes.clear_ores (Enable to clear registered ores. true / false) bool false diff --git a/mods/naturalbiomes/textures/naturalbiomes_Bambooforest_bamboo_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_Bambooforest_bamboo_leaves.png new file mode 100644 index 0000000..e13e76b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_Bambooforest_bamboo_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_leaf.png b/mods/naturalbiomes/textures/naturalbiomes__banana_leaf.png new file mode 100644 index 0000000..329d9bf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_leaf.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_tree_sapling.png b/mods/naturalbiomes/textures/naturalbiomes__banana_tree_sapling.png new file mode 100644 index 0000000..467dd29 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_tree_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_trunk.png b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk.png new file mode 100644 index 0000000..cf61977 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk_top.png new file mode 100644 index 0000000..f558092 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__banana_wood.png b/mods/naturalbiomes/textures/naturalbiomes__banana_wood.png new file mode 100644 index 0000000..144cc7b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__banana_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes__fresholives.png b/mods/naturalbiomes/textures/naturalbiomes__fresholives.png new file mode 100644 index 0000000..3ea65ea Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes__fresholives.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_door.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_door.png new file mode 100644 index 0000000..de1d88f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_fence_wood.png new file mode 100644 index 0000000..39df52c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor.png new file mode 100644 index 0000000..8ddd5a2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor_side.png new file mode 100644 index 0000000..5cd3a57 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_acacia_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_adler_fence_wood.png new file mode 100644 index 0000000..e2a2bc2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle.png b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle.png new file mode 100644 index 0000000..a61ed22 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle_top.png b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle_top.png new file mode 100644 index 0000000..7fd7b15 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_reed_bundle_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_adler_yellowflower.png b/mods/naturalbiomes/textures/naturalbiomes_adler_yellowflower.png new file mode 100644 index 0000000..e0019f1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_adler_yellowflower.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alder_door.png b/mods/naturalbiomes/textures/naturalbiomes_alder_door.png new file mode 100644 index 0000000..7a900b7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alder_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor.png new file mode 100644 index 0000000..f24046e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor_side.png new file mode 100644 index 0000000..018ba6e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alder_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_leaves.png new file mode 100644 index 0000000..4c73464 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk.png new file mode 100644 index 0000000..79400dd Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk_top.png new file mode 100644 index 0000000..9b51dcf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_wood.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_wood.png new file mode 100644 index 0000000..27d0110 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_alder_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_dirt.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_dirt.png new file mode 100644 index 0000000..23f989c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_dirt.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter.png new file mode 100644 index 0000000..f3a0687 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter_side.png new file mode 100644 index 0000000..ee5cbad Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reedbrown.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reedbrown.png new file mode 100644 index 0000000..b441f21 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reedbrown.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds.png new file mode 100644 index 0000000..fe5b994 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds2.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds2.png new file mode 100644 index 0000000..07c1024 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds3.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds3.png new file mode 100644 index 0000000..4c1225f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_reeds3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_sapling.png new file mode 100644 index 0000000..88a4960 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily.png new file mode 100644 index 0000000..61e41c5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily_bottom.png b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily_bottom.png new file mode 100644 index 0000000..ec3fc13 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alderswamp_waterlily_bottom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine1_door.png b/mods/naturalbiomes/textures/naturalbiomes_alpine1_door.png new file mode 100644 index 0000000..6f33b30 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine1_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor.png new file mode 100644 index 0000000..b1b7550 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor_side.png new file mode 100644 index 0000000..9eb7552 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine1_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine2_door.png b/mods/naturalbiomes/textures/naturalbiomes_alpine2_door.png new file mode 100644 index 0000000..664b6d0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine2_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor.png new file mode 100644 index 0000000..37b9b13 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor_side.png new file mode 100644 index 0000000..c461320 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine2_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_fruit.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_fruit.png new file mode 100644 index 0000000..f117132 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_fruit.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_leaves.png new file mode 100644 index 0000000..75c8dd8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_sapling.png new file mode 100644 index 0000000..7a98889 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_stem.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_stem.png new file mode 100644 index 0000000..4f32095 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_cowberry_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_dandelion.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_dandelion.png new file mode 100644 index 0000000..4f9fa95 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_dandelion.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_edelweiss.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_edelweiss.png new file mode 100644 index 0000000..bc331d3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_edelweiss.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_grass1.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass1.png new file mode 100644 index 0000000..dc71ed1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass1.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass2.png new file mode 100644 index 0000000..5fd0c1a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass3.png new file mode 100644 index 0000000..ba436a2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_litter.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter.png new file mode 100644 index 0000000..92b6853 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter_side.png new file mode 100644 index 0000000..91773f8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_mushroom.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_mushroom.png new file mode 100644 index 0000000..af418c8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_mushroom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_leaves.png new file mode 100644 index 0000000..2a98c89 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_sapling.png new file mode 100644 index 0000000..3b6f269 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk.png new file mode 100644 index 0000000..43b42dc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk_top.png new file mode 100644 index 0000000..6dc1fa6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_wood.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_wood.png new file mode 100644 index 0000000..ba10a61 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine1_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_leaves.png new file mode 100644 index 0000000..377f7cf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_sapling.png new file mode 100644 index 0000000..71b4f06 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk.png new file mode 100644 index 0000000..13c9ad7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk_top.png new file mode 100644 index 0000000..59db722 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_wood.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_wood.png new file mode 100644 index 0000000..dbd3bef Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_pine2_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_rock.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock.png new file mode 100644 index 0000000..a5b3af6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_alpine_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock_brick.png new file mode 100644 index 0000000..97f3cde Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_alpine_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_door.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_door.png new file mode 100644 index 0000000..20115a2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_fence_wood.png new file mode 100644 index 0000000..8a4fae8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor.png new file mode 100644 index 0000000..f65d18c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor_side.png new file mode 100644 index 0000000..01e8984 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bamboo_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_sapling.png new file mode 100644 index 0000000..07abbf0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk.png new file mode 100644 index 0000000..9bf5151 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk_top.png new file mode 100644 index 0000000..a9161cd Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunksmall.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunksmall.png new file mode 100644 index 0000000..a15afe2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_trunksmall.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood.png new file mode 100644 index 0000000..bf3364a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood2.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood2.png new file mode 100644 index 0000000..e9a5ef0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_bamboo_wood2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass.png new file mode 100644 index 0000000..62a9790 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass2.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass2.png new file mode 100644 index 0000000..ce8d009 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_groundgrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter.png new file mode 100644 index 0000000..a01ea65 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter_side.png new file mode 100644 index 0000000..a2cb96f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock.png new file mode 100644 index 0000000..144ec45 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock_brick.png new file mode 100644 index 0000000..d8a1536 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bambooforest_small_bamboo.png b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_small_bamboo.png new file mode 100644 index 0000000..11feb3d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bambooforest_small_bamboo.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_bunch.png b/mods/naturalbiomes/textures/naturalbiomes_banana_bunch.png new file mode 100644 index 0000000..b295415 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_bunch.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_door.png b/mods/naturalbiomes/textures/naturalbiomes_banana_door.png new file mode 100644 index 0000000..ae8cabc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_single.png b/mods/naturalbiomes/textures/naturalbiomes_banana_single.png new file mode 100644 index 0000000..9c24d18 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_single.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor.png new file mode 100644 index 0000000..2f3a11e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor_side.png new file mode 100644 index 0000000..05fe2b3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk.png new file mode 100644 index 0000000..cf61977 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk_top.png new file mode 100644 index 0000000..f558092 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_banana_wood.png b/mods/naturalbiomes/textures/naturalbiomes_banana_wood.png new file mode 100644 index 0000000..144cc7b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_banana_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_bush_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_leaves.png new file mode 100644 index 0000000..be6ade1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_bush_stem.png b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_stem.png new file mode 100644 index 0000000..0b1147f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_bush_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_grass.png b/mods/naturalbiomes/textures/naturalbiomes_beach_grass.png new file mode 100644 index 0000000..9d8216e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_beach_grass2.png new file mode 100644 index 0000000..b5b79c3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_beach_grass3.png new file mode 100644 index 0000000..c289499 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_rock.png b/mods/naturalbiomes/textures/naturalbiomes_beach_rock.png new file mode 100644 index 0000000..63fdaa9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_beach_rock_brick.png new file mode 100644 index 0000000..f1d949e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_beach_sand.png b/mods/naturalbiomes/textures/naturalbiomes_beach_sand.png new file mode 100644 index 0000000..787ee3e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_beach_sand.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_birch_door.png b/mods/naturalbiomes/textures/naturalbiomes_birch_door.png new file mode 100644 index 0000000..4865783 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_birch_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor.png new file mode 100644 index 0000000..18b2be3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor_side.png new file mode 100644 index 0000000..55b2ec0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_birch_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberries.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberries.png new file mode 100644 index 0000000..20cfbf3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberries.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves.png new file mode 100644 index 0000000..4581769 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves2.png new file mode 100644 index 0000000..d5ec638 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_sapling.png new file mode 100644 index 0000000..25a7a38 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_stem.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_stem.png new file mode 100644 index 0000000..fe0f9c5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_blackberry_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter.png new file mode 100644 index 0000000..020833c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2.png new file mode 100644 index 0000000..602b2ab Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_back.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_back.png new file mode 100644 index 0000000..1fe230d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_back.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_bottom.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_bottom.png new file mode 100644 index 0000000..facd057 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_bottom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_front.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_front.png new file mode 100644 index 0000000..feb1b73 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_front.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_left.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_left.png new file mode 100644 index 0000000..2209026 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_left.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_right.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_right.png new file mode 100644 index 0000000..6bed627 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_right.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_top.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_top.png new file mode 100644 index 0000000..602b2ab Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter2_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3.png new file mode 100644 index 0000000..c87e2d5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_back.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_back.png new file mode 100644 index 0000000..016fffc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_back.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_bottom.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_bottom.png new file mode 100644 index 0000000..facd057 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_bottom.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_front.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_front.png new file mode 100644 index 0000000..621490e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_front.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_left.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_left.png new file mode 100644 index 0000000..2d19496 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_left.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_right.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_right.png new file mode 100644 index 0000000..a005b8a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_right.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_top.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_top.png new file mode 100644 index 0000000..c87e2d5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter3_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter_side.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter_side.png new file mode 100644 index 0000000..ae58a19 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_bushlandlitter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_deadbush_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_deadbush_leaves.png new file mode 100644 index 0000000..09427cb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_deadbush_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass.png new file mode 100644 index 0000000..0beab82 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass2.png new file mode 100644 index 0000000..bdd731a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass3.png new file mode 100644 index 0000000..f6df49a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass4.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass4.png new file mode 100644 index 0000000..29a2ba8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass4.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass5.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass5.png new file mode 100644 index 0000000..b1176c8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass5.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass6.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass6.png new file mode 100644 index 0000000..86bfa17 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass6.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_grass7.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass7.png new file mode 100644 index 0000000..9bfd96c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_grass7.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut.png new file mode 100644 index 0000000..10235e6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_cracked.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_cracked.png new file mode 100644 index 0000000..6286917 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_cracked.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_fence.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_fence.png new file mode 100644 index 0000000..e3b4584 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_fence.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves.png new file mode 100644 index 0000000..9432b3c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves2.png new file mode 100644 index 0000000..5d32069 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_sapling.png new file mode 100644 index 0000000..21056d9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_stem.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_stem.png new file mode 100644 index 0000000..babf0e3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_hazelnut_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose.png new file mode 100644 index 0000000..7f1c3c9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves.png new file mode 100644 index 0000000..695fcec Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves2.png new file mode 100644 index 0000000..d2af93d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_sapling.png new file mode 100644 index 0000000..9d79f1a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_stem.png b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_stem.png new file mode 100644 index 0000000..a2d08b1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_bushland_wildrose_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_coconut.png b/mods/naturalbiomes/textures/naturalbiomes_coconut.png new file mode 100644 index 0000000..e1225e4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_coconut.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_coconut_slice.png b/mods/naturalbiomes/textures/naturalbiomes_coconut_slice.png new file mode 100644 index 0000000..351a185 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_coconut_slice.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_cocopalm_door.png b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_door.png new file mode 100644 index 0000000..00fb61c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor.png new file mode 100644 index 0000000..6a9831f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor_side.png new file mode 100644 index 0000000..87d6ba0 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_cocopalm_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_eukalyptus_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_eukalyptus_fence_wood.png new file mode 100644 index 0000000..8261396 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_eukalyptus_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_fence_wood.png new file mode 100644 index 0000000..04b875d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_leaves.png new file mode 100644 index 0000000..1d31938 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_sapling.png new file mode 100644 index 0000000..245de8d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk.png new file mode 100644 index 0000000..b44fa4a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk_top.png new file mode 100644 index 0000000..97d7d15 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_birch_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_wood.png new file mode 100644 index 0000000..3553f66 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_birch_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_grass.png b/mods/naturalbiomes/textures/naturalbiomes_heath_grass.png new file mode 100644 index 0000000..6e58e5e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_grass2.png new file mode 100644 index 0000000..cd76d70 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_grass3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_grass3.png new file mode 100644 index 0000000..9e87ebb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_grass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower.png new file mode 100644 index 0000000..6605a1d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2.png new file mode 100644 index 0000000..13e2c49 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2node.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2node.png new file mode 100644 index 0000000..cba50d6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower2node.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3.png new file mode 100644 index 0000000..e6efd4b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3node.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3node.png new file mode 100644 index 0000000..6c06e1b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower3node.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4.png new file mode 100644 index 0000000..bb7c891 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4node.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4node.png new file mode 100644 index 0000000..0a43bf9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflower4node.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflowernode.png b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflowernode.png new file mode 100644 index 0000000..26ea48c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_heatherflowernode.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_fence_wood.png new file mode 100644 index 0000000..15658dd Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_leaves.png new file mode 100644 index 0000000..3e26408 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_sapling.png new file mode 100644 index 0000000..25c2b8e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk.png new file mode 100644 index 0000000..560369f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk_top.png new file mode 100644 index 0000000..8c68d83 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_wood.png new file mode 100644 index 0000000..5d3fad1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_juniper_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter.png new file mode 100644 index 0000000..8c84348 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter2.png new file mode 100644 index 0000000..ecdbebf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter3.png new file mode 100644 index 0000000..70e80d4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side.png new file mode 100644 index 0000000..34d70f8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side2.png new file mode 100644 index 0000000..c37bfcc Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side3.png b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side3.png new file mode 100644 index 0000000..66b7c94 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_litter_side3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_rottenwood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_rottenwood.png new file mode 100644 index 0000000..b8749bb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_rottenwood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_smallbirchstem.png b/mods/naturalbiomes/textures/naturalbiomes_heath_smallbirchstem.png new file mode 100644 index 0000000..b8749bb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_smallbirchstem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass.png b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass.png new file mode 100644 index 0000000..591e754 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass2.png new file mode 100644 index 0000000..177cf69 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_swampgrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_fence_wood.png new file mode 100644 index 0000000..0689a9a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves.png new file mode 100644 index 0000000..531e1ca Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves2.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves2.png new file mode 100644 index 0000000..0cd826f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_leaves2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_sapling.png new file mode 100644 index 0000000..3870286 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk.png new file mode 100644 index 0000000..23962c9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk_top.png new file mode 100644 index 0000000..f2901f9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_heath_willow_wood.png b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_wood.png new file mode 100644 index 0000000..de0eba9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_heath_willow_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_acacia_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_acacia_door.png new file mode 100644 index 0000000..2dc6cb4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_acacia_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_alder_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_alder_door.png new file mode 100644 index 0000000..47ae446 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_alder_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_alpine1_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_alpine1_door.png new file mode 100644 index 0000000..2872c3c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_alpine1_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_alpine2_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_alpine2_door.png new file mode 100644 index 0000000..de66346 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_alpine2_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_bamboo_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_bamboo_door.png new file mode 100644 index 0000000..486375e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_bamboo_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_banana_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_banana_door.png new file mode 100644 index 0000000..f00d173 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_banana_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_birch_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_birch_door.png new file mode 100644 index 0000000..d970465 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_birch_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_cocopalm_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_cocopalm_door.png new file mode 100644 index 0000000..f8b676c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_cocopalm_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_juniper_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_juniper_door.png new file mode 100644 index 0000000..81eaa9c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_juniper_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_medpine_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_medpine_door.png new file mode 100644 index 0000000..e91f468 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_medpine_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_olive_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_olive_door.png new file mode 100644 index 0000000..3c8a92d Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_olive_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_outback_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_outback_door.png new file mode 100644 index 0000000..5e83cb4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_outback_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_item_willow_door.png b/mods/naturalbiomes/textures/naturalbiomes_item_willow_door.png new file mode 100644 index 0000000..b208ad3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_item_willow_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_juniper_door.png b/mods/naturalbiomes/textures/naturalbiomes_juniper_door.png new file mode 100644 index 0000000..e3b176b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_juniper_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor.png new file mode 100644 index 0000000..29ccf17 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor_side.png new file mode 100644 index 0000000..93488c1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_juniper_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_leavese.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_leavese.png new file mode 100644 index 0000000..03c5dfd Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_leavese.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_stem.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_stem.png new file mode 100644 index 0000000..0555bba Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_cypress_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower1.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower1.png new file mode 100644 index 0000000..cc893fa Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower1.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower2.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower2.png new file mode 100644 index 0000000..8b5d835 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower3.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower3.png new file mode 100644 index 0000000..610fbb1 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_flower3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass.png new file mode 100644 index 0000000..a3fc859 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass2.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass2.png new file mode 100644 index 0000000..0728fb8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_grass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_litte_side.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litte_side.png new file mode 100644 index 0000000..184f3c8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litte_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_litter.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litter.png new file mode 100644 index 0000000..8b20d0b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_litter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_leaves.png new file mode 100644 index 0000000..111d029 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_sapling.png new file mode 100644 index 0000000..3cd61cf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk.png new file mode 100644 index 0000000..d4161b4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk_top.png new file mode 100644 index 0000000..894bf81 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_wood.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_wood.png new file mode 100644 index 0000000..4b19eab Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_olive_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_leaves.png new file mode 100644 index 0000000..84c0999 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_sapling.png new file mode 100644 index 0000000..2626177 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk.png new file mode 100644 index 0000000..fa86028 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk_top.png new file mode 100644 index 0000000..f4a9252 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_wood.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_wood.png new file mode 100644 index 0000000..889c36b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_pine_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock.png new file mode 100644 index 0000000..58428bf Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock_brick.png new file mode 100644 index 0000000..cb7ef7a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins.png new file mode 100644 index 0000000..3aeb350 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins2.png b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins2.png new file mode 100644 index 0000000..a2194c5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_mediterran_ruins2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_door.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_door.png new file mode 100644 index 0000000..34e7442 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_fence_woode.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_fence_woode.png new file mode 100644 index 0000000..9eb46aa Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_fence_woode.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor.png new file mode 100644 index 0000000..09ecaef Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor_side.png new file mode 100644 index 0000000..2431a74 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_medpine_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_door.png b/mods/naturalbiomes/textures/naturalbiomes_olive_door.png new file mode 100644 index 0000000..f486ff9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_fence_woode.png b/mods/naturalbiomes/textures/naturalbiomes_olive_fence_woode.png new file mode 100644 index 0000000..07e04e3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_fence_woode.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor.png new file mode 100644 index 0000000..b378fe7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor_side.png new file mode 100644 index 0000000..5fd90a6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_olive_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_bush_stem.png b/mods/naturalbiomes/textures/naturalbiomes_outback_bush_stem.png new file mode 100644 index 0000000..137cc11 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_bush_stem.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_door.png b/mods/naturalbiomes/textures/naturalbiomes_outback_door.png new file mode 100644 index 0000000..174e5b2 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_eukalyptus_wood.png b/mods/naturalbiomes/textures/naturalbiomes_outback_eukalyptus_wood.png new file mode 100644 index 0000000..592bd75 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_eukalyptus_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_ground.png b/mods/naturalbiomes/textures/naturalbiomes_outback_ground.png new file mode 100644 index 0000000..cd39a9c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_ground.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_ground2.png b/mods/naturalbiomes/textures/naturalbiomes_outback_ground2.png new file mode 100644 index 0000000..c39c3a3 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_ground2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_ground3.png b/mods/naturalbiomes/textures/naturalbiomes_outback_ground3.png new file mode 100644 index 0000000..60205b9 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_ground3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_rock.png b/mods/naturalbiomes/textures/naturalbiomes_outback_rock.png new file mode 100644 index 0000000..eda5a7c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_rock.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_rock_brick.png b/mods/naturalbiomes/textures/naturalbiomes_outback_rock_brick.png new file mode 100644 index 0000000..3490c4a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_rock_brick.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor.png new file mode 100644 index 0000000..067ae94 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor_side.png new file mode 100644 index 0000000..850e237 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outback_trapdoor_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackbush_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_outbackbush_leaves.png new file mode 100644 index 0000000..3d3f4ad Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackbush_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeucalyptus_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeucalyptus_trunk.png new file mode 100644 index 0000000..48187be Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeucalyptus_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_leaves.png new file mode 100644 index 0000000..dd35d63 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_trunk_top.png new file mode 100644 index 0000000..fa5813e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeukalyptus_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackeukaplyptus_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_outbackeukaplyptus_sapling.png new file mode 100644 index 0000000..614ac34 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackeukaplyptus_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass.png new file mode 100644 index 0000000..8a6d9f5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass2.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass2.png new file mode 100644 index 0000000..78796e8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass3.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass3.png new file mode 100644 index 0000000..52ff54e Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass4.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass4.png new file mode 100644 index 0000000..4e26289 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass4.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass5.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass5.png new file mode 100644 index 0000000..005e54b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass5.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbackgrass6.png b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass6.png new file mode 100644 index 0000000..cc772d5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbackgrass6.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbacklitter.png b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter.png new file mode 100644 index 0000000..83035a6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_outbacklitter_side.png b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter_side.png new file mode 100644 index 0000000..fa65313 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_outbacklitter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_palm_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_palm_fence_wood.png new file mode 100644 index 0000000..b35a902 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_palm_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_pine2_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_pine2_fence_wood.png new file mode 100644 index 0000000..19ea100 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_pine2_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_pine_fence_wood.png b/mods/naturalbiomes/textures/naturalbiomes_pine_fence_wood.png new file mode 100644 index 0000000..026de46 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_pine_fence_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_leaves.png new file mode 100644 index 0000000..5081cb5 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_trunk.png new file mode 100644 index 0000000..8d01ff8 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_wood.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_wood.png new file mode 100644 index 0000000..3de04d4 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacacia_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_sapling.png new file mode 100644 index 0000000..a5a211c Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_trunk_top.png new file mode 100644 index 0000000..2e3829b Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannaacaia_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrass.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrass.png new file mode 100644 index 0000000..3cd5466 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrass.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrass2.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrass2.png new file mode 100644 index 0000000..7acc9d6 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrass2.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrass3.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrass3.png new file mode 100644 index 0000000..702e922 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrass3.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannagrasssmall.png b/mods/naturalbiomes/textures/naturalbiomes_savannagrasssmall.png new file mode 100644 index 0000000..3b82133 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannagrasssmall.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannalitter.png b/mods/naturalbiomes/textures/naturalbiomes_savannalitter.png new file mode 100644 index 0000000..9241246 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannalitter.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannalitter_side.png b/mods/naturalbiomes/textures/naturalbiomes_savannalitter_side.png new file mode 100644 index 0000000..46faacb Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannalitter_side.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_leaves.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_leaves.png new file mode 100644 index 0000000..c6e6400 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_leaves.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_sapling.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_sapling.png new file mode 100644 index 0000000..9aae172 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_sapling.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk.png new file mode 100644 index 0000000..b2d64c7 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk_top.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk_top.png new file mode 100644 index 0000000..f061c7a Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_trunk_top.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_savannapalm_wood.png b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_wood.png new file mode 100644 index 0000000..9861b7f Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_savannapalm_wood.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_willow_door.png b/mods/naturalbiomes/textures/naturalbiomes_willow_door.png new file mode 100644 index 0000000..2010f59 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_willow_door.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor.png b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor.png new file mode 100644 index 0000000..d205665 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor.png differ diff --git a/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor_side.png b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor_side.png new file mode 100644 index 0000000..c225a44 Binary files /dev/null and b/mods/naturalbiomes/textures/naturalbiomes_willow_trapdoor_side.png differ diff --git a/mods/naturalbiomes/wetsavanna.lua b/mods/naturalbiomes/wetsavanna.lua new file mode 100644 index 0000000..2599692 --- /dev/null +++ b/mods/naturalbiomes/wetsavanna.lua @@ -0,0 +1,468 @@ +local S = minetest.get_translator("naturalbiomes") + +local modname = "naturalbiomes" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +minetest.register_node("naturalbiomes:savannalitter", { + description = S("Wet Savanna dirt with Grass"), + tiles = {"naturalbiomes_savannalitter.png", "default_dirt.png", + {name = "default_dirt.png^naturalbiomes_savannalitter_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_biome({ + name = "naturalbiomes:wetsavanna", + node_top = "naturalbiomes:savannalitter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:clay", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 5, + heat_point = 86, + humidity_point = 60, +}) + +-- Tree generation +-- + +-- New acacia tree + +local function grow_new_acacia_tree(pos) + if not default.can_grow(pos) then + -- try a bit later again + minetest.get_node_timer(pos):start(math.random(240, 600)) + return + end +minetest.remove_node(pos) + minetest.place_schematic({x = pos.x - 7, y = pos.y - 0, z = pos.z - 7}, modpath.."/schematics/naturalbiomes_acaciatree_0_180.mts", "0", nil, false) + +end + +if minetest.get_modpath("bonemeal") then +bonemeal:add_sapling({ + {"naturalbiomes:acacia_sapling", grow_new_acacia_tree, "soil"}, +}) +end + +-- acacia trunk +minetest.register_node("naturalbiomes:acacia_trunk", { + description = S("Acacia Trunk"), + tiles = { + "naturalbiomes_savannaacaia_trunk_top.png", + "naturalbiomes_savannaacaia_trunk_top.png", + "naturalbiomes_savannaacacia_trunk.png" + }, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +-- acacia wood +minetest.register_node("naturalbiomes:acacia_wood", { + description = S("Acacia Wood"), + tiles = {"naturalbiomes_savannaacacia_wood.png"}, + is_ground_content = false, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "naturalbiomes:acacia_wood 4", + recipe = {{"naturalbiomes:acacia_trunk"}} +}) + +minetest.register_node("naturalbiomes:acacia_leaves", { + description = S("Acacia Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"naturalbiomes_savannaacacia_leaves.png"}, + special_tiles = {"naturalbiomes_savannaacacia_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, winleafdecay = 3}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/50 chance + items = {'naturalbiomes:acacia_sapling'}, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'naturalbiomes:acacia_leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("naturalbiomes:acacia_sapling", { + description = S("Acacia Sapling"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannaacaia_sapling.png"}, + inventory_image = "naturalbiomes_savannaacaia_sapling.png", + wield_image = "naturalbiomes_savannaacaia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_new_acacia_tree, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "naturalbiomes:acacia_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + + stairs.register_stair_and_slab( + "naturalbiomes_savannaacacia_wood", + "naturalbiomes:acacia_wood", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannaacacia_wood.png"}, + S("Acacia Stair"), + S("Acacia Slab"), + default.node_sound_wood_defaults() + ) + + stairs.register_stair_and_slab( + "naturalbiomes_savannaacacia_trunk", + "naturalbiomes:acacia_trunk", + {choppy = 2, oddly_breakable_by_hand = 1, flammable = 3}, + {"naturalbiomes_savannaacaia_trunk_top.png", "naturalbiomes_savannaacaia_trunk_top.png", "naturalbiomes_savannaacacia_trunk.png"}, + S("Acacia Trunk Stair"), + S("Acacia Trunk Slab"), + default.node_sound_wood_defaults() + ) + + doors.register_fencegate( + "naturalbiomes:gate_acacia_wood", + { + description = S("Acacia Wood Fence Gate"), + texture = "naturalbiomes_savannaacacia_wood.png", + material = "naturalbiomes:acacia_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() + } + ) + + +default.register_fence( + "naturalbiomes:fence_acacia_wood", + { + description = S("Acacia Fence"), + texture = "naturalbiomes_acacia_fence_wood.png", + inventory_image = "default_fence_overlay.png^naturalbiomes_savannaacacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^naturalbiomes_savannaacacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +default.register_fence_rail( + "naturalbiomes:fence_rail_acacia_wood", + { + description = S("Acacia Fence Rail"), + texture = "naturalbiomes_acacia_fence_wood.png", + inventory_image = "default_fence_rail_overlay.png^naturalbiomes_savannaacacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^naturalbiomes_savannaacacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "naturalbiomes:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + } +) + +minetest.register_decoration({ + name = "naturalbiomes:acacia_tree", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00071, + biomes = {"naturalbiomes:wetsavanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_acaciatree_0_180.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:acacia_tree3", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = -2, + sidelen = 16, + fill_ratio = 0.00071, + biomes = {"naturalbiomes:wetsavanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_acaciatree3.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + +minetest.register_decoration({ + name = "naturalbiomes:acacia_tree4", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = 0, + sidelen = 16, + fill_ratio = 0.00071, + biomes = {"naturalbiomes:wetsavanna"}, + y_max = 31000, + y_min = 2, + schematic = minetest.get_modpath("naturalbiomes").."/schematics/naturalbiomes_acaciatree4.mts", + flags = "place_center_x, place_center_z", + rotation = "random", +}) + + minetest.register_decoration({ + name = "naturalbiomes:savannagras", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"naturalbiomes:wetsavanna"}, + y_max = 31000, + y_min = 0, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_savannagrass1_0_90.mts", + }) + +minetest.register_node("naturalbiomes:savannagrass", { + description = S("Savanna Grass"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannagrass.png"}, + inventory_image = "naturalbiomes_savannagrass.png", + wield_image = "naturalbiomes_savannagrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:savannagrassmall", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"naturalbiomes:wetsavanna"}, + y_max = 31000, + y_min = 0, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_savannagrass2_0_90.mts", + }) + +minetest.register_node("naturalbiomes:savannagrasssmall", { + description = S("Savanna Grass"), + drawtype = "plantlike", + tiles = {"naturalbiomes_savannagrass.png"}, + inventory_image = "naturalbiomes_savannagrass.png", + wield_image = "naturalbiomes_savannagrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + + minetest.register_decoration({ + name = "naturalbiomes:savanna_flowergrass", + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.1, + spread = {x = 100, y = 100, z = 100}, + seed = 3602, + octaves = 5, + persist = 1, + }, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:savanna_flowergrass", + spawn_by = "naturalbiomes:savannalitter" + }) + +minetest.register_node("naturalbiomes:savanna_flowergrass", { + description = S"Savanna Flowergrass", + drawtype = "plantlike", + waving = 1, + visual_scale = 2.0, + tiles = {"naturalbiomes_savannagrasssmall.png"}, + inventory_image = "naturalbiomes_savannagrasssmall.png", + wield_image = "naturalbiomes_savannagrasssmall.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:savanna_grass2", + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + fill_ratio = 0.02871, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:savanna_grass2", + spawn_by = "naturalbiomes:savannalitter" + }) + +minetest.register_node("naturalbiomes:savanna_grass2", { + description = S"Savanna Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_savannagrass2.png"}, + inventory_image = "naturalbiomes_savannagrass2.png", + wield_image = "naturalbiomes_savannagrass2.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:savanna_grass3", + deco_type = "simple", + place_on = {"naturalbiomes:savannalitter"}, + sidelen = 16, + fill_ratio = 0.02871, + y_max = 30000, + y_min = 1, + decoration = "naturalbiomes:savanna_grass3", + spawn_by = "naturalbiomes:savannalitter" + }) + +minetest.register_node("naturalbiomes:savanna_grass3", { + description = S"Savanna Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"naturalbiomes_savannagrass3.png"}, + inventory_image = "naturalbiomes_savannagrass3.png", + wield_image = "naturalbiomes_savannagrass3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flower = 1, flora = 1, attached_node = 1, flammable = 1, beautiflowers = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 0.0, 4 / 16}, + }, + }) + + minetest.register_decoration({ + name = "naturalbiomes:acacia_log", + deco_type = "schematic", + place_on = {"naturalbiomes:savannalitter"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"naturalbiomes:wetsavanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("naturalbiomes") .. "/schematics/naturalbiomes_acacia_log_0_90.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "naturalbiomes:savannalitter", + num_spawn_by = 8, + }) + +if minetest.get_modpath("bonemeal") then + bonemeal:add_deco({ + {"naturalbiomes:savannalitter", {"naturalbiomes:savannagrass", "naturalbiomes:savannagrasssmall", "naturalbiomes:savanna_flowergrass", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3"}, {}} + }) +end + diff --git a/mods/people/LICENSE b/mods/people/LICENSE new file mode 100644 index 0000000..db41169 --- /dev/null +++ b/mods/people/LICENSE @@ -0,0 +1,31 @@ +MIT License + +Copyright (c) 2021 Skandarella + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Lincense for original Code (mobs redo + mobs_animal + mob_horse + mobs_npc): (MIT) Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2021 +Textures, Models and Animation by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2021 + +People Sounds by Liil/Wilhelmine/Skandarella. Animal Sounds + Environment are from freesound.org under Creative Commons License. +Thanks to Baidonovan, Timtube, Qubodup, Egomassive, Travisneedham, Mrauralization, Gibarroule, Acclivity, Inspectorj, O-ciz, +Lydmakeren, Shadeslayer99, Erokia, Filmscore, Anton, 15gpanskabokstefflova-nicola, Vataaa and Robinhood76 diff --git a/mods/people/aboinstructor.lua b/mods/people/aboinstructor.lua new file mode 100644 index 0000000..3d94b74 --- /dev/null +++ b/mods/people/aboinstructor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.aboinstructor_drops = { +"people:samwarrior" +} + +mobs:register_mob("people:aboinstructor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Instructor.b3d", + textures = { + {"textureaboinstructor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_instructor", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:instructorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:gold_ingot"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "people:emblemoftriumph" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.aboinstructor_drops or mobs.aboinstructor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for honor!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Instructor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Instructor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:aboinstructor", + nodes = {"default:junglewood"}, + neighbors = {"people:weaponstand"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:aboinstructor", S("Instructor Jungle"), "aaboinstructor.png") + +-- compatibility +mobs:alias_mob("people:aboinstructor", "people:aboinstructor") diff --git a/mods/people/abominer.lua b/mods/people/abominer.lua new file mode 100644 index 0000000..a049cb1 --- /dev/null +++ b/mods/people/abominer.lua @@ -0,0 +1,144 @@ + +local S = minetest.get_translator("people") + + +mobs.abominer_drops = { +"default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump", "default:diamond", "default:copper_lump", +"default:iron_lump", "default:tin_lump", "default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump" +} + +mobs:register_mob("people:abominer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + textures = { + {"textureabominer.png"}, + + }, + makes_footstep_sound = true, +sounds = { random = "people_miner", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:mineshaft", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:minergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:hemp_oil", "farming:hemp_leaf"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "farming:turkish_delight" or item:get_name() == "farming:donut_apple" or item:get_name() == "farming:porridge" or item:get_name() == "farming:jaffa_cake" or item:get_name() == "farming:apple_pie" or item:get_name() == "farming:spaghetti" or item:get_name() == "farming:burger" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:baked_potato" or item:get_name() == "farming:sunflower_bread" or item:get_name() == "farming:pumpkin_bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "farming:tomato_soup" or item:get_name() == "pie:brpd_0" or item:get_name() == "farming:bread" or item:get_name() == "farming:bread_multigrain" or item:get_name() == "farming:spanish_potatoes" or item:get_name() == "farming:beetroot_soup" or item:get_name() == "farming:farming:blueberry_pie" or item:get_name() == "farming:porridge" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:burger" or item:get_name() == "farming:paella" or item:get_name() == "farming:mac_and_cheese" or item:get_name() == "livingcaves:healingsoup" or item:get_name() == "farming:spaghetti" or item:get_name() == "animalworld:escargots" or item:get_name() == "farming:rhubarb_pie" or item:get_name() == "farming:potato_omlet" or item:get_name() == "farming:potato_salad" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.abominer_drops or mobs.abominer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for food!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Miner stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Miner will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:abominer", + nodes = {"default:junglewood"}, + neighbors = {"people:mineshaft"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:abominer", S("Miner Jungle"), "aabominer.png") + +-- compatibility +mobs:alias_mob("people:abominer", "people:abominer") diff --git a/mods/people/afrfarmer.lua b/mods/people/afrfarmer.lua new file mode 100644 index 0000000..cf1d154 --- /dev/null +++ b/mods/people/afrfarmer.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.afrfarmer_drops = { +"people:dog", "people:goat", "people:dogfoodsack", "people:ridepig", "people:rideostrich", "people:plough" +} + +mobs:register_mob("people:afrfarmer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medfarmer.b3d", + textures = { + {"textureafrfarmer.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_farmerm", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:feeder", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:farmergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:coal_lump"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.afrfarmer_drops or mobs.afrfarmer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Farmer dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Farmer stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Farmer will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:afrfarmer", + nodes = {"default:acacia_wood"}, + neighbors = {"people:feeder"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:afrfarmer", S("Farmer Acacia"), "aafrfarmer.png") + +-- compatibility +mobs:alias_mob("people:afrfarmer", "people:afrfarmer") diff --git a/mods/people/afrinstructor.lua b/mods/people/afrinstructor.lua new file mode 100644 index 0000000..4ddeecc --- /dev/null +++ b/mods/people/afrinstructor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.afrinstructor_drops = { +"people:afrwarrior" +} + +mobs:register_mob("people:afrinstructor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Instructor.b3d", + textures = { + {"textureafrinstructor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_instructor", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:instructorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:gold_ingot"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "people:emblemoftriumph" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.afrinstructor_drops or mobs.afrinstructor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for honor!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Instructor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Instructor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:afrinstructor", + nodes = {"default:acacia_wood"}, + neighbors = {"people:weaponstand"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:afrinstructor", S("Instructor Acacia"), "aafrinstructor.png") + +-- compatibility +mobs:alias_mob("people:afrinstructor", "people:afrinstructor") diff --git a/mods/people/afrsmith.lua b/mods/people/afrsmith.lua new file mode 100644 index 0000000..f27c149 --- /dev/null +++ b/mods/people/afrsmith.lua @@ -0,0 +1,152 @@ + +local S = minetest.get_translator("people") + + +mobs.afrsmith_drops = { +"default:axe_steel", "default:axe_steel", "default:axe_steel", +"default:axe_steel", "default:axe_mese", "default:axe_mese", +"default:axe_diamond", "default:axe_diamond", "default:pick_bronze", "default:pick_bronze","default:pick_steel", "default:pick_steel","default:pick_mese", "default:pick_mese", + "default:pick_diamond", "default:pick_diamond", + "default:shovel_bronze", "default:shovel_bronze", + "default:shovel_steel", "default:shovel_steel", + "default:shovel_mese", "default:shovel_mese", + "default:shovel_diamond", "default:shovel_diamond ", +"default:sword_bronze", "default:sword_bronze", "default:sword_steel", +"default:sword_steel", "default:sword_mese", "default:sword_mese", +"default:sword_diamond", "default:sword_diamond" +} + +mobs:register_mob("people:afrsmith", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medsmith.b3d", + textures = { + {"textureafrsmith.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_smith", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:forge", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:smithgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.afrsmith_drops or mobs.afrsmith_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Blackmith dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Blacksmith stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Blacksmith will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:afrsmith", + nodes = {"default:acacia_wood"}, + neighbors = {"people:forge"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:afrsmith", S("Blacksmith Acacia"), "aafrsmith.png") + +-- compatibility +mobs:alias_mob("people:afrsmith", "people:afrsmith") diff --git a/mods/people/afrwarrior.lua b/mods/people/afrwarrior.lua new file mode 100644 index 0000000..8e8c357 --- /dev/null +++ b/mods/people/afrwarrior.lua @@ -0,0 +1,155 @@ + +local S = minetest.get_translator("people") + +-- Npc by TenPlus1 + + +mobs:register_mob("people:afrwarrior", { + type = "npc", + passive = false, + damage = 10, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 12, -- shoot for 12 seconds + dogshoot_count2_max = 3, -- dogfight for 3 seconds + shoot_interval = 1.5, + arrow = "people:spearfly", + shoot_offset = 2, + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 100, + hp_max = 145, + armor = 80, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Warrior.b3d", + drawtype = "front", + textures = { + {"textureafrwarrior.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "people_warrior3", + random = "people_warrior2", + damage = "people_male5", + death = "people_warrior", + distance = 10, +}, + walk_velocity = 3, + run_velocity = 4, + jump = true, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + drops = { {name = "people:warriorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 20, + owner = "", + order = "stand", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + shoot_start = 300, + shoot_speed = 80, + shoot_end = 400, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Warrior stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Warrior will follow you.")) + end + end + end, + + + do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:afrwarrior" then + return false + end + + return true + end, +}) + + +mobs:register_egg("people:afrwarrior", S("Warrior Acacia"), "aafrwarrior.png" ) + +-- compatibility +mobs:alias_mob("people:afrwarrior", "people:afrwarrior") + +mobs:register_arrow("people:spearfly", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"spearfly.png"}, + velocity = 8, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) diff --git a/mods/people/aradoctor.lua b/mods/people/aradoctor.lua new file mode 100644 index 0000000..83c5c28 --- /dev/null +++ b/mods/people/aradoctor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.aradoctor_drops = { +"farming:hemp_leaf", "farming:hemp_oil", "farming:carrot_gold", "people:firsaidkit" +} + +mobs:register_mob("people:aradoctor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Doctor.b3d", + textures = { + {"texturearadoctor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_female", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:firstaidnode", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:doctorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:mint_tea"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.aradoctor_drops or mobs.aradoctor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Doctor dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Doctor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Doctor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:aradoctor", + nodes = {"default:acacia_wood"}, + neighbors = {"people:firstaidnode"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:aradoctor", S("Doctor Acacia"), "aaradoctor.png") + +-- compatibility +mobs:alias_mob("people:aradoctor", "people:aradoctor") diff --git a/mods/people/araminer.lua b/mods/people/araminer.lua new file mode 100644 index 0000000..c64de56 --- /dev/null +++ b/mods/people/araminer.lua @@ -0,0 +1,144 @@ + +local S = minetest.get_translator("people") + + +mobs.araminer_drops = { +"default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump", "default:diamond", "default:copper_lump", +"default:iron_lump", "default:tin_lump", "default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump" +} + +mobs:register_mob("people:araminer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + textures = { + {"texturearaminer.png"}, + + }, + makes_footstep_sound = true, +sounds = { random = "people_miner", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:mineshaft", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:minergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:hemp_oil", "farming:hemp_leaf"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "farming:turkish_delight" or item:get_name() == "farming:donut_apple" or item:get_name() == "farming:porridge" or item:get_name() == "farming:jaffa_cake" or item:get_name() == "farming:apple_pie" or item:get_name() == "farming:spaghetti" or item:get_name() == "farming:burger" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:baked_potato" or item:get_name() == "farming:sunflower_bread" or item:get_name() == "farming:pumpkin_bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "farming:tomato_soup" or item:get_name() == "pie:brpd_0" or item:get_name() == "farming:bread" or item:get_name() == "farming:bread_multigrain" or item:get_name() == "farming:spanish_potatoes" or item:get_name() == "farming:beetroot_soup" or item:get_name() == "farming:farming:blueberry_pie" or item:get_name() == "farming:porridge" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:burger" or item:get_name() == "farming:paella" or item:get_name() == "farming:mac_and_cheese" or item:get_name() == "livingcaves:healingsoup" or item:get_name() == "farming:spaghetti" or item:get_name() == "animalworld:escargots" or item:get_name() == "farming:rhubarb_pie" or item:get_name() == "farming:potato_omlet" or item:get_name() == "farming:potato_salad" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.araminer_drops or mobs.araminer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for food!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Miner stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Miner will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:araminer", + nodes = {"default:acacia_wood"}, + neighbors = {"people:mineshaft"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:araminer", S("Miner Acacia"), "aaraminer.png") + +-- compatibility +mobs:alias_mob("people:araminer", "people:araminer") diff --git a/mods/people/aravillager.lua b/mods/people/aravillager.lua new file mode 100644 index 0000000..af28376 --- /dev/null +++ b/mods/people/aravillager.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:aravillager", { + stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 2, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-0.8,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Villager.b3d", + visual_size = {x = 0.8, y = 0.8}, + textures = { + {"texturearavillager.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_female2", + damage = "people_female4", + death = "people_femaledeath", + distance = 10, + }, + walk_velocity = 1.5, + run_velocity = 2.5, + walk_chance = 10, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "people:pirate", "people:evilminer", "people:jealousminer", "people:hatefulminer", "people:plunderercrossbow", "people:plundererflask", "people:plundererstick"}, + jump = true, + jump_height = 6, + pushable = true, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 10, + drops = { {name = "people:villagergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + stay_near = {{"people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 65, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:aravillager", + nodes = {"default:acacia_wood"}, + neighbors = {"people:villagerbed"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:aravillager", S("Villager Acacia"), "aaravillager.png") + + +mobs:alias_mob("people:aravillager", "people:aravillager") -- compatibility diff --git a/mods/people/bootynode.lua b/mods/people/bootynode.lua new file mode 100644 index 0000000..bb3c4a6 --- /dev/null +++ b/mods/people/bootynode.lua @@ -0,0 +1,22 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:bootynode", { + description = S"Booty", + tiles = { + "people_bootynode_top.png", + "people_bootynode_bottom.png", + "people_bootynode_right.png", + "people_bootynode_left.png", + "people_bootynode_back.png", + "people_bootynode_front.png" + }, + groups = {choppy = 2}, + drop = "default:gold_lump 1", + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:bootynode", + burntime = 4, +}) diff --git a/mods/people/chindoctor.lua b/mods/people/chindoctor.lua new file mode 100644 index 0000000..ba95be6 --- /dev/null +++ b/mods/people/chindoctor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.chindoctor_drops = { +"farming:hemp_leaf", "farming:hemp_oil", "farming:carrot_gold", "people:firsaidkit" +} + +mobs:register_mob("people:chindoctor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Doctor.b3d", + textures = { + {"texturechindoctor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_female", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:firstaidnode", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:doctorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:mint_tea"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.chindoctor_drops or mobs.chindoctor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Doctor dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Doctor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Doctor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:chindoctor", + nodes = {"default:aspen_wood"}, + neighbors = {"people:firstaidnode"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:chindoctor", S("Doctor Aspen"), "achindoctor.png") + +-- compatibility +mobs:alias_mob("people:chindoctor", "people:chindoctor") diff --git a/mods/people/chinfarmer.lua b/mods/people/chinfarmer.lua new file mode 100644 index 0000000..67db86d --- /dev/null +++ b/mods/people/chinfarmer.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.chinfarmer_drops = { +"people:dog", "people:goat", "people:dogfoodsack", "people:ridepig", "people:ridereindeer", "people:plough" +} + +mobs:register_mob("people:chinfarmer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medfarmer2.b3d", + textures = { + {"texturechinfarmer.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_farmerf", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:feeder", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:farmergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:coal_lump"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.chinfarmer_drops or mobs.chinfarmer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Farmer dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Farmer stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Farmer will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:chinfarmer", + nodes = {"default:aspen_wood"}, + neighbors = {"people:feeder"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:chinfarmer", S("Farmer Aspen"), "achinfarmer.png") + +-- compatibility +mobs:alias_mob("people:chinfarmer", "people:chinfarmer") diff --git a/mods/people/chininstructor.lua b/mods/people/chininstructor.lua new file mode 100644 index 0000000..e302e5e --- /dev/null +++ b/mods/people/chininstructor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.chininstructor_drops = { +"people:ewewarrior" +} + +mobs:register_mob("people:chininstructor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Instructor.b3d", + textures = { + {"texturechininstructor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_instructor", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:instructorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:gold_ingot"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "people:emblemoftriumph" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.chininstructor_drops or mobs.chininstructor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for honor!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Instructor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Instructor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:chininstructor", + nodes = {"default:aspen_wood"}, + neighbors = {"people:weaponstand"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:chininstructor", S("Instructor Aspen"), "achininstructor.png") + +-- compatibility +mobs:alias_mob("people:chininstructor", "people:chininstructor") diff --git a/mods/people/chinsmith.lua b/mods/people/chinsmith.lua new file mode 100644 index 0000000..4eb0d85 --- /dev/null +++ b/mods/people/chinsmith.lua @@ -0,0 +1,152 @@ + +local S = minetest.get_translator("people") + + +mobs.chinsmith_drops = { +"default:axe_steel", "default:axe_steel", "default:axe_steel", +"default:axe_steel", "default:axe_mese", "default:axe_mese", +"default:axe_diamond", "default:axe_diamond", "default:pick_bronze", "default:pick_bronze","default:pick_steel", "default:pick_steel","default:pick_mese", "default:pick_mese", + "default:pick_diamond", "default:pick_diamond", + "default:shovel_bronze", "default:shovel_bronze", + "default:shovel_steel", "default:shovel_steel", + "default:shovel_mese", "default:shovel_mese", + "default:shovel_diamond", "default:shovel_diamond ", +"default:sword_bronze", "default:sword_bronze", "default:sword_steel", +"default:sword_steel", "default:sword_mese", "default:sword_mese", +"default:sword_diamond", "default:sword_diamond" +} + +mobs:register_mob("people:chinsmith", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medsmith.b3d", + textures = { + {"texturechinsmith.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_smith", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:forge", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:smithgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.chinsmith_drops or mobs.chinsmith_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Blackmith dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Blacksmith stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Blacksmith will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:chinsmith", + nodes = {"default:aspen_wood"}, + neighbors = {"people:forge"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:chinsmith", S("Blacksmith Aspen"), "achinsmith.png") + +-- compatibility +mobs:alias_mob("people:chinsmith", "people:chinsmith") diff --git a/mods/people/depends.txt b/mods/people/depends.txt new file mode 100644 index 0000000..ae20e9f --- /dev/null +++ b/mods/people/depends.txt @@ -0,0 +1,7 @@ +mobs +default +farming +ethereal? +xocean? +fishing? +hunger_ng? \ No newline at end of file diff --git a/mods/people/description.txt b/mods/people/description.txt new file mode 100644 index 0000000..9216875 --- /dev/null +++ b/mods/people/description.txt @@ -0,0 +1,3 @@ +Based on Mobs Redo. +Adds the possibility to build living villages in your Minetest Game world. +Trade items for random stuff from your villagers, recruit mounts and warriors. \ No newline at end of file diff --git a/mods/people/dog.lua b/mods/people/dog.lua new file mode 100644 index 0000000..396e6fc --- /dev/null +++ b/mods/people/dog.lua @@ -0,0 +1,153 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:dog", { + type = "animal", + visual = "mesh", + mesh = "Dog.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + animation = { + speed_normal = 100, + stand_speed = 50, + stand_start = 400, + stand_end = 500, + stand2_speed = 50, + stand2_start = 250, + stand2_end = 350, + stand3_speed = 50, + stand3_start = 400, + stand3_end = 500, + stand4_speed = 50, + stand4_start = 500, + stand4_end = 600, + stand5_speed = 50, + stand5_start = 500, + stand5_end = 600, + walk_start = 0, + walk_end = 100, + punch_start = 100, + punch_end = 200, + punch2_start = 100, + punch2_end = 200, + die_start = 100, + die_end = 200, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"texturedog.png"} + }, + child_texture = { + {"texturedogbaby.png"}, + }, + fear_height = 3, + runaway = false, + jump = true, + jump_height = 6, + fly = false, + walk_velocity = 1, + run_velocity = 4, + view_range = 10, + passive = false, + attack_type = "dogfight", + damage = 6, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npcs = false, + pathfinding = true, + group_attack = true, + hp_min = 45, + hp_max = 75, + armor = 100, + knock_back = 2, + lava_damage = 5, + fall_damage = 1, + water_damage = 0, + stay_near = {{"people:dogfoodsack", "mobs:meatblock"}, 5}, + makes_footstep_sound = true, + sounds = { + attack = "people_dog4", + random = "people_dog2", + damage = "people_dog3", + death = "people_dog5", + distance = 10, + }, + follow = {"people:dogfood", "people:dogfood_cooked", "livingfloatlands:theropodcooked", "mobs:meatblock", "animalworld:whelaemeat_cooked", "animalworld:rat_cooked", "mobs:meat", "animalworld:chicken_cooked", "livingfloatlands:sauropodcooked", "livingfloatlands:ornithischiacooked", "nativevillages:driedhumanmeat", "livingfloatlands:largemammalcooked", "pie:meat"}, + on_rightclick = function(self, clicker) + if mobs:feed_tame(self, clicker, 6, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 15, 25, 0, false, nil) then return end + + if clicker:get_wielded_item():is_empty() and clicker:get_player_name() == self.owner then + if clicker:get_player_control().sneak then + self.order = "" + self.state = "walk" + self.walk_velocity = 2 + self.stepheight = 2 + else + if self.order == "follow" then + self.order = "stand" + self.state = "stand" + self.walk_velocity = 2 + self.stepheight = 2 + else + self.order = "follow" + self.state = "walk" + self.walk_velocity = 3 + self.stepheight = 2 + end + end + return + end + end +}) + +mobs:register_egg("people:dog", S"Dog", "adog.png") +-- raw dogfood +minetest.register_craftitem(":people:dogfood", { + description = S("Dog Food"), + inventory_image = "people_dogfood.png", + on_use = minetest.item_eat(2), + groups = {food_meat_raw = 1, food_mutton_raw = 1, flammable = 2}, +}) + +-- cooked dogfood +minetest.register_craftitem(":people:dogfood_cooked", { + description = S("Cooked Dog Food"), + inventory_image = "people_dogfood_cooked.png", + on_use = minetest.item_eat(6), + groups = {food_meat = 1, food_mutton = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "people:dogfood_cooked", + recipe = "people:dogfood", + cooktime = 5, +}) + + +minetest.register_node("people:dogfoodsack", { + description = S"Sack of Dog Food", + tiles = { + "people_dogfoodsack_top.png", + "people_dogfoodsack_bottom.png", + "people_dogfoodsack_right.png", + "people_dogfoodsack_left.png", + "people_dogfoodsack_back.png", + "people_dogfoodsack_front.png" + }, + groups = {crumbly = 3}, + drop = "people:dogfood 9", + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_craft({ + output = "people:dogfoodsack", + recipe = { + {"people:dogfood", "people:dogfood", "people:dogfood"}, + {"people:dogfood", "people:dogfood", "people:dogfood"}, + {"people:dogfood", "people:dogfood", "people:dogfood"}, + } +}) \ No newline at end of file diff --git a/mods/people/evilminer.lua b/mods/people/evilminer.lua new file mode 100644 index 0000000..4588962 --- /dev/null +++ b/mods/people/evilminer.lua @@ -0,0 +1,82 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:evilminer", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 9, + hp_min = 55, + hp_max = 85, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"textureevilminer.png"}, + }, + sounds = { + attack = "people_evilminer2", + random = "people_evilminer4", + damage = "people_evilminer", + death = "people_evilminer3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + runaway = false, + jump = true, + stay_near = {{"default:stone_with_coal", "default:stone_with_copper", " default:stone_with_tin", "default:stone_with_iron", "default:stone_with_gold", "default:stone_with_mese", "default:stone_with_diamond"}, 5}, + drops = { + {name = "default:gold_lump", chance = 1, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:evilminer", + nodes = {"default:stone"}, + neighbors = {"default:stone_with_diamond", "default:mese"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + min_height = -1000, + max_height = -400, +}) +end + +mobs:register_egg("people:evilminer", S("Evil Miner"), "aevilminer.png") diff --git a/mods/people/eweminer.lua b/mods/people/eweminer.lua new file mode 100644 index 0000000..649a32c --- /dev/null +++ b/mods/people/eweminer.lua @@ -0,0 +1,144 @@ + +local S = minetest.get_translator("people") + + +mobs.eweminer_drops = { +"default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump", "default:diamond", "default:copper_lump", +"default:iron_lump", "default:tin_lump", "default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump" +} + +mobs:register_mob("people:eweminer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + textures = { + {"textureeweminer.png"}, + + }, + makes_footstep_sound = true, +sounds = { random = "people_miner", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:mineshaft", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:minergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:hemp_oil", "farming:hemp_leaf"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "farming:turkish_delight" or item:get_name() == "farming:donut_apple" or item:get_name() == "farming:porridge" or item:get_name() == "farming:jaffa_cake" or item:get_name() == "farming:apple_pie" or item:get_name() == "farming:spaghetti" or item:get_name() == "farming:burger" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:baked_potato" or item:get_name() == "farming:sunflower_bread" or item:get_name() == "farming:pumpkin_bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "farming:tomato_soup" or item:get_name() == "pie:brpd_0" or item:get_name() == "farming:bread" or item:get_name() == "farming:bread_multigrain" or item:get_name() == "farming:spanish_potatoes" or item:get_name() == "farming:beetroot_soup" or item:get_name() == "farming:farming:blueberry_pie" or item:get_name() == "farming:porridge" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:burger" or item:get_name() == "farming:paella" or item:get_name() == "farming:mac_and_cheese" or item:get_name() == "livingcaves:healingsoup" or item:get_name() == "farming:spaghetti" or item:get_name() == "animalworld:escargots" or item:get_name() == "farming:rhubarb_pie" or item:get_name() == "farming:potato_omlet" or item:get_name() == "farming:potato_salad" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.eweminer_drops or mobs.eweminer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for food!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Miner stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Miner will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:eweminer", + nodes = {"default:aspen_wood"}, + neighbors = {"people:mineshaft"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:eweminer", S("Miner Aspen"), "aeweminer.png") + +-- compatibility +mobs:alias_mob("people:eweminer", "people:eweminer") diff --git a/mods/people/ewevillager.lua b/mods/people/ewevillager.lua new file mode 100644 index 0000000..61c24b9 --- /dev/null +++ b/mods/people/ewevillager.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:ewevillager", { + stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 2, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-0.7,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Villager.b3d", + visual_size = {x = 0.7, y = 0.7}, + textures = { + {"textureewevillager.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_female2", + damage = "people_female4", + death = "people_femaledeath", + distance = 10, + }, + walk_velocity = 1.5, + run_velocity = 2.5, + walk_chance = 10, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "people:pirate", "people:evilminer", "people:jealousminer", "people:hatefulminer", "people:plunderercrossbow", "people:plundererflask", "people:plundererstick"}, + jump = true, + jump_height = 6, + stay_near = {{"people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + pushable = true, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 10, + drops = { {name = "people:villagergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 65, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:ewevillager", + nodes = {"default:aspen_wood"}, + neighbors = {"people:villagerbed"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:ewevillager", S("Villager Aspen"), "aewevillager.png") + + +mobs:alias_mob("people:ewevillager", "people:ewevillager") -- compatibility diff --git a/mods/people/ewewarrior.lua b/mods/people/ewewarrior.lua new file mode 100644 index 0000000..0de9b71 --- /dev/null +++ b/mods/people/ewewarrior.lua @@ -0,0 +1,155 @@ + +local S = minetest.get_translator("people") + +-- Npc by TenPlus1 + + +mobs:register_mob("people:ewewarrior", { + type = "npc", + passive = false, + damage = 10, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 12, -- shoot for 12 seconds + dogshoot_count2_max = 3, -- dogfight for 3 seconds + shoot_interval = 1.5, + arrow = "people:spearfly", + shoot_offset = 2, + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 100, + hp_max = 145, + armor = 80, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Warrior.b3d", + drawtype = "front", + textures = { + {"textureewewarrior.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "people_warrior3", + random = "people_warrior2", + damage = "people_male5", + death = "people_warrior", + distance = 10, +}, + walk_velocity = 3, + run_velocity = 4, + jump = true, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + drops = { {name = "people:warriorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 20, + owner = "", + order = "stand", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + shoot_start = 300, + shoot_speed = 80, + shoot_end = 400, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Warrior stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Warrior will follow you.")) + end + end + end, + + + do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:ewewarrior" then + return false + end + + return true + end, +}) + + +mobs:register_egg("people:ewewarrior", S("Warrior Aspen"), "aewewarrior.png" ) + +-- compatibility +mobs:alias_mob("people:ewewarrior", "people:ewewarrior") + +mobs:register_arrow("people:spearfly", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"spearfly.png"}, + velocity = 8, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) diff --git a/mods/people/feeder.lua b/mods/people/feeder.lua new file mode 100644 index 0000000..8452ae4 --- /dev/null +++ b/mods/people/feeder.lua @@ -0,0 +1,22 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:feeder", { + description = S"Feeder", + visual_scale = 1, + mesh = "Feeder.b3d", + tiles = {"texturefeeder.png"}, + inventory_image = "afeeder.png", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 2.0, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:feeder", + burntime = 4, +}) diff --git a/mods/people/firstaidnode.lua b/mods/people/firstaidnode.lua new file mode 100644 index 0000000..6e85a7c --- /dev/null +++ b/mods/people/firstaidnode.lua @@ -0,0 +1,20 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:firstaidnode", { + description = S"First Aid Node", + tiles = { + "people_firstaidnode_top.png", + "people_firstaidnode_bottom.png", + "people_firstaidnode_right.png", + "people_firstaidnode_left.png", + "people_firstaidnode_back.png", + "people_firstaidnode_front.png" + }, + groups = {choppy = 2} +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:firstaidnode", + burntime = 4, +}) diff --git a/mods/people/forge.lua b/mods/people/forge.lua new file mode 100644 index 0000000..85e0ac6 --- /dev/null +++ b/mods/people/forge.lua @@ -0,0 +1,35 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:forge", { + description = S"Anvil", + visual_scale = 0.5, + mesh = "Forge.b3d", + tiles = {"textureforge.png"}, + inventory_image = "aforge.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + walkable = false, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, + --[[{-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, + {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "people:forge", +}) \ No newline at end of file diff --git a/mods/people/goat.lua b/mods/people/goat.lua new file mode 100644 index 0000000..cc9eb15 --- /dev/null +++ b/mods/people/goat.lua @@ -0,0 +1,178 @@ +local S = minetest.get_translator("people") + + mobs:register_mob("people:goat", { + stay_near = {"farming:straw", 10, "people:feeder", 10}, + stepheight = 1, + type = "animal", + passive = true, + damage = 4, + hp_min = 25, + hp_max = 45, + armor = 100, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4}, + visual = "mesh", + mesh = "Goat.b3d", + textures = { + {"texturegoat.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_goat", + damage = "people_goat2", + distance = 5, +}, + walk_velocity = 1, + run_velocity = 2, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion", "animalworld:polarbear", "animalworld:leopardseal", "animalworld:stellerseagle", "animalworld:wolf", "animalworld:panda", "animalworld:stingray", "marinaramobs:jellyfish", "marinaramobs:octopus", "livingcavesmobs:biter", "livingcavesmobs:flesheatingbacteria"}, + jump = true, + jump_height = 3, + pushable = true, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + drops = { + {name = "people:mutton_raw", chance = 1, min = 1, max = 2}, + {name = "wool:white", chance = 1, min = 1, max = 2}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 50, + speed_run = 80, + stand_start = 0, + stand_end = 100, + walk_speed = 90, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + follow = { + "farming:wheat", "default:grass_1", "farming:barley", + "farming:oat", "farming:rye", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass" + }, + view_range = 8, + replace_rate = 10, + replace_what = { + {"group:grass", "air", -1}, + {"default:dirt_with_grass", "default:dirt", -2} + }, + fear_height = 2, + on_replace = function(self, pos, oldnode, newnode) + + self.food = (self.food or 0) + 1 + + -- if sheep replaces 8x grass then it regrows wool + if self.food >= 8 then + + self.food = 0 + self.gotten = false + + self.object:set_properties({ + textures = {"texturegoat.png"}, + mesh = "Goat.b3d", + }) + end + end, + on_rightclick = function(self, clicker) + + --are we feeding? + if mobs:feed_tame(self, clicker, 8, true, true) then + + --if fed 7 times then sheep regrows wool + if self.food and self.food > 6 then + + self.gotten = false + + self.object:set_properties({ + textures = {"texturegoat.png"}, + mesh = "Goat.b3d", + }) + end + + return + end + + local item = clicker:get_wielded_item() + local itemname = item:get_name() + local name = clicker:get_player_name() + + --are we giving a haircut> + if itemname == "mobs:shears" then + + if self.gotten ~= false + or self.child ~= false + or name ~= self.owner + or not minetest.get_modpath("wool") then + return + end + + self.gotten = true -- shaved + + local obj = minetest.add_item( + self.object:get_pos(), + ItemStack( "wool:white" ) + ) + + if obj then + + obj:setvelocity({ + x = math.random(-1, 1), + y = 5, + z = math.random(-1, 1) + }) + end + + item:add_wear(650) -- 100 uses + + clicker:set_wielded_item(item) + + self.object:set_properties({ + textures = {"texturegoat2.png"}, + mesh = "Goat.b3d", + }) + + return + end + + + + -- protect mod with mobs:protector item + if mobs:protect(self, clicker) then return end + + --are we capturing? + if mobs:capture_mob(self, clicker, 15, 0, 25, false, nil) then return end + end + }) + +mobs:register_egg("people:goat", S("Goat"), "agoat.png") + +mobs:alias_mob("people:goat", "people:goat") -- compatibility + +-- raw mutton +minetest.register_craftitem(":people:mutton_raw", { + description = S("Raw Mutton"), + inventory_image = "people_mutton_raw.png", + on_use = minetest.item_eat(2), + groups = {food_meat_raw = 1, food_mutton_raw = 1, flammable = 2}, +}) + +-- cooked mutton +minetest.register_craftitem(":people:mutton_cooked", { + description = S("Cooked Mutton"), + inventory_image = "people_mutton_cooked.png", + on_use = minetest.item_eat(6), + groups = {food_meat = 1, food_mutton = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "people:mutton_cooked", + recipe = "people:mutton_raw", + cooktime = 5, +}) diff --git a/mods/people/guide.txt b/mods/people/guide.txt new file mode 100644 index 0000000..9761bc2 --- /dev/null +++ b/mods/people/guide.txt @@ -0,0 +1,37 @@ +Guide: + +First you should reach a certain level of strength in Minetest, best above stone tech level, if you are playing Single Player or without NPCs to fight for you. +I recommend to use 3D Armor. +Brace yourself for your first contact with the plunderers, normally they come in a pack of melee and range and you can only beat one of them, +if you manage to separate a plunderer from the group. + +If you are lucky you will be victorious and gain your first item for attracting people. This could be an Anvil, Weaponstand, Feeder, Villager Bed, +Mineshaft or First Aid Node. + +If you haven't build a building yet, now is the time to come, because you need a wooden floor to place your gathered items on. +All 5 default wood types (apple, acacia, pine, aspen, jungle) are suitable for a building floor and will spawn different looking people. +After your first citizen has spawned, he is trading with you, but wont stay near your building. You first have to “tame” him or her, +every profession likes and needs different things: + +Blacksmith: Farming Dishes +Farmer: Coal Lumps +Doctor: Mint Tea +Miner: Hemp Oil + Hemp Leaves +Instructor: Gold Ingot +Warrior: Farming Dishes +Villager: Farming Dishes + +To get items from them, you need to trade the following things with them: + +Blacksmith: Gold Ingot +Farmer: Gold Ingot +Doctor: Gold Lump +Miner: Food (e.g. cooked dishes from the farming mod) + +After you satisfied your new resident, you can tell him or her to stay at place. If an enemy will raid your town and kill someone, +you will find a wooden cross. You can burn it in the furnace, or bury the dead, but beware: Do not forget to bury the citizens +in soil which provides the corpse the chance to rot, otherwise, a surprise will occur at night... + +To be successful you need to mine a lot of gold and use the trading system wisely, because its based on chance. + +There is some more stuff in this mod, but this will not be revealed here, the basics are enough to play successful, the rest should be discovered by yourself. diff --git a/mods/people/guideDE.txt b/mods/people/guideDE.txt new file mode 100644 index 0000000..416f2b4 --- /dev/null +++ b/mods/people/guideDE.txt @@ -0,0 +1,37 @@ +Handbuch: + +Zunächst sollten Sie in Minetest eine ausreichend hochrangige Ausrüstung(Waffen, Rüstung) erreichen, am besten über dem Stein-Tech-Level, wenn Sie Einzelspieler spielen oder ohne NPCs, die für Sie kämpfen. +Ich empfehle die Verwendung von 3D Armor. +Mach dich bereit für deinen ersten Kontakt mit den Plünderern! Normalerweise kommen sie in einer Gruppe aus Nah- und Fernkampf und du kannst nur einen von ihnen besiegen. +Dies ist am einfachsten, wenn es Ihnen gelingt, einen Plünderer von der Gruppe zu trennen. + +Wenn Sie Glück haben, werden Sie siegreich sein und Ihren ersten Gegenstand erhalten, um Menschen/Dorfbewohner anzuziehen. Dies könnte ein Amboss, ein Waffenständer, eine Futterstelle, ein Dorfbewohnerbett, +Minenschacht oder ein Erste-Hilfe-Knotenpunkt sein. + +Wenn Sie noch kein Gebäude gebaut haben, ist es jetzt an der Zeit, denn Sie brauchen einen Holzboden, auf dem Sie Ihre gesammelten Gegenstände platzieren können. +Alle 5 Standardholzarten (Apfel, Akazie, Kiefer, Espe, Dschungel) eignen sich für einen Gebäudeboden und bringen unterschiedlich aussehende Menschen hervor. +Nachdem Ihr erster Bürger gespawnt ist, handelt er mit Ihnen, bleibt aber nicht in der Nähe Ihres Gebäudes. Sie müssen ihn oder sie zuerst „zähmen“. Dafür müssen +sie Rohstoffe und andere Gegenstände opfern. +Jeder Beruf mag und braucht andere Dinge: + +Schmied: Landwirtschaftliche Gerichte +Bauer: Kohlenklumpen +Arzt: Pfefferminztee +Miner: Hanföl + Hanfblätter +Lehrer: Goldbarren +Krieger: Landwirtschaftliche Gerichte +Dorfbewohner: Landwirtschaftliche Gerichte + +Um Gegenstände von ihnen zu erhalten, müssen Sie folgende Dinge mit ihnen handeln: + +Schmied: Goldbarren +Bauer: Goldbarren +Arzt: Goldklumpen +Miner: Nahrungsmittel (z.B. Gekochte Gerichte aus dem Farming-Mod) +Ausbilder: Emblem des Triumphs + +Nachdem Sie Ihren neuen Bewohner zufrieden gestellt haben, können Sie ihm oder ihr sagen, dass er(sie an Ort und Stelle bleiben soll. Wenn ein Feind deine Stadt überfällt und jemanden tötet, +werden Sie ein Holzkreuz finden. Sie können es im Ofen verbrennen oder die Toten begraben, aber Vorsicht: Vergessen Sie nicht, die Bürger +in Erde zu begraben, die der Leiche Gelegenheit zum Verrotten gibt, sonst gibt es des Nachts eine Überraschung... + +Um erfolgreich zu sein, müssen Sie viel Gold abbauen und das Handelssystem mit Bedacht einsetzen, da es auf Zufall basiert. \ No newline at end of file diff --git a/mods/people/hatefulminer.lua b/mods/people/hatefulminer.lua new file mode 100644 index 0000000..299656a --- /dev/null +++ b/mods/people/hatefulminer.lua @@ -0,0 +1,82 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:hatefulminer", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 6, + hp_min = 35, + hp_max = 55, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturehatefulminer.png"}, + }, + sounds = { + attack = "people_evilminer2", + random = "people_evilminer4", + damage = "people_evilminer", + death = "people_evilminer3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + runaway = false, + jump = true, + stay_near = {{"default:stone_with_coal", "default:stone_with_copper", " default:stone_with_tin", "default:stone_with_iron", "default:stone_with_gold", "default:stone_with_mese", "default:stone_with_diamond"}, 5}, + drops = { + {name = "default:iron_lump", chance = 1, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:hatefulminer", + nodes = {"default:stone"}, + neighbors = {"default:stone_with_iron", "default:stone_with_gold"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + min_height = -300, + max_height = -80, +}) +end + +mobs:register_egg("people:hatefulminer", S("Hateful Miner"), "ahatefulminer.png") diff --git a/mods/people/hunger.lua b/mods/people/hunger.lua new file mode 100644 index 0000000..5a37f4d --- /dev/null +++ b/mods/people/hunger.lua @@ -0,0 +1,17 @@ +if minetest.get_modpath("hunger_ng") ~= nil then +hunger_ng.add_hunger_data('people:mutton_raw', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('people:mutton_cooked', { + satiates = 3.0, + }) + hunger_ng.add_hunger_data('people:dogfood', { + satiates = 1.0, + }) + hunger_ng.add_hunger_data('people:dogfood_cooked', { + satiates = 3.0, + }) + hunger_ng.add_hunger_data('people:bandage', { + heals = 20.0, +}) +end \ No newline at end of file diff --git a/mods/people/init.lua b/mods/people/init.lua new file mode 100644 index 0000000..0c012a2 --- /dev/null +++ b/mods/people/init.lua @@ -0,0 +1,97 @@ + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(path .. "intllib.lua") + +mobs.intllib = S + + +-- Check for custom mob spawn file +local input = io.open(path .. "spawn.lua", "r") + +if input then + mobs.custom_spawn_people = true + input:close() + input = nil +end + + +-- Animals +dofile(path .. "goat.lua") -- +dofile(path .. "dog.lua") -- +dofile(path .. "hunger.lua") -- +dofile(path .. "forge.lua") -- +dofile(path .. "feeder.lua") -- +dofile(path .. "weaponstand.lua") -- +dofile(path .. "villagerbed.lua") -- +dofile(path .. "mineshaft.lua") -- +dofile(path .. "firstaidnode.lua") -- +dofile(path .. "bootynode.lua") -- +dofile(path .. "plunderercrossbow.lua") -- +dofile(path .. "pirate.lua") -- +dofile(path .. "plundererstick.lua") -- +dofile(path .. "plundererflask.lua") -- +dofile(path .. "spawnbooty.lua") -- +dofile(path .. "medsmith.lua") -- +dofile(path .. "afrsmith.lua") -- +dofile(path .. "norsmith.lua") -- +dofile(path .. "chinsmith.lua") -- +dofile(path .. "samsmith.lua") -- +dofile(path .. "medfarmer.lua") -- +dofile(path .. "norfarmer.lua") -- +dofile(path .. "samfarmer.lua") -- +dofile(path .. "afrfarmer.lua") -- +dofile(path .. "chinfarmer.lua") -- +dofile(path .. "medvillager.lua") -- +dofile(path .. "aravillager.lua") -- +dofile(path .. "papvillager.lua") -- +dofile(path .. "ewevillager.lua") -- +dofile(path .. "norvillager.lua") -- +dofile(path .. "medminer.lua") -- +dofile(path .. "araminer.lua") -- +dofile(path .. "abominer.lua") -- +dofile(path .. "eweminer.lua") -- +dofile(path .. "norminer.lua") -- +dofile(path .. "jealousminer.lua") -- +dofile(path .. "hatefulminer.lua") -- +dofile(path .. "evilminer.lua") -- +dofile(path .. "meddoctor.lua") -- +dofile(path .. "aradoctor.lua") -- +dofile(path .. "chindoctor.lua") -- +dofile(path .. "nordoctor.lua") -- +dofile(path .. "papdoctor.lua") -- +dofile(path .. "medwarrior.lua") -- +dofile(path .. "norwarrior.lua") -- +dofile(path .. "samwarrior.lua") -- +dofile(path .. "ewewarrior.lua") -- +dofile(path .. "afrwarrior.lua") -- +dofile(path .. "medinstructor.lua") -- +dofile(path .. "norinstructor.lua") -- +dofile(path .. "chininstructor.lua") -- +dofile(path .. "afrinstructor.lua") -- +dofile(path .. "aboinstructor.lua") -- +dofile(path .. "zombiedoctor.lua") -- +dofile(path .. "zombiesmith.lua") -- +dofile(path .. "zombievillager.lua") -- +dofile(path .. "zombiewarrior.lua") -- +dofile(path .. "zombiefarmer.lua") -- +dofile(path .. "zombieinstructor.lua") -- +dofile(path .. "zombieminer.lua") -- +dofile(path .. "ridepig.lua") -- +dofile(path .. "rideelephant.lua") -- +dofile(path .. "rideostrich.lua") -- +dofile(path .. "ridehorse.lua") -- +dofile(path .. "ridereindeer.lua") -- +dofile(path .. "rideox.lua") -- +dofile(path .. "plough.lua") -- + +-- Load custom spawning +if mobs.custom_spawn_people then + dofile(path .. "spawn.lua") +end + + + +print (S("[MOD] Mobs Redo Animals loaded")) diff --git a/mods/people/intllib.lua b/mods/people/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/people/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/people/jealousminer.lua b/mods/people/jealousminer.lua new file mode 100644 index 0000000..a36f800 --- /dev/null +++ b/mods/people/jealousminer.lua @@ -0,0 +1,82 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:jealousminer", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 4, + hp_min = 15, + hp_max = 25, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturejealousminer.png"}, + }, + sounds = { + attack = "people_evilminer2", + random = "people_evilminer4", + damage = "people_evilminer", + death = "people_evilminer3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + runaway = false, + jump = true, + stay_near = {{"default:stone_with_coal", "default:stone_with_copper", " default:stone_with_tin", "default:stone_with_iron", "default:stone_with_gold", "default:stone_with_mese", "default:stone_with_diamond"}, 5}, + drops = { + {name = "default:copper_lump", chance = 1, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + water_damage = 5, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:jealousminer", + nodes = {"default:stone"}, + neighbors = {"default:stone_with_coal", "default:stone_with_copper"}, + min_light = 0, + interval = 60, + chance = 2, -- 15000 + min_height = -100, + max_height = 0, +}) +end + +mobs:register_egg("people:jealousminer", S("Jealous Miner"), "ajealousminer.png") diff --git a/mods/people/locale/people.de.tr b/mods/people/locale/people.de.tr new file mode 100644 index 0000000..ae86601 --- /dev/null +++ b/mods/people/locale/people.de.tr @@ -0,0 +1,85 @@ +# textdomain: people + +Instructor Jungle=Dschungel Ausbilder +Miner Jungle=Dschungel Minenarbeiter +Farmer Acacia=Akazien Bauer +Instructor Acacia=Akazien Ausbilder +Blacksmith Acacia=Akazien Schmied +Warrior Acacia=Akazien Krieger +Doctor Acacia=Akazien Arzt +Miner Acacia=Akazien Minenarbeiter +Villager Acacia=Akazien Dorfbewohner +Booty=Beute +Doctor Aspen=Espen Arzt +Farmer Aspen=Espen Bauer +Instructor Aspen=Espen Ausbilder +Blacksmith Aspen=Espen Schmied +Dog Food=Hundefutter +Cooked Dog Food=Gekochtes Hundefutter +Dog=Hund +Evil Miner=Bösartiger Minenarbeiter +Miner Aspen=Espen Minenarbeiter +Villager Aspen=Espen Dorfbewohner +Warrior Aspen=Espen Krieger +Feeder=Futtertrog +First Aid Node=Erste Hilfe Block +Anvil=Amboss +Goat=Ziege +Raw Mutton=Rohes Ziegenfleisch +Cooked Mutton=Gekochtes Ziegenfleisch +Hateful Miner=Hasserfüllter Minenarbeiter +Jealous Miner=Neidischer Minenarbeiter +Doctor Apple=Apfelbaum Arzt +Healing Bandage=Heilender Verband +Grave=Grab +Farmer Apple=Apfelbaum Bauer +Instructor Apple=Apfelbaum Ausbilder +Miner Apple=Apfelbaum Minenarbeiter +Blacksmith Apple=Apfelbaum Schmied +Villager Apple=Apfelbaum Dorfbewohner +Warrior Apple=Apfelbaum Krieger +Mineshaft=Minenschacht +Doctor dropped you an item for gold!=Der Arzt hat einen Gegenstand für Gold gegeben! +Doctor stands still.=Arzt bleibt stehen. +Doctor will follow you.=Arzt folgt dir. +Doctor Pine=Pinien Arzt +Farmer dropped you an item for gold!=Der Bauer hat einen Gegenstand für Gold gegeben! +Farmer stands still.=Bauer bleibt stehen. +Farmer will follow you.=Bauer folgt dir. +Farmer Pine=Pinien Bauer +Instructor dropped you an item for honor!=Ausbilder hat einen Gegenstand für Ehre gegeben! +Instructor Pine=Pinien Ausbilder +Miner dropped you an item for food!=Minenarbeiter hat einen Gegenstand für Nahrung gegeben! +Miner stands still.=Minenarbeiter bleibt stehen. +Miner will follow you.=Minenarbeiter wird dir folgen. +Miner Pine=Pinien Minenarbeiter +Blackmith dropped you an item for gold!=Schmied hat einen Gegenstand für Gold gegeben! +Blacksmith stands still.=Schmied bleibt stehen. +Blacksmith will follow you.=Schmied folgt dir. +Blacksmith Pine=Pinien Schmied +Villager Pine=Pinien Dorfbewohner +Warrior Pine=Pinien Krieger +Doctor Jungle=Dschungel Arzt +Villager Jungle=Dschungel Dorfbewohner +Pirate Plunderer=Piratenplünderer +Plunderer with Crossbow=Plünderer mit Armbrust +Plunderer with Flask=Plünderer mit Flasche +Plunderer with a Stick=Plünderer mit Kampfstab +Ridable Elephant=Reitbarer Elefant +Ridable Horse=Reitbares Pferd +Ridable Ostrich=Reitbarer Strauß +Ridable Ox=Ochsenkarren +Ridable Pig=Reitbares Schwein +Ridable Reindeer=Reitbares Rentier +Farmer Jungle=Dschungel Bauer +Blacksmith Jungle=Dschungel Schmied +Warrior Jungle=Dschungel Krieger +Villager Bed=Dorfbewohner Bett +Weaponstand=Waffenstand +Zombie=Zombie +Sack of Dog Food=Hundefuttersack +First Aid Kit=Erste Hilfe Kasten +Emblem of Triumph=Emblem des Triumphes +Plough stands still.=Pflug wartet. +Plough will follow you.=Pflug folgt dir. +Plough=Pflug \ No newline at end of file diff --git a/mods/people/meddoctor.lua b/mods/people/meddoctor.lua new file mode 100644 index 0000000..19dd16b --- /dev/null +++ b/mods/people/meddoctor.lua @@ -0,0 +1,194 @@ + +local S = mobs.intllib + + +mobs.meddoctor_drops = { +"farming:hemp_leaf", "farming:hemp_oil", "farming:carrot_gold", "people:firsaidkit" +} + +mobs:register_mob("people:meddoctor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Doctor.b3d", + textures = { + {"texturemeddoctor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_female", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:firstaidnode", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:doctorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:mint_tea"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.meddoctor_drops or mobs.meddoctor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Doctor dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Doctor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Doctor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:meddoctor", + nodes = {"default:wood"}, + neighbors = {"people:firstaidnode"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:meddoctor", S("Doctor Apple"), "ameddoctor.png") + +-- compatibility +mobs:alias_mob("people:meddoctor", "people:meddoctor") + +minetest.register_node("people:firsaidkit", { + description = S"First Aid Kit", + tiles = { + "people_firsaidkit_top.png", + "people_firsaidkit_bottom.png", + "people_firsaidkit_right.png", + "people_firsaidkit_left.png", + "people_firsaidkit_back.png", + "people_firsaidkit_front.png" + }, + groups = {crumbly = 3}, + drop = "people:bandage 9", + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_craft({ + output = "people:firsaidkit", + recipe = { + {"people:bandage", "people:bandage", "people:bandage"}, + {"people:bandage", "people:bandage", "people:bandage"}, + {"people:bandage", "people:bandage", "people:bandage"}, + } +}) + +-- bandage +minetest.register_craftitem(":people:bandage", { + description = S("Healing Bandage"), + inventory_image = "people_bandage.png", + on_use = minetest.item_eat(2), + groups = {food_meat_raw = 1, fleshy = 3, flammable = 2}, +}) + +minetest.register_node("people:doctorgrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:doctorgrave", + burntime = 6, +}) diff --git a/mods/people/medfarmer.lua b/mods/people/medfarmer.lua new file mode 100644 index 0000000..68056f1 --- /dev/null +++ b/mods/people/medfarmer.lua @@ -0,0 +1,163 @@ + +local S = minetest.get_translator("people") + + +mobs.medfarmer_drops = { +"people:dog", "people:goat", "people:dogfoodsack", "people:ridepig", "people:rideox", "people:plough" +} + +mobs:register_mob("people:medfarmer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medfarmer.b3d", + textures = { + {"texturemedfarmer.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_farmerm", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:feeder", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:farmergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:coal_lump"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.medfarmer_drops or mobs.medfarmer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Farmer dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Farmer stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Farmer will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:medfarmer", + nodes = {"default:wood"}, + neighbors = {"people:feeder"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:medfarmer", S("Farmer Apple"), "amedfarmer.png") + +-- compatibility +mobs:alias_mob("people:medfarmer", "people:medfarmer") + +minetest.register_node("people:farmergrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:farmergrave", + burntime = 6, +}) + diff --git a/mods/people/medinstructor.lua b/mods/people/medinstructor.lua new file mode 100644 index 0000000..f3b7dcd --- /dev/null +++ b/mods/people/medinstructor.lua @@ -0,0 +1,168 @@ + +local S = minetest.get_translator("people") + + +mobs.medinstructor_drops = { +"people:medwarrior" +} + +mobs:register_mob("people:medinstructor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Instructor.b3d", + textures = { + {"texturemedinstructor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_instructor", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:instructorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:gold_ingot"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "people:emblemoftriumph" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.medinstructor_drops or mobs.medinstructor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for honor!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Instructor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Instructor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:medinstructor", + nodes = {"default:wood"}, + neighbors = {"people:weaponstand"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:medinstructor", S("Instructor Apple"), "amedinstructor.png") + +-- compatibility +mobs:alias_mob("people:medinstructor", "people:medinstructor") + +minetest.register_craftitem("people:emblemoftriumph", { + description = S("Emblem of Triumph"), + inventory_image = "people_emblemoftriumph.png", +}) + + +minetest.register_node("people:instructorgrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:instructorgrave", + burntime = 6, +}) diff --git a/mods/people/medminer.lua b/mods/people/medminer.lua new file mode 100644 index 0000000..741647d --- /dev/null +++ b/mods/people/medminer.lua @@ -0,0 +1,164 @@ + +local S = minetest.get_translator("people") + + +mobs.medminer_drops = { +"default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump", "default:diamond", "default:copper_lump", +"default:iron_lump", "default:tin_lump", "default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump" +} + +mobs:register_mob("people:medminer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + textures = { + {"texturemedminer.png"}, + + }, + makes_footstep_sound = true, +sounds = { random = "people_miner", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:mineshaft", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:minergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:hemp_oil", "farming:hemp_leaf"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "farming:turkish_delight" or item:get_name() == "farming:donut_apple" or item:get_name() == "farming:porridge" or item:get_name() == "farming:jaffa_cake" or item:get_name() == "farming:apple_pie" or item:get_name() == "farming:spaghetti" or item:get_name() == "farming:burger" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:baked_potato" or item:get_name() == "farming:sunflower_bread" or item:get_name() == "farming:pumpkin_bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "farming:tomato_soup" or item:get_name() == "pie:brpd_0" or item:get_name() == "farming:bread" or item:get_name() == "farming:bread_multigrain" or item:get_name() == "farming:spanish_potatoes" or item:get_name() == "farming:beetroot_soup" or item:get_name() == "farming:farming:blueberry_pie" or item:get_name() == "farming:porridge" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:burger" or item:get_name() == "farming:paella" or item:get_name() == "farming:mac_and_cheese" or item:get_name() == "livingcaves:healingsoup" or item:get_name() == "farming:spaghetti" or item:get_name() == "animalworld:escargots" or item:get_name() == "farming:rhubarb_pie" or item:get_name() == "farming:potato_omlet" or item:get_name() == "farming:potato_salad" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.medminer_drops or mobs.medminer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("NPC dropped you an item for food!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Miner stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Miner will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:medminer", + nodes = {"default:wood"}, + neighbors = {"people:mineshaft"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:medminer", S("Miner Apple"), "amedminer.png") + +-- compatibility +mobs:alias_mob("people:medminer", "people:medminer") + +minetest.register_node("people:minergrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:minergrave", + burntime = 6, +}) diff --git a/mods/people/medsmith.lua b/mods/people/medsmith.lua new file mode 100644 index 0000000..231c300 --- /dev/null +++ b/mods/people/medsmith.lua @@ -0,0 +1,173 @@ + +local S = minetest.get_translator("people") + + +mobs.medsmith_drops = { +"default:axe_steel", "default:axe_steel", "default:axe_steel", +"default:axe_steel", "default:axe_mese", "default:axe_mese", +"default:axe_diamond", "default:axe_diamond", "default:pick_bronze", "default:pick_bronze","default:pick_steel", "default:pick_steel","default:pick_mese", "default:pick_mese", + "default:pick_diamond", "default:pick_diamond", + "default:shovel_bronze", "default:shovel_bronze", + "default:shovel_steel", "default:shovel_steel", + "default:shovel_mese", "default:shovel_mese", + "default:shovel_diamond", "default:shovel_diamond ", +"default:sword_bronze", "default:sword_bronze", "default:sword_steel", +"default:sword_steel", "default:sword_mese", "default:sword_mese", +"default:sword_diamond", "default:sword_diamond" +} + +mobs:register_mob("people:medsmith", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medsmith.b3d", + textures = { + {"texturemedsmith.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_smith", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:forge", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:smithgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.medsmith_drops or mobs.medsmith_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Blackmith dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Blacksmith stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Blacksmith will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:medsmith", + nodes = {"default:wood"}, + neighbors = {"people:forge"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:medsmith", S("Blacksmith Apple"), "amedsmith.png") + +-- compatibility +mobs:alias_mob("people:medsmith", "people:medsmith") + +minetest.register_node("people:smithgrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:smithgrave", + burntime = 6, +}) + diff --git a/mods/people/medvillager.lua b/mods/people/medvillager.lua new file mode 100644 index 0000000..6ea8498 --- /dev/null +++ b/mods/people/medvillager.lua @@ -0,0 +1,108 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:medvillager", { + stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 2, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-0.7,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Villager.b3d", + visual_size = {x = 0.7, y = 0.7}, + textures = { + {"texturemedvillager.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_female2", + damage = "people_female4", + death = "people_femaledeath", + distance = 10, + }, + walk_velocity = 1.5, + run_velocity = 2.5, + walk_chance = 10, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "people:pirate", "people:evilminer", "people:jealousminer", "people:hatefulminer", "people:plunderercrossbow", "people:plundererflask", "people:plundererstick"}, + jump = true, + jump_height = 6, + pushable = true, + stay_near = {{"people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 10, + drops = { {name = "people:villagergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 65, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:medvillager", + nodes = {"default:wood"}, + neighbors = {"people:villagerbed"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:medvillager", S("Villager Apple"), "amedvillager.png") + + +mobs:alias_mob("people:medvillager", "people:medvillager") -- compatibility + +minetest.register_node("people:villagergrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:villagergrave", + burntime = 6, +}) + diff --git a/mods/people/medwarrior.lua b/mods/people/medwarrior.lua new file mode 100644 index 0000000..c8ec613 --- /dev/null +++ b/mods/people/medwarrior.lua @@ -0,0 +1,175 @@ + +local S = minetest.get_translator("people") + +-- Npc by TenPlus1 + + +mobs:register_mob("people:medwarrior", { + type = "npc", + passive = false, + damage = 10, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 12, -- shoot for 12 seconds + dogshoot_count2_max = 3, -- dogfight for 3 seconds + shoot_interval = 1.5, + arrow = "people:spearfly", + shoot_offset = 2, + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 100, + hp_max = 145, + armor = 80, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Warrior.b3d", + drawtype = "front", + textures = { + {"texturemedwarrior.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "people_warrior3", + random = "people_warrior2", + damage = "people_male5", + death = "people_warrior", + distance = 10, +}, + walk_velocity = 3, + run_velocity = 4, + jump = true, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + drops = { {name = "people:warriorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 20, + owner = "", + order = "stand", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + shoot_start = 300, + shoot_speed = 80, + shoot_end = 400, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Warrior stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Warrior will follow you.")) + end + end + end, + + do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:medwarrior" then + return false + end + + return true + end, +}) + + +mobs:register_egg("people:medwarrior", S("Warrior Apple"), "amedwarrior.png" ) + +-- compatibility +mobs:alias_mob("people:medwarrior", "people:medwarrior") + +mobs:register_arrow("people:spearfly", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"spearfly.png"}, + velocity = 8, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) + +minetest.register_node("people:warriorgrave", { + description = S"Grave", + visual_scale = 1, + mesh = "Grave.b3d", + tiles = {"texturegrave.png"}, + inventory_image = "agrave.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:warriorgrave", + burntime = 6, +}) + diff --git a/mods/people/mineshaft.lua b/mods/people/mineshaft.lua new file mode 100644 index 0000000..896cc04 --- /dev/null +++ b/mods/people/mineshaft.lua @@ -0,0 +1,34 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:mineshaft", { + description = S"Mineshaft", + visual_scale = 1.0, + mesh = "Mineshaft.b3d", + tiles = {"texturemineshaft.png"}, + inventory_image = "amineshaft.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-1, -0.5, -1, 1, -0.2, 1}, + --[[{-1, -0.5, -1, 1, -0.2, 1}, + {-1, -0.5, -1, 1, -0.2, 1}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -1, 1, -0.2, 1} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:mineshaft", + burntime = 8, +}) diff --git a/mods/people/mod.conf b/mods/people/mod.conf new file mode 100644 index 0000000..63dc26d --- /dev/null +++ b/mods/people/mod.conf @@ -0,0 +1 @@ +name = people diff --git a/mods/people/models/Doctor.b3d b/mods/people/models/Doctor.b3d new file mode 100644 index 0000000..f8d184e Binary files /dev/null and b/mods/people/models/Doctor.b3d differ diff --git a/mods/people/models/Dog.b3d b/mods/people/models/Dog.b3d new file mode 100644 index 0000000..9f468ef Binary files /dev/null and b/mods/people/models/Dog.b3d differ diff --git a/mods/people/models/Feeder.b3d b/mods/people/models/Feeder.b3d new file mode 100644 index 0000000..dc63cce Binary files /dev/null and b/mods/people/models/Feeder.b3d differ diff --git a/mods/people/models/Forge.b3d b/mods/people/models/Forge.b3d new file mode 100644 index 0000000..16476ea Binary files /dev/null and b/mods/people/models/Forge.b3d differ diff --git a/mods/people/models/Goat.b3d b/mods/people/models/Goat.b3d new file mode 100644 index 0000000..908cd2b Binary files /dev/null and b/mods/people/models/Goat.b3d differ diff --git a/mods/people/models/Grave.b3d b/mods/people/models/Grave.b3d new file mode 100644 index 0000000..53bb5e5 Binary files /dev/null and b/mods/people/models/Grave.b3d differ diff --git a/mods/people/models/Instructor.b3d b/mods/people/models/Instructor.b3d new file mode 100644 index 0000000..ec71cc4 Binary files /dev/null and b/mods/people/models/Instructor.b3d differ diff --git a/mods/people/models/Medfarmer.b3d b/mods/people/models/Medfarmer.b3d new file mode 100644 index 0000000..a5a9466 Binary files /dev/null and b/mods/people/models/Medfarmer.b3d differ diff --git a/mods/people/models/Medfarmer2.b3d b/mods/people/models/Medfarmer2.b3d new file mode 100644 index 0000000..a5cfbce Binary files /dev/null and b/mods/people/models/Medfarmer2.b3d differ diff --git a/mods/people/models/Medsmith.b3d b/mods/people/models/Medsmith.b3d new file mode 100644 index 0000000..07c142c Binary files /dev/null and b/mods/people/models/Medsmith.b3d differ diff --git a/mods/people/models/Medsmith2.b3d b/mods/people/models/Medsmith2.b3d new file mode 100644 index 0000000..4a45c7b Binary files /dev/null and b/mods/people/models/Medsmith2.b3d differ diff --git a/mods/people/models/Miner.b3d b/mods/people/models/Miner.b3d new file mode 100644 index 0000000..0b2f243 Binary files /dev/null and b/mods/people/models/Miner.b3d differ diff --git a/mods/people/models/Mineshaft.b3d b/mods/people/models/Mineshaft.b3d new file mode 100644 index 0000000..ad7eb1a Binary files /dev/null and b/mods/people/models/Mineshaft.b3d differ diff --git a/mods/people/models/Pirate.b3d b/mods/people/models/Pirate.b3d new file mode 100644 index 0000000..65c5db6 Binary files /dev/null and b/mods/people/models/Pirate.b3d differ diff --git a/mods/people/models/Plough.b3d b/mods/people/models/Plough.b3d new file mode 100644 index 0000000..18b86e4 Binary files /dev/null and b/mods/people/models/Plough.b3d differ diff --git a/mods/people/models/Plunderercrossbow.b3d b/mods/people/models/Plunderercrossbow.b3d new file mode 100644 index 0000000..464ed0a Binary files /dev/null and b/mods/people/models/Plunderercrossbow.b3d differ diff --git a/mods/people/models/Plundererflask.b3d b/mods/people/models/Plundererflask.b3d new file mode 100644 index 0000000..4ffec37 Binary files /dev/null and b/mods/people/models/Plundererflask.b3d differ diff --git a/mods/people/models/Plundererstick.b3d b/mods/people/models/Plundererstick.b3d new file mode 100644 index 0000000..7a0c1e6 Binary files /dev/null and b/mods/people/models/Plundererstick.b3d differ diff --git a/mods/people/models/Rideelephant.b3d b/mods/people/models/Rideelephant.b3d new file mode 100644 index 0000000..7f349ee Binary files /dev/null and b/mods/people/models/Rideelephant.b3d differ diff --git a/mods/people/models/Ridehorse.b3d b/mods/people/models/Ridehorse.b3d new file mode 100644 index 0000000..36291d4 Binary files /dev/null and b/mods/people/models/Ridehorse.b3d differ diff --git a/mods/people/models/Rideostrich.b3d b/mods/people/models/Rideostrich.b3d new file mode 100644 index 0000000..1a2052c Binary files /dev/null and b/mods/people/models/Rideostrich.b3d differ diff --git a/mods/people/models/Rideox.b3d b/mods/people/models/Rideox.b3d new file mode 100644 index 0000000..e04ded7 Binary files /dev/null and b/mods/people/models/Rideox.b3d differ diff --git a/mods/people/models/Ridepig.b3d b/mods/people/models/Ridepig.b3d new file mode 100644 index 0000000..c1963cd Binary files /dev/null and b/mods/people/models/Ridepig.b3d differ diff --git a/mods/people/models/Ridereindeer.b3d b/mods/people/models/Ridereindeer.b3d new file mode 100644 index 0000000..b1bfdea Binary files /dev/null and b/mods/people/models/Ridereindeer.b3d differ diff --git a/mods/people/models/Villager.b3d b/mods/people/models/Villager.b3d new file mode 100644 index 0000000..b0c25b3 Binary files /dev/null and b/mods/people/models/Villager.b3d differ diff --git a/mods/people/models/Villagerbed.b3d b/mods/people/models/Villagerbed.b3d new file mode 100644 index 0000000..42fe0fa Binary files /dev/null and b/mods/people/models/Villagerbed.b3d differ diff --git a/mods/people/models/Warrior.b3d b/mods/people/models/Warrior.b3d new file mode 100644 index 0000000..08d359f Binary files /dev/null and b/mods/people/models/Warrior.b3d differ diff --git a/mods/people/models/Weaponstand.b3d b/mods/people/models/Weaponstand.b3d new file mode 100644 index 0000000..4cbf8ab Binary files /dev/null and b/mods/people/models/Weaponstand.b3d differ diff --git a/mods/people/models/Zombie.b3d b/mods/people/models/Zombie.b3d new file mode 100644 index 0000000..8580ed2 Binary files /dev/null and b/mods/people/models/Zombie.b3d differ diff --git a/mods/people/nordoctor.lua b/mods/people/nordoctor.lua new file mode 100644 index 0000000..4891c2b --- /dev/null +++ b/mods/people/nordoctor.lua @@ -0,0 +1,141 @@ + +local S = minetest.get_translator("people") + +mobs.nordoctor_drops = { +"farming:hemp_leaf", "farming:hemp_oil", "farming:carrot_gold", "people:firsaidkit" +} + +mobs:register_mob("people:nordoctor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Doctor.b3d", + textures = { + {"texturenordoctor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_female", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:firstaidnode", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:doctorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:mint_tea"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.nordoctor_drops or mobs.nordoctor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Doctor dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Doctor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Doctor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:nordoctor", + nodes = {"default:acacia_wood"}, + neighbors = {"people:firstaidnode"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:nordoctor", S("Doctor Pine"), "anordoctor.png") + +-- compatibility +mobs:alias_mob("people:nordoctor", "people:nordoctor") diff --git a/mods/people/norfarmer.lua b/mods/people/norfarmer.lua new file mode 100644 index 0000000..9194d3b --- /dev/null +++ b/mods/people/norfarmer.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.norfarmer_drops = { +"people:dog", "people:goat", "people:dogfoodsack", "people:ridepig", "people:ridehorse", "people:plough" +} + +mobs:register_mob("people:norfarmer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medfarmer2.b3d", + textures = { + {"texturenorfarmer.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_farmerf", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:feeder", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:farmergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:coal_lump"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.norfarmer_drops or mobs.norfarmer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Farmer dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Farmer stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Farmer will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:norfarmer", + nodes = {"default:pine_wood"}, + neighbors = {"people:feeder"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:norfarmer", S("Farmer Pine"), "anorfarmer.png") + +-- compatibility +mobs:alias_mob("people:norfarmer", "people:norfarmer") diff --git a/mods/people/norinstructor.lua b/mods/people/norinstructor.lua new file mode 100644 index 0000000..3e3c842 --- /dev/null +++ b/mods/people/norinstructor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.norinstructor_drops = { +"people:norwarrior" +} + +mobs:register_mob("people:norinstructor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Instructor.b3d", + textures = { + {"texturenorinstructor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_instructor", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:instructorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1.5, + lava_damage = 3, + light_damage = 0, + follow = {"default:gold_ingot"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "people:emblemoftriumph" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.norinstructor_drops or mobs.norinstructor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Instructor dropped you an item for honor!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Instructor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Instructor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:norinstructor", + nodes = {"default:pine_wood"}, + neighbors = {"people:weaponstand"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:norinstructor", S("Instructor Pine"), "anorinstructor.png") + +-- compatibility +mobs:alias_mob("people:norinstructor", "people:norinstructor") diff --git a/mods/people/norminer.lua b/mods/people/norminer.lua new file mode 100644 index 0000000..672fc6a --- /dev/null +++ b/mods/people/norminer.lua @@ -0,0 +1,144 @@ + +local S = minetest.get_translator("people") + + +mobs.norminer_drops = { +"default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump", "default:diamond", "default:copper_lump", +"default:iron_lump", "default:tin_lump", "default:copper_lump", "default:tin_lump", "default:iron_lump", +"default:gold_lump" +} + +mobs:register_mob("people:norminer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Miner.b3d", + textures = { + {"texturenorminer.png"}, + + }, + makes_footstep_sound = true, +sounds = { random = "people_miner", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:mineshaft", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:minergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:hemp_oil", "farming:hemp_leaf"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "farming:turkish_delight" or item:get_name() == "farming:donut_apple" or item:get_name() == "farming:porridge" or item:get_name() == "farming:jaffa_cake" or item:get_name() == "farming:apple_pie" or item:get_name() == "farming:spaghetti" or item:get_name() == "farming:burger" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:baked_potato" or item:get_name() == "farming:sunflower_bread" or item:get_name() == "farming:pumpkin_bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "farming:tomato_soup" or item:get_name() == "pie:brpd_0" or item:get_name() == "farming:bread" or item:get_name() == "farming:bread_multigrain" or item:get_name() == "farming:spanish_potatoes" or item:get_name() == "farming:beetroot_soup" or item:get_name() == "farming:farming:blueberry_pie" or item:get_name() == "farming:porridge" or item:get_name() == "farming:bibimbap" or item:get_name() == "farming:burger" or item:get_name() == "farming:paella" or item:get_name() == "farming:mac_and_cheese" or item:get_name() == "livingcaves:healingsoup" or item:get_name() == "farming:spaghetti" or item:get_name() == "animalworld:escargots" or item:get_name() == "farming:rhubarb_pie" or item:get_name() == "farming:potato_omlet" or item:get_name() == "farming:potato_salad" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.norminer_drops or mobs.norminer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Miner dropped you an item for food!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Miner stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Miner will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:norminer", + nodes = {"default:pine_wood"}, + neighbors = {"people:mineshaft"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:norminer", S("Miner Pine"), "anorminer.png") + +-- compatibility +mobs:alias_mob("people:norminer", "people:norminer") diff --git a/mods/people/norsmith.lua b/mods/people/norsmith.lua new file mode 100644 index 0000000..2f8ffcf --- /dev/null +++ b/mods/people/norsmith.lua @@ -0,0 +1,152 @@ + +local S = minetest.get_translator("people") + + +mobs.norsmith_drops = { +"default:axe_steel", "default:axe_steel", "default:axe_steel", +"default:axe_steel", "default:axe_mese", "default:axe_mese", +"default:axe_diamond", "default:axe_diamond", "default:pick_bronze", "default:pick_bronze","default:pick_steel", "default:pick_steel","default:pick_mese", "default:pick_mese", + "default:pick_diamond", "default:pick_diamond", + "default:shovel_bronze", "default:shovel_bronze", + "default:shovel_steel", "default:shovel_steel", + "default:shovel_mese", "default:shovel_mese", + "default:shovel_diamond", "default:shovel_diamond ", +"default:sword_bronze", "default:sword_bronze", "default:sword_steel", +"default:sword_steel", "default:sword_mese", "default:sword_mese", +"default:sword_diamond", "default:sword_diamond" +} + +mobs:register_mob("people:norsmith", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medsmith2.b3d", + textures = { + {"texturenorsmith.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_smith", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:forge", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:smithgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.norsmith_drops or mobs.norsmith_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Blackmith dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Blacksmith stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Blacksmith will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:norsmith", + nodes = {"default:pine_wood"}, + neighbors = {"people:forge"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:norsmith", S("Blacksmith Pine"), "anorsmith.png") + +-- compatibility +mobs:alias_mob("people:norsmith", "people:norsmith") diff --git a/mods/people/norvillager.lua b/mods/people/norvillager.lua new file mode 100644 index 0000000..a9a0d5a --- /dev/null +++ b/mods/people/norvillager.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:norvillager", { + stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 2, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-0.9,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Villager.b3d", + visual_size = {x = 0.9, y = 0.9}, + textures = { + {"texturenorvillager.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_female2", + damage = "people_female4", + death = "people_femaledeath", + distance = 10, + }, + walk_velocity = 1.5, + run_velocity = 2.5, + walk_chance = 10, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "people:pirate", "people:evilminer", "people:jealousminer", "people:hatefulminer", "people:plunderercrossbow", "people:plundererflask", "people:plundererstick"}, + jump = true, + jump_height = 6, + pushable = true, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 10, + drops = { {name = "people:villagergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + stay_near = {{"people:villagerbed", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 65, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:norvillager", + nodes = {"default:pine_wood"}, + neighbors = {"people:villagerbed"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:norvillager", S("Villager Pine"), "anorvillager.png") + + +mobs:alias_mob("people:norvillager", "people:norvillager") -- compatibility diff --git a/mods/people/norwarrior.lua b/mods/people/norwarrior.lua new file mode 100644 index 0000000..6fb4ca3 --- /dev/null +++ b/mods/people/norwarrior.lua @@ -0,0 +1,154 @@ + +local S = minetest.get_translator("people") + +-- Npc by TenPlus1 + + +mobs:register_mob("people:norwarrior", { + type = "npc", + passive = false, + damage = 10, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 12, -- shoot for 10 seconds + dogshoot_count2_max = 3, -- dogfight for 3 seconds + shoot_interval = 1.5, + arrow = "people:spearfly", + shoot_offset = 2, + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 100, + hp_max = 145, + armor = 80, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Warrior.b3d", + drawtype = "front", + textures = { + {"texturenorwarrior.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "people_warrior3", + random = "people_warrior2", + damage = "people_male5", + death = "people_warrior", + distance = 10, +}, + walk_velocity = 3, + run_velocity = 4, + jump = true, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + drops = { {name = "people:warriorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 20, + owner = "", + order = "stand", + fear_height = 3, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + shoot_start = 300, + shoot_speed = 80, + shoot_end = 400, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Warrior stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Warrior will follow you.")) + end + end + end, + + do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:norwarrior" then + return false + end + + return true + end, +}) + + +mobs:register_egg("people:norwarrior", S("Warrior Pine"), "anorwarrior.png" ) + +-- compatibility +mobs:alias_mob("people:norwarrior", "people:norwarrior") + +mobs:register_arrow("people:spearfly", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"spearfly.png"}, + velocity = 8, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) diff --git a/mods/people/papdoctor.lua b/mods/people/papdoctor.lua new file mode 100644 index 0000000..d08c43d --- /dev/null +++ b/mods/people/papdoctor.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.papdoctor_drops = { +"farming:hemp_leaf", "farming:hemp_oil", "farming:carrot_gold", "people:firsaidkit" +} + +mobs:register_mob("people:papdoctor", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Doctor.b3d", + textures = { + {"texturepapdoctor.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_female", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:firstaidnode", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:doctorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"farming:mint_tea"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_lump" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.papdoctor_drops or mobs.papdoctor_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Doctor dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Doctor stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Doctor will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:papdoctor", + nodes = {"default:junglewood"}, + neighbors = {"people:firstaidnode"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:papdoctor", S("Doctor Jungle"), "apapdoctor.png") + +-- compatibility +mobs:alias_mob("people:papdoctor", "people:apapdoctor") diff --git a/mods/people/papvillager.lua b/mods/people/papvillager.lua new file mode 100644 index 0000000..5a2c613 --- /dev/null +++ b/mods/people/papvillager.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:papvillager", { + stepheight = 1, + type = "animal", + passive = true, + attack_type = "dogfight", + group_attack = true, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 2, + hp_min = 30, + hp_max = 60, + armor = 100, + collisionbox = {-0.35,-0.7,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Villager.b3d", + visual_size = {x = 0.7, y = 0.7}, + textures = { + {"texturepapvillager.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_female2", + damage = "people_female4", + death = "people_femaledeath", + distance = 10, + }, + walk_velocity = 1.5, + run_velocity = 2.5, + walk_chance = 10, + runaway = true, + runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "people:pirate", "people:evilminer", "people:jealousminer", "people:hatefulminer", "people:plunderercrossbow", "people:plundererflask", "people:plundererstick"}, + jump = true, + jump_height = 6, + pushable = true, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 10, + stay_near = {{"people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:villagergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 5, + light_damage = 0, + fear_height = 2, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 65, + walk_start = 200, + walk_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 8, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:papvillager", + nodes = {"default:junglewood"}, + neighbors = {"people:villagerbed"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:papvillager", S("Villager Jungle"), "apapvillager.png") + + +mobs:alias_mob("people:papvillager", "people:papvillager") -- compatibility diff --git a/mods/people/pirate.lua b/mods/people/pirate.lua new file mode 100644 index 0000000..b40406c --- /dev/null +++ b/mods/people/pirate.lua @@ -0,0 +1,105 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:pirate", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 12, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Pirate.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturepirate.png"}, + }, + sounds = { + attack = "people_plundererpirate", + random = "people_plundererpirate2", + damage = "people_plundererpirate3", + death = "people_plundererpirate", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 2, + run_velocity = 4, + walk_chance = 10, + runaway = false, + stay_near = {{"people:bootynode"}, 5}, + jump = true, + drops = { + {name = "people:forge", chance = 7, min = 1, max = 1}, + {name = "people:feeder", chance = 7, min = 1, max = 1}, + {name = "people:mineshaft", chance = 7, min = 1, max = 1}, + {name = "people:villagerbed", chance = 7, min = 1, max = 1}, + {name = "people:weaponstand", chance = 7, min = 1, max = 1}, + {name = "people:firstaidnode", chance = 7, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 100, + stand_speed = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + +do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:pirate" then + return false + end + + return true + end, + + + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:pirate", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick"}, + neighbors = {"people:bootynode"}, + min_light = 0, + interval = 30, + active_object_count = 2, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:pirate", S("Pirate Plunderer"), "apirate.png") diff --git a/mods/people/plough.lua b/mods/people/plough.lua new file mode 100644 index 0000000..93f6f01 --- /dev/null +++ b/mods/people/plough.lua @@ -0,0 +1,114 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:plough", { + type = "npc", + passive = true, + damage = 3, + reach = 2, + group_attack = false, + attack_type = "dogfight", + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 80, + hp_max = 120, + armor = 100, + collisionbox = {-1.0,-0.1,-1.0, 1.0,1.0,1.0}, + visual = "mesh", + mesh = "Plough.b3d", + drawtype = "front", + textures = { + {"textureplough.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "people_ox3", + damage = "people_ox", + death = "people_ox2", + distance = 15, + }, + replace_rate = 0.01, + replace_what = { + {"group:grass", "air", 0}, + {"default:dirt_with_grass", "farming:soil", -1} + }, +replace_what2 = { + {"group:grass", "air", 0}, + {"default:dirt", "farming:soil", -1} + }, + walk_velocity = 1, + walk_chance = 100, + run_velocity = 2, + jump = false, + walk_chance = 70, + drops = { + }, + water_damage = 1, + lava_damage = 2, + light_damage = 0, + follow = {"farming:wheat", "default:apple", "farming:oat", + "farming:barley", "farming:corn", "ethereal:banana_single", "farming:corn_cob", "farming:cabbage", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass"}, + view_range = 15, + owner = "singleplayer", + order = "follow", + stepheight = 1, + fear_height = 2, + animation = { + speed_normal = 25, + stand_start = 0, + stand_end = 100, + stand1_start = 100, + stand1_end = 200, + stand2_start = 200, + stand2_end = 300, + walk_speed = 50, + walk_start = 300, + walk_end = 400, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + +on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 25, 0, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Plough stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Plough will follow you.")) + end + end + end, +}) + + +mobs:register_egg("people:plough", S("Plough"), "aplough.png") \ No newline at end of file diff --git a/mods/people/plunderercrossbow.lua b/mods/people/plunderercrossbow.lua new file mode 100644 index 0000000..6977a86 --- /dev/null +++ b/mods/people/plunderercrossbow.lua @@ -0,0 +1,132 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:plunderercrossbow", { + -- animal, monster, npc + type = "monster", + -- aggressive, shoots bolts + passive = false, + step_height = 2, + fear_height = 4, + damage = 8, + attack_type = "shoot", + shoot_interval = 2, + arrow = "people:bolt", + shoot_offset = 2, + attacks_monsters = false, + -- health & armor + hp_min = 35, hp_max = 70, armor = 130, + -- textures and model + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Plunderercrossbow.b3d", + drawtype = "front", + textures = { + {"textureplunderercrossbow.png"}, + }, + visual_size = {x=1, y=1}, + -- sounds + makes_footstep_sound = true, + sounds = { + shoot_attack = "people_plunderercrossbow2", + random = "people_plunderercrossbow", + damage = "people_plunderercrossbow3", + distance = 15, +}, + -- speed and jump + walk_velocity = 2, + run_velocity = 3, + walk_chance = 10, + jump = true, + stay_near = {{"people:bootynode"}, 5}, + drops = { + {name = "people:forge", chance = 7, min = 1, max = 1}, + {name = "people:feeder", chance = 7, min = 1, max = 1}, + {name = "people:mineshaft", chance = 7, min = 1, max = 1}, + {name = "people:villagerbed", chance = 7, min = 1, max = 1}, + {name = "people:weaponstand", chance = 7, min = 1, max = 1}, + {name = "people:firstaidnode", chance = 7, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + -- damaged by + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fall_damage = 0, + view_range = 20, + -- model animation + animation = { + speed_normal = 70, + speed_run = 100, + stand_speed = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + run_start = 100, + run_end = 200, + shoot_start = 200, + shoot_end = 300, + speed_shoot = 55, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:plunderercrossbow" then + return false + end + + return true + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:plunderercrossbow", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick"}, + neighbors = {"people:bootynode"}, + min_light = 0, + interval = 30, + active_object_count = 2, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:plunderercrossbow", S"Plunderer with Crossbow", "aplunderercrossbow.png") + +mobs:register_arrow("people:bolt", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"bolt.png"}, + velocity = 15, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=15}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=15}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) diff --git a/mods/people/plundererflask.lua b/mods/people/plundererflask.lua new file mode 100644 index 0000000..0ace040 --- /dev/null +++ b/mods/people/plundererflask.lua @@ -0,0 +1,112 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:plundererflask", { + -- animal, monster, npc + type = "monster", + -- aggressive, shoots flasks + passive = false, + step_height = 2, + fear_height = 4, + damage = 10, + attack_type = "shoot", + shoot_interval = 1, + arrow = "people:flask", + shoot_offset = 2, + attacks_monsters = false, + -- health & armor + hp_min = 20, hp_max = 40, armor = 100, + -- textures and model + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Plundererflask.b3d", + drawtype = "front", + textures = { + {"textureplundererflask.png"}, + }, + visual_size = {x=1, y=1}, + -- sounds + makes_footstep_sound = true, + sounds = { + shoot_attack = "people_plundererflask2", + random = "people_plundererflask", + damage = "people_plundererflask3", + distance = 15, +}, + -- speed and jump + walk_velocity = 2, + run_velocity = 3, + walk_chance = 10, + jump = true, + stay_near = {{"people:bootynode"}, 5}, + drops = { + {name = "people:forge", chance = 7, min = 1, max = 1}, + {name = "people:feeder", chance = 7, min = 1, max = 1}, + {name = "people:mineshaft", chance = 7, min = 1, max = 1}, + {name = "people:villagerbed", chance = 7, min = 1, max = 1}, + {name = "people:weaponstand", chance = 7, min = 1, max = 1}, + {name = "people:firstaidnode", chance = 7, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + -- damaged by + water_damage = 0, + lava_damage = 4, + light_damage = 0, + fall_damage = 0, + view_range = 15, + -- model animation + animation = { + speed_normal = 70, speed_run = 100, + stand_speed = 50, + stand_start = 0, stand_end = 100, + walk_start = 100, walk_end = 200, + run_start = 100, run_end = 200, + shoot_start = 200, shoot_end = 300, + speed_shoot = 55, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:plundererflask", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick"}, + neighbors = {"people:bootynode"}, + min_light = 0, + interval = 30, + active_object_count = 2, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:plundererflask", S"Plunderer with Flask", "aplundererflask.png") + +mobs:register_arrow("people:flask", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"flask.png"}, + velocity = 12, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) diff --git a/mods/people/plundererstick.lua b/mods/people/plundererstick.lua new file mode 100644 index 0000000..e6e0197 --- /dev/null +++ b/mods/people/plundererstick.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:plundererstick", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 3, + damage = 7, + hp_min = 25, + hp_max = 65, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5}, + visual = "mesh", + mesh = "Plundererstick.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"textureplundererstick.png"}, + }, + sounds = { + attack = "people_plundererstick3", + random = "people_plunderersick", + damage = "people_plundererstick2", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 2, + run_velocity = 4, + walk_chance = 10, + runaway = false, + stay_near = {{"people:bootynode"}, 5}, + jump = true, + drops = { + {name = "people:forge", chance = 7, min = 1, max = 1}, + {name = "people:feeder", chance = 7, min = 1, max = 1}, + {name = "people:mineshaft", chance = 7, min = 1, max = 1}, + {name = "people:villagerbed", chance = 7, min = 1, max = 1}, + {name = "people:weaponstand", chance = 7, min = 1, max = 1}, + {name = "people:firstaidnode", chance = 7, min = 1, max = 1}, + {name = "people:emblemoftriumph", chance = 7, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + animation = { + speed_normal = 100, + stand_speed = 50, + stand_start = 0, + stand_end = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 15, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:plundererstick", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick"}, + neighbors = {"people:bootynode"}, + min_light = 0, + interval = 30, + active_object_count = 2, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, +}) +end + +mobs:register_egg("people:plundererstick", S("Plunderer with a Stick"), "aplundererstick.png") diff --git a/mods/people/rideelephant.lua b/mods/people/rideelephant.lua new file mode 100644 index 0000000..b381178 --- /dev/null +++ b/mods/people/rideelephant.lua @@ -0,0 +1,234 @@ +local S = minetest.get_translator("people") + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable horse +mobs:register_mob("people:rideelephant", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Rideelephant.b3d", + collisionbox = {-0.5, -0.01, -0.5, 0.5, 2, 0.5}, + animation = { + speed_normal = 50, + run_speed = 100, + stand_start = 0, + stand_end = 100, + walk_speed = 50, + walk_start = 101, + walk_end = 200, + run_start = 101, + run_end = 200, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"texturerideelephant.png"}, + + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 60, + walk_velocity = 1.5, + view_range = 10, + knock_back = false, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + follow = { + "farming:wheat", "default:apple", "farming:oat", + "farming:barley", "farming:corn", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "farming:melon_8", "farming:pumpkin_8", "ethereal:strawberry", "farming:blackberry", "naturalbiomes:blackberry", "naturalbiomes:cowberry", "naturalbiomes:banana", "naturalbiomes:banana_bunch", "farming:blueberries", "ethereal:orange", "livingdesert:figcactus_fruit", "livingfloatlands:paleojungle_clubmoss_fruit", "ethereal:banana", "livingdesert:date_palm_fruits", "farming:melon_slice", "naturalbiomes:wildrose", "naturalbiomes:banana", "group:grass", "group:normal_grass"}, + passive = true, + hp_min = 100, + hp_max = 400, + armor = 100, + lava_damage = 5, + fall_damage = 5, + water_damage = 0, + makes_footstep_sound = true, + sounds = { + random = "people_elephant2", + damage = "people_elephant", + death = "people_elephant3", + distance = 15, +}, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 5 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 23, z = -8} + self.driver_eye_offset = {x = 0, y = 23, z = -0} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 0, 0, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("people:rideelephant", S("Ridable Elephant"), "arideelephant.png") + + diff --git a/mods/people/ridehorse.lua b/mods/people/ridehorse.lua new file mode 100644 index 0000000..b6978b5 --- /dev/null +++ b/mods/people/ridehorse.lua @@ -0,0 +1,245 @@ +local S = minetest.get_translator("people") + + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable horse +mobs:register_mob("people:ridehorse", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Ridehorse.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 50, + run_speed = 100, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + run_start = 200, + run_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"textureridehorse.png"}, + {"textureridehorse2.png"}, + {"textureridehorse3.png"}, + {"textureridehorse4.png"}, + {"textureridehorse5.png"}, + {"textureridehorse6.png"}, + {"textureridehorse7.png"}, + {"textureridehorse8.png"}, + {"textureridehorse9.png"}, + + + }, + fear_height = 3, + runaway = true, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + fly = false, + walk_chance = 60, + walk_velocity = 1.5, + view_range = 10, + knock_back = false, + follow = { + "farming:wheat", "default:apple", "farming:oat", + "farming:barley", "farming:corn", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass"}, + passive = true, + hp_min = 50, + hp_max = 120, + armor = 100, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + sounds = { + random = "people_horse2", + damage = "people_horse3", + death = "people_horse", + distance = 15, +}, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 6 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 14.2, z = -3} + self.driver_eye_offset = {x = 0, y = 14.2, z = 0} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 0, 0, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("people:ridehorse", S("Ridable Horse"), "aridehorse.png") + diff --git a/mods/people/rideostrich.lua b/mods/people/rideostrich.lua new file mode 100644 index 0000000..e9f0214 --- /dev/null +++ b/mods/people/rideostrich.lua @@ -0,0 +1,229 @@ +local S = minetest.get_translator("people") + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable horse +mobs:register_mob("people:rideostrich", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Rideostrich.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 50, + run_speed = 100, + stand_start = 0, + stand_end = 100, + stand2_end = 200, + stand2_start = 300, + walk_speed = 75, + walk_start = 100, + walk_end = 200, + run_start = 200, + run_end = 300, + die_start = 100, + die_end = 200, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"texturerideostrich.png"}, + + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 60, + walk_velocity = 3, + view_range = 10, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + follow = { + "farming:wheat", "default:apple", "farming:oat", + "farming:barley", "farming:corn", "farming:corn_cob", "farming:seed_hemp", "farming:seed_barley", "farming:seed_oat", "farming:seed_cotton", "farming:seed_sunflower", "farming:seed_wheat", "farming:seed_rye", "naturalbiomes:coconut", "naturalbiomes:coconut_slice", "naturalbiomes:hazelnut", "naturalbiomes:hazelnut_cracked", "farming:sunflower_seeds_toasted", "livingfloatlands:roasted_pine_nuts", "livingfloatlands:giantforest_oaknut", "livingfloatlands:giantforest_oaknut_cracked", "livingfloatlands:coldsteppe_pine3_pinecone", "livingfloatlands:coldsteppe_pine_pinecone", "livingfloatlands:coldsteppe_pine2_pinecone", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass"}, + passive = true, + hp_min = 25, + hp_max = 55, + armor = 100, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 9 + self.max_speed_reverse = 4 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 11, z = -1.6} + self.driver_eye_offset = {x = 0, y = 11, z = 0} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 0, 0, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("people:rideostrich", S("Ridable Ostrich"), "arideostrich.png") + + diff --git a/mods/people/rideox.lua b/mods/people/rideox.lua new file mode 100644 index 0000000..ffb3d30 --- /dev/null +++ b/mods/people/rideox.lua @@ -0,0 +1,233 @@ +local S = minetest.get_translator("people") + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable horse +mobs:register_mob("people:rideox", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Rideox.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 50, + run_speed = 100, + stand_start = 0, + stand_end = 100, + walk_speed = 75, + walk_start = 100, + walk_end = 200, + run_start = 100, + run_end = 200, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"texturerideox.png"}, + + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 60, + walk_velocity = 1.5, + view_range = 10, + knock_back = false, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + follow = { + "farming:wheat", "default:apple", "farming:oat", + "farming:barley", "farming:corn", "ethereal:banana_single", "farming:corn_cob", "farming:cabbage", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass"}, + passive = true, + hp_min = 100, + hp_max = 250, + armor = 100, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + sounds = { + random = "people_ox3", + damage = "people_ox", + death = "people_ox2", + distance = 15, +}, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 4 + self.max_speed_reverse = 1 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 9, z = -13} + self.driver_eye_offset = {x = 0, y = 9, z = -10} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 25, 0, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("people:rideox", S("Ridable Ox"), "arideox.png") + diff --git a/mods/people/ridepig.lua b/mods/people/ridepig.lua new file mode 100644 index 0000000..acad073 --- /dev/null +++ b/mods/people/ridepig.lua @@ -0,0 +1,229 @@ +local S = minetest.get_translator("people") + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable horse +mobs:register_mob("people:ridepig", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Ridepig.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 50, + run_speed = 100, + stand_start = 0, + stand_end = 100, + walk_speed = 75, + walk_start = 100, + walk_end = 200, + run_start = 200, + run_end = 300, + die_start = 100, + die_end = 200, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"textureridepig.png"}, + + }, + fear_height = 3, + runaway = true, + knock_back = false, + fly = false, + walk_chance = 60, + view_range = 10, +follow = {"default:apple", "farming:potato", "ethereal:banana_bread", "farming:melon_slice", "farming:carrot", "farming:seed_rice", "farming:corn", "farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad", "farming:corn_cob", "farming:seed_hemp", "farming:seed_barley", "farming:seed_oat", "farming:seed_cotton", "farming:seed_sunflower", "farming:seed_wheat", "farming:seed_rye", "naturalbiomes:coconut", "naturalbiomes:coconut_slice", "naturalbiomes:hazelnut", "naturalbiomes:hazelnut_cracked", "farming:sunflower_seeds_toasted", "livingfloatlands:roasted_pine_nuts", "livingfloatlands:giantforest_oaknut", "livingfloatlands:giantforest_oaknut_cracked", "livingfloatlands:coldsteppe_pine3_pinecone", "livingfloatlands:coldsteppe_pine_pinecone", "livingfloatlands:coldsteppe_pine2_pinecone"}, + passive = true, + hp_min = 60, + hp_max = 100, + armor = 100, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + makes_footstep_sound = true, + sounds = { + random = "people_pig", + damage = "people_pig2", + death = "people_pig3", + distance = 15, +}, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 4 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 11, z = -2} + self.driver_eye_offset = {x = 0, y = 11, z = 0} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 25, 0, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("people:ridepig", S("Ridable Pig"), "aridepig.png") diff --git a/mods/people/ridereindeer.lua b/mods/people/ridereindeer.lua new file mode 100644 index 0000000..588ebec --- /dev/null +++ b/mods/people/ridereindeer.lua @@ -0,0 +1,226 @@ +local S = minetest.get_translator("people") + + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator and minetest.get_translator("people") or + dofile(MP .. "/intllib.lua") + +-- 0.4.17 or 5.0 check +local y_off = 20 +if minetest.features.object_independent_selectionbox then + y_off = 10 +end + +-- horse shoes (speed, jump, break, overlay texture) +local shoes = { + ["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"}, + ["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"}, + ["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"}, + ["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"} +} + +-- rideable horse +mobs:register_mob("people:ridereindeer", { + type = "animal", + visual = "mesh", + visual_size = {x = 1, y = 1}, + mesh = "Ridereindeer.b3d", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 50, + run_speed = 100, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 75, + walk_start = 200, + walk_end = 300, + run_start = 200, + run_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + textures = { + {"textureridereindeer.png"}, + + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 50, + walk_velocity = 1.5, + view_range = 5, + follow = {"default:apple", "default:permafrost_with_moss", "ethereal:snowygrass", "ethereal:crystalgrass", "default:dry_shrub ", "default:grass_1", "ethereal:dry_shrub", "farming:seed_wheat", "farming:seed_rye", "default:junglegrass", "default:dry_grass_1", "default:dry_grass_2", "default:dry_grass_3", "default:grass_1", "default:grass_2", "default:grass_3", "default:grass_4", "default:grass_5", "default:marram_grass_1", "default:marram_grass_2", "default:marram_grass_3", "default:coldsteppe_grass_1", "default:coldsteppe_grass_2", "default:coldsteppe_grass_3", "default:coldsteppe_grass_4", "default:coldsteppe_grass_5", "default:coldsteppe_grass_6", "naturalbiomes:savanna_grass1", "naturalbiomes:savanna_grass2", "naturalbiomes:savanna_grass3", "naturalbiomes:outback_grass1", "naturalbiomes:outback_grass2", "naturalbiomes:outback_grass3", "naturalbiomes:outback_grass4", "naturalbiomes:outback_grass5", "naturalbiomes:outback_grass6", "naturalbiomes:med_grass1", "naturalbiomes:med_grass2", "naturalbiomes:heath_grass1", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:alpine_grass1", "naturalbiomes:alpine_grass2", "naturalbiomes:heath_grass2", "naturalbiomes:heath_grass3", "naturalbiomes:", "naturalbiomes:", "naturalbiomes:bushland_grass", "naturalbiomes:bushland_grass2", "naturalbiomes:bushland_grass3", "naturalbiomes:bushland_grass4", "naturalbiomes:bushland_grass5", "naturalbiomes:bushland_grass6", "naturalbiomes:bushland_grass7", "group:grass", "group:normal_grass"}, + passive = true, + hp_min = 35, + hp_max = 75, + armor = 100, + stay_near = {{"people:feeder", "marinara:reed_bundle", "naturalbiomes:reed_bundle", "farming:straw"}, 5}, + lava_damage = 5, + fall_damage = 5, + water_damage = 0, + makes_footstep_sound = true, + drops = { + {name = "mobs:leather", chance = 1, min = 0, max = 2} + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 5 + self.max_speed_reverse = 3 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 11.4, z = -4.5} + self.driver_eye_offset = {x = 0, y = 11.4, z = 0} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + + minetest.add_item(pos, "mobs:saddle") + + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + + self.saddle = nil + end + + -- drop any horseshoes added + if self.shoed then + minetest.add_item(pos, self.shoed) + end + + end, + + do_punch = function(self, hitter) + + -- don't cut the branch you're... ah, that's not about that + if hitter ~= self.driver then + return true + end + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- applying protection rune + if mobs:protect(self, clicker) then + return + end + + local player_name = clicker:get_player_name() + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == player_name then + + local inv = clicker:get_inventory() + local tool = clicker:get_wielded_item() + local item = tool:get_name() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker:get_pos(), "mobs:saddle") + end + + self.saddle = nil + + -- attach player to horse + elseif (not self.driver and not self.child + and clicker:get_wielded_item():get_name() == "mobs:saddle") + or self.saddle then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + if not self.saddle then + inv:remove_item("main", "mobs:saddle") + end + + self.saddle = true + end + + -- apply horseshoes + if item:find("people:horseshoe") then + + -- drop any existing shoes + if self.shoed then + minetest.add_item(self.object:get_pos(), self.shoed) + end + + local speed = shoes[item][1] + local jump = shoes[item][2] + local reverse = shoes[item][3] + local overlay = shoes[item][4] + + self.max_speed_forward = speed + self.jump_height = jump + self.max_speed_reverse = reverse + self.accel = speed + self.shoed = item + + -- apply horseshoe overlay to current horse texture + if overlay then + self.texture_mods = "^" .. overlay + self.object:set_texture_mod(self.texture_mods) + end + + -- show horse speed and jump stats with shoes fitted + minetest.chat_send_player(player_name, + S("Horse shoes fitted -") + .. S(" speed: ") .. speed + .. S(" , jump height: ") .. jump + .. S(" , stop speed: ") .. reverse) + + tool:take_item() + + clicker:set_wielded_item(tool) + + return + end + end + + -- used to capture horse with magic lasso + if mobs:capture_mob(self, clicker, 25, 0, 25, false, nil) then return end + end, +}) + + +mobs:register_egg("people:ridereindeer", S("Ridable Reindeer"), "aridereindeer.png") diff --git a/mods/people/samfarmer.lua b/mods/people/samfarmer.lua new file mode 100644 index 0000000..50e11c7 --- /dev/null +++ b/mods/people/samfarmer.lua @@ -0,0 +1,142 @@ + +local S = minetest.get_translator("people") + + +mobs.samfarmer_drops = { +"people:dog", "people:goat", "people:dogfoodsack", "people:ridepig", "people:rideelephant", "people:plough" +} + +mobs:register_mob("people:samfarmer", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medfarmer2.b3d", + textures = { + {"texturesamfarmer.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_farmerf", + damage = "people_female5", + death = "people_femaledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:feeder", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:farmergrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:coal_lump"}, + view_range = 15, + owner = "", + order = "follow", + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 80, + walk_start = 300, + walk_end = 400, + punch_speed = 100, + punch_start = 200, + punch_end = 300, + die_start = 200, + die_end = 300, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.samfarmer_drops or mobs.samfarmer_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Farmer dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Farmer stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Farmer will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:samfarmer", + nodes = {"default:junglewood"}, + neighbors = {"people:feeder"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:samfarmer", S("Farmer Jungle"), "asamfarmer.png") + +-- compatibility +mobs:alias_mob("people:samfarmer", "people:samfarmer") diff --git a/mods/people/samsmith.lua b/mods/people/samsmith.lua new file mode 100644 index 0000000..80e4314 --- /dev/null +++ b/mods/people/samsmith.lua @@ -0,0 +1,153 @@ + +local S = minetest.get_translator("people") + + +mobs.samsmith_drops = { +"default:axe_steel", "default:axe_steel", "default:axe_steel", +"default:axe_steel", "default:axe_mese", "default:axe_mese", +"default:axe_diamond", "default:axe_diamond", "default:pick_bronze", "default:pick_bronze","default:pick_steel", "default:pick_steel","default:pick_mese", "default:pick_mese", + "default:pick_diamond", "default:pick_diamond", + "default:shovel_bronze", "default:shovel_bronze", + "default:shovel_steel", "default:shovel_steel", + "default:shovel_mese", "default:shovel_mese", + "default:shovel_diamond", "default:shovel_diamond ", +"default:sword_bronze", "default:sword_bronze", "default:sword_steel", +"default:sword_steel", "default:sword_mese", "default:sword_mese", +"default:sword_diamond", "default:sword_diamond" +} + +mobs:register_mob("people:samsmith", { + type = "npc", + passive = true, + damage = 5, + attack_type = "dogfight", + owner_loyal = true, + pathfinding = true, + reach = 2, + attack_monsters = true, + attack_animals = false, + attack_npc = false, + hp_min = 25, + hp_max = 35, + armor = 100, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Medsmith2.b3d", + textures = { + {"texturesamsmith.png"}, + + }, + makes_footstep_sound = true, + sounds = { + random = "people_smith", + damage = "people_male5", + death = "people_maledeath", + distance = 10, +}, + walk_velocity = 1.5, + run_velocity = 2, + stepheight = 1, + fear_height = 2, + jump = true, + jump_height = 3, + stay_near = {{"people:forge", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 4}, + drops = { {name = "people:smithgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 1, + lava_damage = 3, + light_damage = 0, + follow = {"default:diamond"}, + view_range = 15, + owner = "", + order = "follow", + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + -- model animation + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + stand2_start = 100, + stand2_end = 200, + walk_speed = 100, + walk_start = 200, + walk_end = 300, + punch_speed = 100, + punch_start = 300, + punch_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + -- right clicking with raw meat will give Igor more health + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + -- right clicking with gold lump drops random item from mobs.npc_drops + if item:get_name() == "default:gold_ingot" then + + if not mobs.is_creative(name) then + item:take_item() + clicker:set_wielded_item(item) + end + + local pos = self.object:get_pos() + + pos.y = pos.y + 0.5 + + local drops = self.samsmith_drops or mobs.samsmith_drops + + minetest.add_item(pos, { + name = drops[math.random(1, #drops)] + }) + + minetest.chat_send_player(name, S("Blackmith dropped you an item for gold!")) + + return + end + + -- if owner switch between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Blacksmith stands still.")) + else + self.order = "follow" + minetest.chat_send_player(name, S("Blacksmith will follow you.")) + end + end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:samsmith", + nodes = {"default:junglewood"}, + neighbors = {"people:forge"}, + min_light = 0, + interval = 30, + chance = 1, -- 15000 + min_height = -25, + max_height = 1000, +}) +end +-- register spawn egg +mobs:register_egg("people:samsmith", S("Blacksmith Jungle"), "asamsmith.png") + +-- compatibility +mobs:alias_mob("people:samsmith", "people:samsmith") diff --git a/mods/people/samwarrior.lua b/mods/people/samwarrior.lua new file mode 100644 index 0000000..69844ee --- /dev/null +++ b/mods/people/samwarrior.lua @@ -0,0 +1,154 @@ + +local S = minetest.get_translator("people") + +-- Npc by TenPlus1 + + +mobs:register_mob("people:samwarrior", { + type = "npc", + passive = false, + damage = 10, + attack_type = "dogshoot", + dogshoot_switch = 1, + dogshoot_count_max = 12, -- shoot for 12 seconds + dogshoot_count2_max = 3, -- dogfight for 3 seconds + shoot_interval = 1.5, + arrow = "people:spearfly", + shoot_offset = 2, + attacks_monsters = true, + attack_npcs = false, + owner_loyal = true, + pathfinding = true, + hp_min = 100, + hp_max = 145, + armor = 80, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "Warrior.b3d", + drawtype = "front", + textures = { + {"texturesamwarrior.png"}, + }, + makes_footstep_sound = true, + sounds = { + attack = "people_warrior3", + random = "people_warrior2", + damage = "people_male5", + death = "people_warrior", + distance = 10, +}, + walk_velocity = 3, + run_velocity = 4, + jump = true, + drops = { {name = "people:warriorgrave", chance = 1, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 2, + light_damage = 0, + follow = {"farming:baked_potato", "farming:sunflower_bread", "farming:pumpkin_bread", "farming:garlic_bread", "farming:tomato_soup", "pie:brpd_0", "farming:bread", "farming:bread_multigrain", "farming:spanish_potatoes", "farming:beetroot_soup", "farming:blueberry_pie", "farming:porridge", "farming:bibimbap", "farming:burger", "farming:paella", "farming:mac_and_cheese", "livingcaves:healingsoup", "farming:spaghetti", "animalworld:escargots", "farming:rhubarb_pie", "farming:potato_omlet", "farming:potato_salad"}, + view_range = 20, + owner = "", + order = "stand", + fear_height = 3, + stay_near = {{"people:weaponstand", "people:villagerbed", "xdecor:empty_shelf", "xdecor:intemframe", "xdecor:lantern", "xdecor:candle", "xdecor:multishelf", "xdecor:tv", "default:bookshelf", "vessels:shelf", "livingcaves:root_lamp", "default:chest", "default:mese_post_light_pine_wood", "default:meselamp", "default:mese_post_light_pine_wood", "default:mese_post_light", "default:mese_post_light_acacia_wood", "default:mese_post_light_aspen_wood", "default:mese_post_light_junglewood", "animalworld:crocodilestool", "animalworld:elephantstool", "animalworld:bearstool", "animalworld:gnustool", "animalworld:hippostool", "animalworld:monitorstool", "animalworld:ivorychair", "animalworld:sealstool", "animalworld:yakstool", "animalworld:tigerstool", "animalworld:muskoxstool"}, 5}, + animation = { + speed_normal = 50, + stand_start = 0, + stand_end = 100, + walk_speed = 100, + walk_start = 100, + walk_end = 200, + punch_start = 200, + punch_end = 300, + shoot_start = 300, + shoot_speed = 80, + shoot_end = 400, + die_start = 300, + die_end = 400, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + + on_rightclick = function(self, clicker) + + -- feed to heal npc + if mobs:feed_tame(self, clicker, 8, true, true) then return end + + -- capture npc with net or lasso + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + + -- protect npc with mobs:protector + if mobs:protect(self, clicker) then return end + + local item = clicker:get_wielded_item() + local name = clicker:get_player_name() + + + + -- by right-clicking owner can switch npc between follow and stand + if self.owner and self.owner == name then + + if self.order == "follow" then + + self.attack = nil + self.order = "stand" + self.state = "stand" + self:set_animation("stand") + self:set_velocity(0) + + minetest.chat_send_player(name, S("Warrior stands still.")) + else + self.order = "follow" + + minetest.chat_send_player(name, S("Warrior will follow you.")) + end + end + end, + + do_punch = function(self, hitter, + time_from_last_punch, + tool_capabilities, + direction) + + -- Prevent friendly fire from killing each other :) + local entity = hitter:get_luaentity() + + if entity == "people:samwarrior" then + return false + end + + return true + end, +}) + + +mobs:register_egg("people:samwarrior", S("Warrior Jungle"), "asamwarrior.png" ) + +-- compatibility +mobs:alias_mob("people:samwarrior", "people:samwarrior") + +mobs:register_arrow("people:spearfly", { + visual = "sprite", + visual_size = {x=.5, y=.5}, + textures = {"spearfly.png"}, + velocity = 8, + drop = true, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_mob = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=13}, + }, nil) + end, + + hit_node = function(self, pos, node) + end, +}) diff --git a/mods/people/screenshot.png b/mods/people/screenshot.png new file mode 100644 index 0000000..5d1c3b5 Binary files /dev/null and b/mods/people/screenshot.png differ diff --git a/mods/people/sounds/people_dog.ogg b/mods/people/sounds/people_dog.ogg new file mode 100644 index 0000000..751040a Binary files /dev/null and b/mods/people/sounds/people_dog.ogg differ diff --git a/mods/people/sounds/people_dog2.ogg b/mods/people/sounds/people_dog2.ogg new file mode 100644 index 0000000..68d5505 Binary files /dev/null and b/mods/people/sounds/people_dog2.ogg differ diff --git a/mods/people/sounds/people_dog3.ogg b/mods/people/sounds/people_dog3.ogg new file mode 100644 index 0000000..488ab68 Binary files /dev/null and b/mods/people/sounds/people_dog3.ogg differ diff --git a/mods/people/sounds/people_dog4.ogg b/mods/people/sounds/people_dog4.ogg new file mode 100644 index 0000000..69779d2 Binary files /dev/null and b/mods/people/sounds/people_dog4.ogg differ diff --git a/mods/people/sounds/people_dog5.ogg b/mods/people/sounds/people_dog5.ogg new file mode 100644 index 0000000..9db8f35 Binary files /dev/null and b/mods/people/sounds/people_dog5.ogg differ diff --git a/mods/people/sounds/people_elephant.ogg b/mods/people/sounds/people_elephant.ogg new file mode 100644 index 0000000..4b293a4 Binary files /dev/null and b/mods/people/sounds/people_elephant.ogg differ diff --git a/mods/people/sounds/people_elephant2.ogg b/mods/people/sounds/people_elephant2.ogg new file mode 100644 index 0000000..065e844 Binary files /dev/null and b/mods/people/sounds/people_elephant2.ogg differ diff --git a/mods/people/sounds/people_elephant3.ogg b/mods/people/sounds/people_elephant3.ogg new file mode 100644 index 0000000..cec0475 Binary files /dev/null and b/mods/people/sounds/people_elephant3.ogg differ diff --git a/mods/people/sounds/people_evilminer.ogg b/mods/people/sounds/people_evilminer.ogg new file mode 100644 index 0000000..7bcab6b Binary files /dev/null and b/mods/people/sounds/people_evilminer.ogg differ diff --git a/mods/people/sounds/people_evilminer2.ogg b/mods/people/sounds/people_evilminer2.ogg new file mode 100644 index 0000000..c282781 Binary files /dev/null and b/mods/people/sounds/people_evilminer2.ogg differ diff --git a/mods/people/sounds/people_evilminer3.ogg b/mods/people/sounds/people_evilminer3.ogg new file mode 100644 index 0000000..5b26a4e Binary files /dev/null and b/mods/people/sounds/people_evilminer3.ogg differ diff --git a/mods/people/sounds/people_evilminer4.ogg b/mods/people/sounds/people_evilminer4.ogg new file mode 100644 index 0000000..de0a1ac Binary files /dev/null and b/mods/people/sounds/people_evilminer4.ogg differ diff --git a/mods/people/sounds/people_farmerf.ogg b/mods/people/sounds/people_farmerf.ogg new file mode 100644 index 0000000..1ad2d6f Binary files /dev/null and b/mods/people/sounds/people_farmerf.ogg differ diff --git a/mods/people/sounds/people_farmerm.ogg b/mods/people/sounds/people_farmerm.ogg new file mode 100644 index 0000000..cdeffac Binary files /dev/null and b/mods/people/sounds/people_farmerm.ogg differ diff --git a/mods/people/sounds/people_female.ogg b/mods/people/sounds/people_female.ogg new file mode 100644 index 0000000..b15a933 Binary files /dev/null and b/mods/people/sounds/people_female.ogg differ diff --git a/mods/people/sounds/people_female2.ogg b/mods/people/sounds/people_female2.ogg new file mode 100644 index 0000000..1c8c385 Binary files /dev/null and b/mods/people/sounds/people_female2.ogg differ diff --git a/mods/people/sounds/people_female3.ogg b/mods/people/sounds/people_female3.ogg new file mode 100644 index 0000000..a31adad Binary files /dev/null and b/mods/people/sounds/people_female3.ogg differ diff --git a/mods/people/sounds/people_female4.ogg b/mods/people/sounds/people_female4.ogg new file mode 100644 index 0000000..f2cfc2a Binary files /dev/null and b/mods/people/sounds/people_female4.ogg differ diff --git a/mods/people/sounds/people_female5.ogg b/mods/people/sounds/people_female5.ogg new file mode 100644 index 0000000..0c12be1 Binary files /dev/null and b/mods/people/sounds/people_female5.ogg differ diff --git a/mods/people/sounds/people_femaledeath.ogg b/mods/people/sounds/people_femaledeath.ogg new file mode 100644 index 0000000..8f52667 Binary files /dev/null and b/mods/people/sounds/people_femaledeath.ogg differ diff --git a/mods/people/sounds/people_goat.ogg b/mods/people/sounds/people_goat.ogg new file mode 100644 index 0000000..d4b950c Binary files /dev/null and b/mods/people/sounds/people_goat.ogg differ diff --git a/mods/people/sounds/people_goat2.ogg b/mods/people/sounds/people_goat2.ogg new file mode 100644 index 0000000..f590252 Binary files /dev/null and b/mods/people/sounds/people_goat2.ogg differ diff --git a/mods/people/sounds/people_horse.ogg b/mods/people/sounds/people_horse.ogg new file mode 100644 index 0000000..b7f1389 Binary files /dev/null and b/mods/people/sounds/people_horse.ogg differ diff --git a/mods/people/sounds/people_horse2.ogg b/mods/people/sounds/people_horse2.ogg new file mode 100644 index 0000000..68d02cc Binary files /dev/null and b/mods/people/sounds/people_horse2.ogg differ diff --git a/mods/people/sounds/people_horse3.ogg b/mods/people/sounds/people_horse3.ogg new file mode 100644 index 0000000..05d69ec Binary files /dev/null and b/mods/people/sounds/people_horse3.ogg differ diff --git a/mods/people/sounds/people_instructor.ogg b/mods/people/sounds/people_instructor.ogg new file mode 100644 index 0000000..965c451 Binary files /dev/null and b/mods/people/sounds/people_instructor.ogg differ diff --git a/mods/people/sounds/people_male.ogg b/mods/people/sounds/people_male.ogg new file mode 100644 index 0000000..70e236c Binary files /dev/null and b/mods/people/sounds/people_male.ogg differ diff --git a/mods/people/sounds/people_male2.ogg b/mods/people/sounds/people_male2.ogg new file mode 100644 index 0000000..c7a7fcc Binary files /dev/null and b/mods/people/sounds/people_male2.ogg differ diff --git a/mods/people/sounds/people_male3.ogg b/mods/people/sounds/people_male3.ogg new file mode 100644 index 0000000..52bb610 Binary files /dev/null and b/mods/people/sounds/people_male3.ogg differ diff --git a/mods/people/sounds/people_male4.ogg b/mods/people/sounds/people_male4.ogg new file mode 100644 index 0000000..80ae938 Binary files /dev/null and b/mods/people/sounds/people_male4.ogg differ diff --git a/mods/people/sounds/people_male5.ogg b/mods/people/sounds/people_male5.ogg new file mode 100644 index 0000000..10af04d Binary files /dev/null and b/mods/people/sounds/people_male5.ogg differ diff --git a/mods/people/sounds/people_maledeath.ogg b/mods/people/sounds/people_maledeath.ogg new file mode 100644 index 0000000..b6d41cb Binary files /dev/null and b/mods/people/sounds/people_maledeath.ogg differ diff --git a/mods/people/sounds/people_miner.ogg b/mods/people/sounds/people_miner.ogg new file mode 100644 index 0000000..10b509b Binary files /dev/null and b/mods/people/sounds/people_miner.ogg differ diff --git a/mods/people/sounds/people_ox.ogg b/mods/people/sounds/people_ox.ogg new file mode 100644 index 0000000..32cf0eb Binary files /dev/null and b/mods/people/sounds/people_ox.ogg differ diff --git a/mods/people/sounds/people_ox2.ogg b/mods/people/sounds/people_ox2.ogg new file mode 100644 index 0000000..52e472e Binary files /dev/null and b/mods/people/sounds/people_ox2.ogg differ diff --git a/mods/people/sounds/people_ox3.ogg b/mods/people/sounds/people_ox3.ogg new file mode 100644 index 0000000..d8d612c Binary files /dev/null and b/mods/people/sounds/people_ox3.ogg differ diff --git a/mods/people/sounds/people_pig.ogg b/mods/people/sounds/people_pig.ogg new file mode 100644 index 0000000..ba549cf Binary files /dev/null and b/mods/people/sounds/people_pig.ogg differ diff --git a/mods/people/sounds/people_pig2.ogg b/mods/people/sounds/people_pig2.ogg new file mode 100644 index 0000000..1389576 Binary files /dev/null and b/mods/people/sounds/people_pig2.ogg differ diff --git a/mods/people/sounds/people_pig3.ogg b/mods/people/sounds/people_pig3.ogg new file mode 100644 index 0000000..7bf18be Binary files /dev/null and b/mods/people/sounds/people_pig3.ogg differ diff --git a/mods/people/sounds/people_pig4.ogg b/mods/people/sounds/people_pig4.ogg new file mode 100644 index 0000000..56ccbba Binary files /dev/null and b/mods/people/sounds/people_pig4.ogg differ diff --git a/mods/people/sounds/people_plunderercrossbow.ogg b/mods/people/sounds/people_plunderercrossbow.ogg new file mode 100644 index 0000000..55bebb0 Binary files /dev/null and b/mods/people/sounds/people_plunderercrossbow.ogg differ diff --git a/mods/people/sounds/people_plunderercrossbow2.ogg b/mods/people/sounds/people_plunderercrossbow2.ogg new file mode 100644 index 0000000..27df1e3 Binary files /dev/null and b/mods/people/sounds/people_plunderercrossbow2.ogg differ diff --git a/mods/people/sounds/people_plunderercrossbow3.ogg b/mods/people/sounds/people_plunderercrossbow3.ogg new file mode 100644 index 0000000..2054a2b Binary files /dev/null and b/mods/people/sounds/people_plunderercrossbow3.ogg differ diff --git a/mods/people/sounds/people_plundererflask.ogg b/mods/people/sounds/people_plundererflask.ogg new file mode 100644 index 0000000..1993800 Binary files /dev/null and b/mods/people/sounds/people_plundererflask.ogg differ diff --git a/mods/people/sounds/people_plundererflask2.ogg b/mods/people/sounds/people_plundererflask2.ogg new file mode 100644 index 0000000..8126c2c Binary files /dev/null and b/mods/people/sounds/people_plundererflask2.ogg differ diff --git a/mods/people/sounds/people_plundererflask3.ogg b/mods/people/sounds/people_plundererflask3.ogg new file mode 100644 index 0000000..ae5e3a8 Binary files /dev/null and b/mods/people/sounds/people_plundererflask3.ogg differ diff --git a/mods/people/sounds/people_plundererpirate.ogg b/mods/people/sounds/people_plundererpirate.ogg new file mode 100644 index 0000000..44cd750 Binary files /dev/null and b/mods/people/sounds/people_plundererpirate.ogg differ diff --git a/mods/people/sounds/people_plundererpirate2.ogg b/mods/people/sounds/people_plundererpirate2.ogg new file mode 100644 index 0000000..d6df04d Binary files /dev/null and b/mods/people/sounds/people_plundererpirate2.ogg differ diff --git a/mods/people/sounds/people_plundererpirate3.ogg b/mods/people/sounds/people_plundererpirate3.ogg new file mode 100644 index 0000000..1867114 Binary files /dev/null and b/mods/people/sounds/people_plundererpirate3.ogg differ diff --git a/mods/people/sounds/people_plundererstick.ogg b/mods/people/sounds/people_plundererstick.ogg new file mode 100644 index 0000000..7b67729 Binary files /dev/null and b/mods/people/sounds/people_plundererstick.ogg differ diff --git a/mods/people/sounds/people_plundererstick2.ogg b/mods/people/sounds/people_plundererstick2.ogg new file mode 100644 index 0000000..2956209 Binary files /dev/null and b/mods/people/sounds/people_plundererstick2.ogg differ diff --git a/mods/people/sounds/people_plundererstick3.ogg b/mods/people/sounds/people_plundererstick3.ogg new file mode 100644 index 0000000..4031879 Binary files /dev/null and b/mods/people/sounds/people_plundererstick3.ogg differ diff --git a/mods/people/sounds/people_smith.ogg b/mods/people/sounds/people_smith.ogg new file mode 100644 index 0000000..a35c686 Binary files /dev/null and b/mods/people/sounds/people_smith.ogg differ diff --git a/mods/people/sounds/people_warrior.ogg b/mods/people/sounds/people_warrior.ogg new file mode 100644 index 0000000..3f8fec9 Binary files /dev/null and b/mods/people/sounds/people_warrior.ogg differ diff --git a/mods/people/sounds/people_warrior2.ogg b/mods/people/sounds/people_warrior2.ogg new file mode 100644 index 0000000..6bab219 Binary files /dev/null and b/mods/people/sounds/people_warrior2.ogg differ diff --git a/mods/people/sounds/people_warrior3.ogg b/mods/people/sounds/people_warrior3.ogg new file mode 100644 index 0000000..0886803 Binary files /dev/null and b/mods/people/sounds/people_warrior3.ogg differ diff --git a/mods/people/sounds/people_zombie.ogg b/mods/people/sounds/people_zombie.ogg new file mode 100644 index 0000000..5f23358 Binary files /dev/null and b/mods/people/sounds/people_zombie.ogg differ diff --git a/mods/people/sounds/people_zombie2.ogg b/mods/people/sounds/people_zombie2.ogg new file mode 100644 index 0000000..2f9b3ad Binary files /dev/null and b/mods/people/sounds/people_zombie2.ogg differ diff --git a/mods/people/sounds/people_zombie3.ogg b/mods/people/sounds/people_zombie3.ogg new file mode 100644 index 0000000..94609b2 Binary files /dev/null and b/mods/people/sounds/people_zombie3.ogg differ diff --git a/mods/people/sounds/people_zombie4.ogg b/mods/people/sounds/people_zombie4.ogg new file mode 100644 index 0000000..3f5972d Binary files /dev/null and b/mods/people/sounds/people_zombie4.ogg differ diff --git a/mods/people/spawnbooty.lua b/mods/people/spawnbooty.lua new file mode 100644 index 0000000..29f8453 --- /dev/null +++ b/mods/people/spawnbooty.lua @@ -0,0 +1,18 @@ +local S = minetest.get_translator("people") + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:cobble","default:mossycobble"}, + sidelen = 16, + noise_params = { + offset = -0, + scale = 0.1, + spread = {x = 50, y = 50, z = 50}, + seed = 50, + octaves = 3, + persist = 1, + }, + y_max = 1000, + y_min = -25, + decoration = "people:bootynode" + }) diff --git a/mods/people/textures/aaboinstructor.png b/mods/people/textures/aaboinstructor.png new file mode 100644 index 0000000..eeea225 Binary files /dev/null and b/mods/people/textures/aaboinstructor.png differ diff --git a/mods/people/textures/aabominer.png b/mods/people/textures/aabominer.png new file mode 100644 index 0000000..84c987f Binary files /dev/null and b/mods/people/textures/aabominer.png differ diff --git a/mods/people/textures/aafrfarmer.png b/mods/people/textures/aafrfarmer.png new file mode 100644 index 0000000..25f7f92 Binary files /dev/null and b/mods/people/textures/aafrfarmer.png differ diff --git a/mods/people/textures/aafrinstructor.png b/mods/people/textures/aafrinstructor.png new file mode 100644 index 0000000..1add373 Binary files /dev/null and b/mods/people/textures/aafrinstructor.png differ diff --git a/mods/people/textures/aafrsmith.png b/mods/people/textures/aafrsmith.png new file mode 100644 index 0000000..3ab9432 Binary files /dev/null and b/mods/people/textures/aafrsmith.png differ diff --git a/mods/people/textures/aafrwarrior.png b/mods/people/textures/aafrwarrior.png new file mode 100644 index 0000000..dd80e1f Binary files /dev/null and b/mods/people/textures/aafrwarrior.png differ diff --git a/mods/people/textures/aaradoctor.png b/mods/people/textures/aaradoctor.png new file mode 100644 index 0000000..5330d3a Binary files /dev/null and b/mods/people/textures/aaradoctor.png differ diff --git a/mods/people/textures/aaraminer.png b/mods/people/textures/aaraminer.png new file mode 100644 index 0000000..b300eb8 Binary files /dev/null and b/mods/people/textures/aaraminer.png differ diff --git a/mods/people/textures/aaravillager.png b/mods/people/textures/aaravillager.png new file mode 100644 index 0000000..19bf76e Binary files /dev/null and b/mods/people/textures/aaravillager.png differ diff --git a/mods/people/textures/achindoctor.png b/mods/people/textures/achindoctor.png new file mode 100644 index 0000000..1e427a0 Binary files /dev/null and b/mods/people/textures/achindoctor.png differ diff --git a/mods/people/textures/achinfarmer.png b/mods/people/textures/achinfarmer.png new file mode 100644 index 0000000..6adff4b Binary files /dev/null and b/mods/people/textures/achinfarmer.png differ diff --git a/mods/people/textures/achininstructor.png b/mods/people/textures/achininstructor.png new file mode 100644 index 0000000..dbb4e26 Binary files /dev/null and b/mods/people/textures/achininstructor.png differ diff --git a/mods/people/textures/achinsmith.png b/mods/people/textures/achinsmith.png new file mode 100644 index 0000000..8d81ef6 Binary files /dev/null and b/mods/people/textures/achinsmith.png differ diff --git a/mods/people/textures/adog.png b/mods/people/textures/adog.png new file mode 100644 index 0000000..cebfc64 Binary files /dev/null and b/mods/people/textures/adog.png differ diff --git a/mods/people/textures/aevilminer.png b/mods/people/textures/aevilminer.png new file mode 100644 index 0000000..6d3ee44 Binary files /dev/null and b/mods/people/textures/aevilminer.png differ diff --git a/mods/people/textures/aeweminer.png b/mods/people/textures/aeweminer.png new file mode 100644 index 0000000..d7e1314 Binary files /dev/null and b/mods/people/textures/aeweminer.png differ diff --git a/mods/people/textures/aewevillager.png b/mods/people/textures/aewevillager.png new file mode 100644 index 0000000..74d3896 Binary files /dev/null and b/mods/people/textures/aewevillager.png differ diff --git a/mods/people/textures/aewewarrior.png b/mods/people/textures/aewewarrior.png new file mode 100644 index 0000000..4f6a771 Binary files /dev/null and b/mods/people/textures/aewewarrior.png differ diff --git a/mods/people/textures/afeeder.png b/mods/people/textures/afeeder.png new file mode 100644 index 0000000..fcda926 Binary files /dev/null and b/mods/people/textures/afeeder.png differ diff --git a/mods/people/textures/aforge.png b/mods/people/textures/aforge.png new file mode 100644 index 0000000..ffd39f2 Binary files /dev/null and b/mods/people/textures/aforge.png differ diff --git a/mods/people/textures/agoat.png b/mods/people/textures/agoat.png new file mode 100644 index 0000000..2614d05 Binary files /dev/null and b/mods/people/textures/agoat.png differ diff --git a/mods/people/textures/agrave.png b/mods/people/textures/agrave.png new file mode 100644 index 0000000..a78ce40 Binary files /dev/null and b/mods/people/textures/agrave.png differ diff --git a/mods/people/textures/ahatefulminer.png b/mods/people/textures/ahatefulminer.png new file mode 100644 index 0000000..92d16d5 Binary files /dev/null and b/mods/people/textures/ahatefulminer.png differ diff --git a/mods/people/textures/ajealousminer.png b/mods/people/textures/ajealousminer.png new file mode 100644 index 0000000..2545ec7 Binary files /dev/null and b/mods/people/textures/ajealousminer.png differ diff --git a/mods/people/textures/ameddoctor.png b/mods/people/textures/ameddoctor.png new file mode 100644 index 0000000..0173aaf Binary files /dev/null and b/mods/people/textures/ameddoctor.png differ diff --git a/mods/people/textures/amedfarmer.png b/mods/people/textures/amedfarmer.png new file mode 100644 index 0000000..aa78fba Binary files /dev/null and b/mods/people/textures/amedfarmer.png differ diff --git a/mods/people/textures/amedinstructor.png b/mods/people/textures/amedinstructor.png new file mode 100644 index 0000000..8e24de5 Binary files /dev/null and b/mods/people/textures/amedinstructor.png differ diff --git a/mods/people/textures/amedminer.png b/mods/people/textures/amedminer.png new file mode 100644 index 0000000..8b5b9de Binary files /dev/null and b/mods/people/textures/amedminer.png differ diff --git a/mods/people/textures/amedsmith.png b/mods/people/textures/amedsmith.png new file mode 100644 index 0000000..465dd84 Binary files /dev/null and b/mods/people/textures/amedsmith.png differ diff --git a/mods/people/textures/amedvillager.png b/mods/people/textures/amedvillager.png new file mode 100644 index 0000000..07879cd Binary files /dev/null and b/mods/people/textures/amedvillager.png differ diff --git a/mods/people/textures/amedwarrior.png b/mods/people/textures/amedwarrior.png new file mode 100644 index 0000000..030aeb9 Binary files /dev/null and b/mods/people/textures/amedwarrior.png differ diff --git a/mods/people/textures/amineshaft.png b/mods/people/textures/amineshaft.png new file mode 100644 index 0000000..90d9d03 Binary files /dev/null and b/mods/people/textures/amineshaft.png differ diff --git a/mods/people/textures/anordoctor.png b/mods/people/textures/anordoctor.png new file mode 100644 index 0000000..67ea6e8 Binary files /dev/null and b/mods/people/textures/anordoctor.png differ diff --git a/mods/people/textures/anorfarmer.png b/mods/people/textures/anorfarmer.png new file mode 100644 index 0000000..e49eab8 Binary files /dev/null and b/mods/people/textures/anorfarmer.png differ diff --git a/mods/people/textures/anorinstructor.png b/mods/people/textures/anorinstructor.png new file mode 100644 index 0000000..f77f9ef Binary files /dev/null and b/mods/people/textures/anorinstructor.png differ diff --git a/mods/people/textures/anorminer.png b/mods/people/textures/anorminer.png new file mode 100644 index 0000000..c3f8e95 Binary files /dev/null and b/mods/people/textures/anorminer.png differ diff --git a/mods/people/textures/anorsmith.png b/mods/people/textures/anorsmith.png new file mode 100644 index 0000000..6793c4b Binary files /dev/null and b/mods/people/textures/anorsmith.png differ diff --git a/mods/people/textures/anorvillager.png b/mods/people/textures/anorvillager.png new file mode 100644 index 0000000..26db8ab Binary files /dev/null and b/mods/people/textures/anorvillager.png differ diff --git a/mods/people/textures/anorwarrior.png b/mods/people/textures/anorwarrior.png new file mode 100644 index 0000000..47497b1 Binary files /dev/null and b/mods/people/textures/anorwarrior.png differ diff --git a/mods/people/textures/apapdoctor.png b/mods/people/textures/apapdoctor.png new file mode 100644 index 0000000..1ee51cf Binary files /dev/null and b/mods/people/textures/apapdoctor.png differ diff --git a/mods/people/textures/apapvillager.png b/mods/people/textures/apapvillager.png new file mode 100644 index 0000000..c1243e1 Binary files /dev/null and b/mods/people/textures/apapvillager.png differ diff --git a/mods/people/textures/apirate.png b/mods/people/textures/apirate.png new file mode 100644 index 0000000..038e763 Binary files /dev/null and b/mods/people/textures/apirate.png differ diff --git a/mods/people/textures/aplough.png b/mods/people/textures/aplough.png new file mode 100644 index 0000000..132297d Binary files /dev/null and b/mods/people/textures/aplough.png differ diff --git a/mods/people/textures/aplunderercrossbow.png b/mods/people/textures/aplunderercrossbow.png new file mode 100644 index 0000000..a450a8f Binary files /dev/null and b/mods/people/textures/aplunderercrossbow.png differ diff --git a/mods/people/textures/aplundererflask.png b/mods/people/textures/aplundererflask.png new file mode 100644 index 0000000..e67d370 Binary files /dev/null and b/mods/people/textures/aplundererflask.png differ diff --git a/mods/people/textures/aplundererstick.png b/mods/people/textures/aplundererstick.png new file mode 100644 index 0000000..339a04d Binary files /dev/null and b/mods/people/textures/aplundererstick.png differ diff --git a/mods/people/textures/arideelephant.png b/mods/people/textures/arideelephant.png new file mode 100644 index 0000000..a247fb6 Binary files /dev/null and b/mods/people/textures/arideelephant.png differ diff --git a/mods/people/textures/aridehorse.png b/mods/people/textures/aridehorse.png new file mode 100644 index 0000000..27d2a24 Binary files /dev/null and b/mods/people/textures/aridehorse.png differ diff --git a/mods/people/textures/arideostrich.png b/mods/people/textures/arideostrich.png new file mode 100644 index 0000000..4b84fa4 Binary files /dev/null and b/mods/people/textures/arideostrich.png differ diff --git a/mods/people/textures/arideox.png b/mods/people/textures/arideox.png new file mode 100644 index 0000000..47cc33d Binary files /dev/null and b/mods/people/textures/arideox.png differ diff --git a/mods/people/textures/aridepig.png b/mods/people/textures/aridepig.png new file mode 100644 index 0000000..b6fbbf7 Binary files /dev/null and b/mods/people/textures/aridepig.png differ diff --git a/mods/people/textures/aridereindeer.png b/mods/people/textures/aridereindeer.png new file mode 100644 index 0000000..0d2066d Binary files /dev/null and b/mods/people/textures/aridereindeer.png differ diff --git a/mods/people/textures/asamfarmer.png b/mods/people/textures/asamfarmer.png new file mode 100644 index 0000000..1012735 Binary files /dev/null and b/mods/people/textures/asamfarmer.png differ diff --git a/mods/people/textures/asamsmith.png b/mods/people/textures/asamsmith.png new file mode 100644 index 0000000..36228f9 Binary files /dev/null and b/mods/people/textures/asamsmith.png differ diff --git a/mods/people/textures/asamwarrior.png b/mods/people/textures/asamwarrior.png new file mode 100644 index 0000000..719b38f Binary files /dev/null and b/mods/people/textures/asamwarrior.png differ diff --git a/mods/people/textures/avillagerbed.png b/mods/people/textures/avillagerbed.png new file mode 100644 index 0000000..e57522b Binary files /dev/null and b/mods/people/textures/avillagerbed.png differ diff --git a/mods/people/textures/aweaponstand.png b/mods/people/textures/aweaponstand.png new file mode 100644 index 0000000..ca4cd5a Binary files /dev/null and b/mods/people/textures/aweaponstand.png differ diff --git a/mods/people/textures/azombie.png b/mods/people/textures/azombie.png new file mode 100644 index 0000000..f64d117 Binary files /dev/null and b/mods/people/textures/azombie.png differ diff --git a/mods/people/textures/bolt.png b/mods/people/textures/bolt.png new file mode 100644 index 0000000..e0454dd Binary files /dev/null and b/mods/people/textures/bolt.png differ diff --git a/mods/people/textures/flask.png b/mods/people/textures/flask.png new file mode 100644 index 0000000..c45429b Binary files /dev/null and b/mods/people/textures/flask.png differ diff --git a/mods/people/textures/people_bandage.png b/mods/people/textures/people_bandage.png new file mode 100644 index 0000000..5974db2 Binary files /dev/null and b/mods/people/textures/people_bandage.png differ diff --git a/mods/people/textures/people_bootynode_back.png b/mods/people/textures/people_bootynode_back.png new file mode 100644 index 0000000..8d9e672 Binary files /dev/null and b/mods/people/textures/people_bootynode_back.png differ diff --git a/mods/people/textures/people_bootynode_bottom.png b/mods/people/textures/people_bootynode_bottom.png new file mode 100644 index 0000000..b71b3c0 Binary files /dev/null and b/mods/people/textures/people_bootynode_bottom.png differ diff --git a/mods/people/textures/people_bootynode_front.png b/mods/people/textures/people_bootynode_front.png new file mode 100644 index 0000000..3a4e987 Binary files /dev/null and b/mods/people/textures/people_bootynode_front.png differ diff --git a/mods/people/textures/people_bootynode_left.png b/mods/people/textures/people_bootynode_left.png new file mode 100644 index 0000000..7db4243 Binary files /dev/null and b/mods/people/textures/people_bootynode_left.png differ diff --git a/mods/people/textures/people_bootynode_right.png b/mods/people/textures/people_bootynode_right.png new file mode 100644 index 0000000..222d028 Binary files /dev/null and b/mods/people/textures/people_bootynode_right.png differ diff --git a/mods/people/textures/people_bootynode_top.png b/mods/people/textures/people_bootynode_top.png new file mode 100644 index 0000000..5687a86 Binary files /dev/null and b/mods/people/textures/people_bootynode_top.png differ diff --git a/mods/people/textures/people_dogfood.png b/mods/people/textures/people_dogfood.png new file mode 100644 index 0000000..c8d50d1 Binary files /dev/null and b/mods/people/textures/people_dogfood.png differ diff --git a/mods/people/textures/people_dogfood_cooked.png b/mods/people/textures/people_dogfood_cooked.png new file mode 100644 index 0000000..c9bec66 Binary files /dev/null and b/mods/people/textures/people_dogfood_cooked.png differ diff --git a/mods/people/textures/people_dogfoodsack_back.png b/mods/people/textures/people_dogfoodsack_back.png new file mode 100644 index 0000000..e0fca08 Binary files /dev/null and b/mods/people/textures/people_dogfoodsack_back.png differ diff --git a/mods/people/textures/people_dogfoodsack_bottom.png b/mods/people/textures/people_dogfoodsack_bottom.png new file mode 100644 index 0000000..f379445 Binary files /dev/null and b/mods/people/textures/people_dogfoodsack_bottom.png differ diff --git a/mods/people/textures/people_dogfoodsack_front.png b/mods/people/textures/people_dogfoodsack_front.png new file mode 100644 index 0000000..102bb13 Binary files /dev/null and b/mods/people/textures/people_dogfoodsack_front.png differ diff --git a/mods/people/textures/people_dogfoodsack_left.png b/mods/people/textures/people_dogfoodsack_left.png new file mode 100644 index 0000000..7dc3994 Binary files /dev/null and b/mods/people/textures/people_dogfoodsack_left.png differ diff --git a/mods/people/textures/people_dogfoodsack_right.png b/mods/people/textures/people_dogfoodsack_right.png new file mode 100644 index 0000000..8467543 Binary files /dev/null and b/mods/people/textures/people_dogfoodsack_right.png differ diff --git a/mods/people/textures/people_dogfoodsack_top.png b/mods/people/textures/people_dogfoodsack_top.png new file mode 100644 index 0000000..30c433b Binary files /dev/null and b/mods/people/textures/people_dogfoodsack_top.png differ diff --git a/mods/people/textures/people_emblemoftriumph.png b/mods/people/textures/people_emblemoftriumph.png new file mode 100644 index 0000000..09de07b Binary files /dev/null and b/mods/people/textures/people_emblemoftriumph.png differ diff --git a/mods/people/textures/people_firsaidkit_back.png b/mods/people/textures/people_firsaidkit_back.png new file mode 100644 index 0000000..2983e7d Binary files /dev/null and b/mods/people/textures/people_firsaidkit_back.png differ diff --git a/mods/people/textures/people_firsaidkit_bottom.png b/mods/people/textures/people_firsaidkit_bottom.png new file mode 100644 index 0000000..31b9026 Binary files /dev/null and b/mods/people/textures/people_firsaidkit_bottom.png differ diff --git a/mods/people/textures/people_firsaidkit_front.png b/mods/people/textures/people_firsaidkit_front.png new file mode 100644 index 0000000..5350778 Binary files /dev/null and b/mods/people/textures/people_firsaidkit_front.png differ diff --git a/mods/people/textures/people_firsaidkit_left.png b/mods/people/textures/people_firsaidkit_left.png new file mode 100644 index 0000000..7b8b4f6 Binary files /dev/null and b/mods/people/textures/people_firsaidkit_left.png differ diff --git a/mods/people/textures/people_firsaidkit_right.png b/mods/people/textures/people_firsaidkit_right.png new file mode 100644 index 0000000..d606872 Binary files /dev/null and b/mods/people/textures/people_firsaidkit_right.png differ diff --git a/mods/people/textures/people_firsaidkit_top.png b/mods/people/textures/people_firsaidkit_top.png new file mode 100644 index 0000000..c3de94d Binary files /dev/null and b/mods/people/textures/people_firsaidkit_top.png differ diff --git a/mods/people/textures/people_firstaidnode_back.png b/mods/people/textures/people_firstaidnode_back.png new file mode 100644 index 0000000..220f2d8 Binary files /dev/null and b/mods/people/textures/people_firstaidnode_back.png differ diff --git a/mods/people/textures/people_firstaidnode_bottom.png b/mods/people/textures/people_firstaidnode_bottom.png new file mode 100644 index 0000000..c2ab5d0 Binary files /dev/null and b/mods/people/textures/people_firstaidnode_bottom.png differ diff --git a/mods/people/textures/people_firstaidnode_front.png b/mods/people/textures/people_firstaidnode_front.png new file mode 100644 index 0000000..c36a0b3 Binary files /dev/null and b/mods/people/textures/people_firstaidnode_front.png differ diff --git a/mods/people/textures/people_firstaidnode_left.png b/mods/people/textures/people_firstaidnode_left.png new file mode 100644 index 0000000..0b82f8f Binary files /dev/null and b/mods/people/textures/people_firstaidnode_left.png differ diff --git a/mods/people/textures/people_firstaidnode_right.png b/mods/people/textures/people_firstaidnode_right.png new file mode 100644 index 0000000..097cb7e Binary files /dev/null and b/mods/people/textures/people_firstaidnode_right.png differ diff --git a/mods/people/textures/people_firstaidnode_top.png b/mods/people/textures/people_firstaidnode_top.png new file mode 100644 index 0000000..ccb2d77 Binary files /dev/null and b/mods/people/textures/people_firstaidnode_top.png differ diff --git a/mods/people/textures/people_mutton_cooked.png b/mods/people/textures/people_mutton_cooked.png new file mode 100644 index 0000000..8eaf022 Binary files /dev/null and b/mods/people/textures/people_mutton_cooked.png differ diff --git a/mods/people/textures/people_mutton_raw.png b/mods/people/textures/people_mutton_raw.png new file mode 100644 index 0000000..692bc05 Binary files /dev/null and b/mods/people/textures/people_mutton_raw.png differ diff --git a/mods/people/textures/spearfly.png b/mods/people/textures/spearfly.png new file mode 100644 index 0000000..a9ae499 Binary files /dev/null and b/mods/people/textures/spearfly.png differ diff --git a/mods/people/textures/textureaboinstructor.png b/mods/people/textures/textureaboinstructor.png new file mode 100644 index 0000000..2a928c3 Binary files /dev/null and b/mods/people/textures/textureaboinstructor.png differ diff --git a/mods/people/textures/textureabominer.png b/mods/people/textures/textureabominer.png new file mode 100644 index 0000000..0e78dae Binary files /dev/null and b/mods/people/textures/textureabominer.png differ diff --git a/mods/people/textures/textureafrfarmer.png b/mods/people/textures/textureafrfarmer.png new file mode 100644 index 0000000..a5f7067 Binary files /dev/null and b/mods/people/textures/textureafrfarmer.png differ diff --git a/mods/people/textures/textureafrinstructor.png b/mods/people/textures/textureafrinstructor.png new file mode 100644 index 0000000..01393c5 Binary files /dev/null and b/mods/people/textures/textureafrinstructor.png differ diff --git a/mods/people/textures/textureafrsmith.png b/mods/people/textures/textureafrsmith.png new file mode 100644 index 0000000..7da8b84 Binary files /dev/null and b/mods/people/textures/textureafrsmith.png differ diff --git a/mods/people/textures/textureafrwarrior.png b/mods/people/textures/textureafrwarrior.png new file mode 100644 index 0000000..9a364a2 Binary files /dev/null and b/mods/people/textures/textureafrwarrior.png differ diff --git a/mods/people/textures/texturearadoctor.png b/mods/people/textures/texturearadoctor.png new file mode 100644 index 0000000..1e1e99e Binary files /dev/null and b/mods/people/textures/texturearadoctor.png differ diff --git a/mods/people/textures/texturearaminer.png b/mods/people/textures/texturearaminer.png new file mode 100644 index 0000000..94a1052 Binary files /dev/null and b/mods/people/textures/texturearaminer.png differ diff --git a/mods/people/textures/texturearavillager.png b/mods/people/textures/texturearavillager.png new file mode 100644 index 0000000..b590aae Binary files /dev/null and b/mods/people/textures/texturearavillager.png differ diff --git a/mods/people/textures/texturechindoctor.png b/mods/people/textures/texturechindoctor.png new file mode 100644 index 0000000..579d581 Binary files /dev/null and b/mods/people/textures/texturechindoctor.png differ diff --git a/mods/people/textures/texturechinfarmer.png b/mods/people/textures/texturechinfarmer.png new file mode 100644 index 0000000..231b8ae Binary files /dev/null and b/mods/people/textures/texturechinfarmer.png differ diff --git a/mods/people/textures/texturechininstructor.png b/mods/people/textures/texturechininstructor.png new file mode 100644 index 0000000..80bd6f9 Binary files /dev/null and b/mods/people/textures/texturechininstructor.png differ diff --git a/mods/people/textures/texturechinsmith.png b/mods/people/textures/texturechinsmith.png new file mode 100644 index 0000000..a0bb3fa Binary files /dev/null and b/mods/people/textures/texturechinsmith.png differ diff --git a/mods/people/textures/texturedog.png b/mods/people/textures/texturedog.png new file mode 100644 index 0000000..472ebd4 Binary files /dev/null and b/mods/people/textures/texturedog.png differ diff --git a/mods/people/textures/texturedogbaby.png b/mods/people/textures/texturedogbaby.png new file mode 100644 index 0000000..cee2070 Binary files /dev/null and b/mods/people/textures/texturedogbaby.png differ diff --git a/mods/people/textures/textureevilminer.png b/mods/people/textures/textureevilminer.png new file mode 100644 index 0000000..2884abb Binary files /dev/null and b/mods/people/textures/textureevilminer.png differ diff --git a/mods/people/textures/textureeweminer.png b/mods/people/textures/textureeweminer.png new file mode 100644 index 0000000..e4819cf Binary files /dev/null and b/mods/people/textures/textureeweminer.png differ diff --git a/mods/people/textures/textureewevillager.png b/mods/people/textures/textureewevillager.png new file mode 100644 index 0000000..ecdad91 Binary files /dev/null and b/mods/people/textures/textureewevillager.png differ diff --git a/mods/people/textures/textureewewarrior.png b/mods/people/textures/textureewewarrior.png new file mode 100644 index 0000000..de0701c Binary files /dev/null and b/mods/people/textures/textureewewarrior.png differ diff --git a/mods/people/textures/texturefeeder.png b/mods/people/textures/texturefeeder.png new file mode 100644 index 0000000..fd65025 Binary files /dev/null and b/mods/people/textures/texturefeeder.png differ diff --git a/mods/people/textures/textureforge.png b/mods/people/textures/textureforge.png new file mode 100644 index 0000000..639a41e Binary files /dev/null and b/mods/people/textures/textureforge.png differ diff --git a/mods/people/textures/texturegoat.png b/mods/people/textures/texturegoat.png new file mode 100644 index 0000000..0669806 Binary files /dev/null and b/mods/people/textures/texturegoat.png differ diff --git a/mods/people/textures/texturegoat2.png b/mods/people/textures/texturegoat2.png new file mode 100644 index 0000000..d6b9ca6 Binary files /dev/null and b/mods/people/textures/texturegoat2.png differ diff --git a/mods/people/textures/texturegrave.png b/mods/people/textures/texturegrave.png new file mode 100644 index 0000000..5f739e2 Binary files /dev/null and b/mods/people/textures/texturegrave.png differ diff --git a/mods/people/textures/texturehatefulminer.png b/mods/people/textures/texturehatefulminer.png new file mode 100644 index 0000000..25daf65 Binary files /dev/null and b/mods/people/textures/texturehatefulminer.png differ diff --git a/mods/people/textures/texturejealousminer.png b/mods/people/textures/texturejealousminer.png new file mode 100644 index 0000000..9e4c480 Binary files /dev/null and b/mods/people/textures/texturejealousminer.png differ diff --git a/mods/people/textures/texturemeddoctor.png b/mods/people/textures/texturemeddoctor.png new file mode 100644 index 0000000..65432e1 Binary files /dev/null and b/mods/people/textures/texturemeddoctor.png differ diff --git a/mods/people/textures/texturemedfarmer.png b/mods/people/textures/texturemedfarmer.png new file mode 100644 index 0000000..441e1ed Binary files /dev/null and b/mods/people/textures/texturemedfarmer.png differ diff --git a/mods/people/textures/texturemedinstructor.png b/mods/people/textures/texturemedinstructor.png new file mode 100644 index 0000000..1299acd Binary files /dev/null and b/mods/people/textures/texturemedinstructor.png differ diff --git a/mods/people/textures/texturemedminer.png b/mods/people/textures/texturemedminer.png new file mode 100644 index 0000000..6ed94d7 Binary files /dev/null and b/mods/people/textures/texturemedminer.png differ diff --git a/mods/people/textures/texturemedsmith.png b/mods/people/textures/texturemedsmith.png new file mode 100644 index 0000000..f55e46a Binary files /dev/null and b/mods/people/textures/texturemedsmith.png differ diff --git a/mods/people/textures/texturemedvillager.png b/mods/people/textures/texturemedvillager.png new file mode 100644 index 0000000..a1dd4bc Binary files /dev/null and b/mods/people/textures/texturemedvillager.png differ diff --git a/mods/people/textures/texturemedwarrior.png b/mods/people/textures/texturemedwarrior.png new file mode 100644 index 0000000..e15f0e1 Binary files /dev/null and b/mods/people/textures/texturemedwarrior.png differ diff --git a/mods/people/textures/texturemineshaft.png b/mods/people/textures/texturemineshaft.png new file mode 100644 index 0000000..bf20034 Binary files /dev/null and b/mods/people/textures/texturemineshaft.png differ diff --git a/mods/people/textures/texturenordoctor.png b/mods/people/textures/texturenordoctor.png new file mode 100644 index 0000000..1a09f82 Binary files /dev/null and b/mods/people/textures/texturenordoctor.png differ diff --git a/mods/people/textures/texturenorfarmer.png b/mods/people/textures/texturenorfarmer.png new file mode 100644 index 0000000..7041f27 Binary files /dev/null and b/mods/people/textures/texturenorfarmer.png differ diff --git a/mods/people/textures/texturenorinstructor.png b/mods/people/textures/texturenorinstructor.png new file mode 100644 index 0000000..d9db77d Binary files /dev/null and b/mods/people/textures/texturenorinstructor.png differ diff --git a/mods/people/textures/texturenorminer.png b/mods/people/textures/texturenorminer.png new file mode 100644 index 0000000..296c20e Binary files /dev/null and b/mods/people/textures/texturenorminer.png differ diff --git a/mods/people/textures/texturenorsmith.png b/mods/people/textures/texturenorsmith.png new file mode 100644 index 0000000..3c569dc Binary files /dev/null and b/mods/people/textures/texturenorsmith.png differ diff --git a/mods/people/textures/texturenorvillager.png b/mods/people/textures/texturenorvillager.png new file mode 100644 index 0000000..6a6a992 Binary files /dev/null and b/mods/people/textures/texturenorvillager.png differ diff --git a/mods/people/textures/texturenorwarrior.png b/mods/people/textures/texturenorwarrior.png new file mode 100644 index 0000000..362baf7 Binary files /dev/null and b/mods/people/textures/texturenorwarrior.png differ diff --git a/mods/people/textures/texturepapdoctor.png b/mods/people/textures/texturepapdoctor.png new file mode 100644 index 0000000..5e78a88 Binary files /dev/null and b/mods/people/textures/texturepapdoctor.png differ diff --git a/mods/people/textures/texturepapvillager.png b/mods/people/textures/texturepapvillager.png new file mode 100644 index 0000000..d35d000 Binary files /dev/null and b/mods/people/textures/texturepapvillager.png differ diff --git a/mods/people/textures/texturepirate.png b/mods/people/textures/texturepirate.png new file mode 100644 index 0000000..1ad4aff Binary files /dev/null and b/mods/people/textures/texturepirate.png differ diff --git a/mods/people/textures/textureplough.png b/mods/people/textures/textureplough.png new file mode 100644 index 0000000..b6feee9 Binary files /dev/null and b/mods/people/textures/textureplough.png differ diff --git a/mods/people/textures/textureplunderercrossbow.png b/mods/people/textures/textureplunderercrossbow.png new file mode 100644 index 0000000..1fa7713 Binary files /dev/null and b/mods/people/textures/textureplunderercrossbow.png differ diff --git a/mods/people/textures/textureplundererflask.png b/mods/people/textures/textureplundererflask.png new file mode 100644 index 0000000..8a60095 Binary files /dev/null and b/mods/people/textures/textureplundererflask.png differ diff --git a/mods/people/textures/textureplundererstick.png b/mods/people/textures/textureplundererstick.png new file mode 100644 index 0000000..119d65d Binary files /dev/null and b/mods/people/textures/textureplundererstick.png differ diff --git a/mods/people/textures/texturerideelephant.png b/mods/people/textures/texturerideelephant.png new file mode 100644 index 0000000..7d10da7 Binary files /dev/null and b/mods/people/textures/texturerideelephant.png differ diff --git a/mods/people/textures/textureridehorse.png b/mods/people/textures/textureridehorse.png new file mode 100644 index 0000000..9e92f6b Binary files /dev/null and b/mods/people/textures/textureridehorse.png differ diff --git a/mods/people/textures/textureridehorse2.png b/mods/people/textures/textureridehorse2.png new file mode 100644 index 0000000..c04837a Binary files /dev/null and b/mods/people/textures/textureridehorse2.png differ diff --git a/mods/people/textures/textureridehorse3.png b/mods/people/textures/textureridehorse3.png new file mode 100644 index 0000000..ed4be86 Binary files /dev/null and b/mods/people/textures/textureridehorse3.png differ diff --git a/mods/people/textures/textureridehorse4.png b/mods/people/textures/textureridehorse4.png new file mode 100644 index 0000000..5ffbf1d Binary files /dev/null and b/mods/people/textures/textureridehorse4.png differ diff --git a/mods/people/textures/textureridehorse5.png b/mods/people/textures/textureridehorse5.png new file mode 100644 index 0000000..9e92f6b Binary files /dev/null and b/mods/people/textures/textureridehorse5.png differ diff --git a/mods/people/textures/textureridehorse6.png b/mods/people/textures/textureridehorse6.png new file mode 100644 index 0000000..c7eec86 Binary files /dev/null and b/mods/people/textures/textureridehorse6.png differ diff --git a/mods/people/textures/textureridehorse7.png b/mods/people/textures/textureridehorse7.png new file mode 100644 index 0000000..62a9d1a Binary files /dev/null and b/mods/people/textures/textureridehorse7.png differ diff --git a/mods/people/textures/textureridehorse8.png b/mods/people/textures/textureridehorse8.png new file mode 100644 index 0000000..8dbd02e Binary files /dev/null and b/mods/people/textures/textureridehorse8.png differ diff --git a/mods/people/textures/textureridehorse9.png b/mods/people/textures/textureridehorse9.png new file mode 100644 index 0000000..1424b71 Binary files /dev/null and b/mods/people/textures/textureridehorse9.png differ diff --git a/mods/people/textures/texturerideostrich.png b/mods/people/textures/texturerideostrich.png new file mode 100644 index 0000000..94655e8 Binary files /dev/null and b/mods/people/textures/texturerideostrich.png differ diff --git a/mods/people/textures/texturerideox.png b/mods/people/textures/texturerideox.png new file mode 100644 index 0000000..b996488 Binary files /dev/null and b/mods/people/textures/texturerideox.png differ diff --git a/mods/people/textures/textureridepig.png b/mods/people/textures/textureridepig.png new file mode 100644 index 0000000..31f241c Binary files /dev/null and b/mods/people/textures/textureridepig.png differ diff --git a/mods/people/textures/textureridereindeer.png b/mods/people/textures/textureridereindeer.png new file mode 100644 index 0000000..acf5c84 Binary files /dev/null and b/mods/people/textures/textureridereindeer.png differ diff --git a/mods/people/textures/texturesamfarmer.png b/mods/people/textures/texturesamfarmer.png new file mode 100644 index 0000000..da0facd Binary files /dev/null and b/mods/people/textures/texturesamfarmer.png differ diff --git a/mods/people/textures/texturesamsmith.png b/mods/people/textures/texturesamsmith.png new file mode 100644 index 0000000..e613990 Binary files /dev/null and b/mods/people/textures/texturesamsmith.png differ diff --git a/mods/people/textures/texturesamwarrior.png b/mods/people/textures/texturesamwarrior.png new file mode 100644 index 0000000..d6fa430 Binary files /dev/null and b/mods/people/textures/texturesamwarrior.png differ diff --git a/mods/people/textures/texturevillager.png b/mods/people/textures/texturevillager.png new file mode 100644 index 0000000..c43a2c7 Binary files /dev/null and b/mods/people/textures/texturevillager.png differ diff --git a/mods/people/textures/texturevillagerbed.png b/mods/people/textures/texturevillagerbed.png new file mode 100644 index 0000000..4969590 Binary files /dev/null and b/mods/people/textures/texturevillagerbed.png differ diff --git a/mods/people/textures/textureweaponstand.png b/mods/people/textures/textureweaponstand.png new file mode 100644 index 0000000..f13c101 Binary files /dev/null and b/mods/people/textures/textureweaponstand.png differ diff --git a/mods/people/textures/texturezombie.png b/mods/people/textures/texturezombie.png new file mode 100644 index 0000000..810f2d9 Binary files /dev/null and b/mods/people/textures/texturezombie.png differ diff --git a/mods/people/villagerbed.lua b/mods/people/villagerbed.lua new file mode 100644 index 0000000..93b410e --- /dev/null +++ b/mods/people/villagerbed.lua @@ -0,0 +1,34 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:villagerbed", { + description = S"Villager Bed", + visual_scale = 1.0, + mesh = "Villagerbed.b3d", + tiles = {"texturevillagerbed.png"}, + inventory_image = "avillagerbed.png", + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 3}, + drawtype = "mesh", + collision_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.5, 0.9, 0.2, 0.5}, + --[[{-1, -0.5, -0.5, 0.9, 0.2, 0.5}, + {-1, -0.5, -0.5, 0.9, 0.2, 0.5}]] + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.5, 0.9, 0.5, 0.5} + } + }, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "fuel", + recipe = "people:villagerbed", + burntime = 6, +}) diff --git a/mods/people/weaponstand.lua b/mods/people/weaponstand.lua new file mode 100644 index 0000000..f6107ff --- /dev/null +++ b/mods/people/weaponstand.lua @@ -0,0 +1,22 @@ +local S = minetest.get_translator("people") + +minetest.register_node("people:weaponstand", { + description = S"Weaponstand", + visual_scale = 1, + mesh = "Weaponstand.b3d", + tiles = {"textureweaponstand.png"}, + inventory_image = "aweaponstand.png", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + groups = {choppy = 3}, + drawtype = "mesh", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.4, 0.4}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "people:weaponstand", +}) \ No newline at end of file diff --git a/mods/people/zombiedoctor.lua b/mods/people/zombiedoctor.lua new file mode 100644 index 0000000..1bab97a --- /dev/null +++ b/mods/people/zombiedoctor.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombiedoctor", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + jump = true, + stay_near = {{"people:firstaidnode"}, 4}, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombiedoctor", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:doctorgrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombiedoctor", S("Zombie"), "azombie.png") diff --git a/mods/people/zombiefarmer.lua b/mods/people/zombiefarmer.lua new file mode 100644 index 0000000..145b9cd --- /dev/null +++ b/mods/people/zombiefarmer.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombiefarmer", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + stay_near = {{"people:feeder"}, 4}, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombiefarmer", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:farmergrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombiefarmer", S("Zombie"), "azombie.png") \ No newline at end of file diff --git a/mods/people/zombieinstructor.lua b/mods/people/zombieinstructor.lua new file mode 100644 index 0000000..79fbdd4 --- /dev/null +++ b/mods/people/zombieinstructor.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombieinstructor", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + jump = true, + stay_near = {{"people:weaponstand"}, 4}, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombieinstructor", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:instructorgrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombieinstructor", S("Zombie"), "azombie.png") \ No newline at end of file diff --git a/mods/people/zombieminer.lua b/mods/people/zombieminer.lua new file mode 100644 index 0000000..f829108 --- /dev/null +++ b/mods/people/zombieminer.lua @@ -0,0 +1,83 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombieminer", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombieminer", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:minergrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombieminer", S("Zombie"), "azombie.png") \ No newline at end of file diff --git a/mods/people/zombiesmith.lua b/mods/people/zombiesmith.lua new file mode 100644 index 0000000..eb6578a --- /dev/null +++ b/mods/people/zombiesmith.lua @@ -0,0 +1,83 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombiesmith", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + jump = true, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombiesmith", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:smithgrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombiesmith", S("Zombie"), "azombie.png") \ No newline at end of file diff --git a/mods/people/zombievillager.lua b/mods/people/zombievillager.lua new file mode 100644 index 0000000..b811daf --- /dev/null +++ b/mods/people/zombievillager.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombievillager", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + jump = true, + stay_near = {{"people:villagerbed"}, 4}, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombievillager", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:villagergrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombievillager", S("Zombie"), "azombie.png") \ No newline at end of file diff --git a/mods/people/zombiewarrior.lua b/mods/people/zombiewarrior.lua new file mode 100644 index 0000000..d343525 --- /dev/null +++ b/mods/people/zombiewarrior.lua @@ -0,0 +1,84 @@ +local S = minetest.get_translator("people") + +mobs:register_mob("people:zombiewarrior", { + type = "monster", + passive = false, + step_height = 2, + fear_height = 4, + attack_type = "dogfight", + attack_animals = true, + reach = 2, + damage = 5, + hp_min = 35, + hp_max = 75, + armor = 100, + collisionbox = {-0.5, -0.01, -0.5, 0.5, 1.3, 0.5}, + visual = "mesh", + mesh = "Zombie.b3d", + visual_size = {x = 1.0, y = 1.0}, + textures = { + {"texturezombie.png"}, + }, + sounds = { + attack = "people_zombie4", + random = "people_zombie", + damage = "people_zombie2", + death = "people_zombie3", + distance = 15, + }, + makes_footstep_sound = true, + walk_velocity = 1, + run_velocity = 3, + walk_chance = 10, + runaway = false, + jump = true, + stay_near = {{"people:weaponstand"}, 5}, + drops = { + }, + water_damage = 0, + lava_damage = 4, + light_damage = 2, + animation = { + speed_normal = 60, + stand_speed = 50, + stand_start = 300, + stand_end = 400, + walk_start = 100, + walk_end = 200, + walk2_start = 200, + walk2_end = 300, + punch_start = 0, + punch_end = 100, + die_start = 0, + die_end = 100, + die_speed = 50, + die_loop = false, + die_rotate = true, + }, + view_range = 150, + + on_rightclick = function(self, clicker) + + -- feed or tame + if mobs:feed_tame(self, clicker, 4, false, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 15, 25, false, nil) then return end + end, +}) + +if not mobs.custom_spawn_people then +mobs:spawn({ + name = "people:zombiewarrior", + nodes = {"default:cobble", "default:mossycobble", "default:sandstonebrick", "default:dirt_with_snow", "default:dry_dirt", "default:dry_dirt_with_dry_grass", "default:permafrost", "default:permafrost", "default:sand", "default:desert_sand", "default:silver_sand", "default:gravel", "default:snowblock", "default:ice", "default:cave:ice", "default:desert_stone", "default:sandstone", "default:silver_sandstone"}, + neighbors = {"people:warriorgrave"}, + min_light = 0, + interval = 30, + active_object_count = 1, + chance = 10, -- 15000 + min_height = -25, + max_height = 1000, + day_toggle = false +}) +end + +mobs:register_egg("people:zombiewarrior", S("Zombie"), "azombie.png") \ No newline at end of file diff --git a/mods/plantlife_modpack/.github/workflows/luacheck.yml b/mods/plantlife_modpack/.github/workflows/luacheck.yml new file mode 100644 index 0000000..50995e1 --- /dev/null +++ b/mods/plantlife_modpack/.github/workflows/luacheck.yml @@ -0,0 +1,13 @@ +name: luacheck +on: [push, pull_request] +jobs: + luacheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: apt + run: sudo apt-get install -y luarocks + - name: luacheck install + run: luarocks install --local luacheck + - name: luacheck run + run: $HOME/.luarocks/bin/luacheck ./ diff --git a/mods/plantlife_modpack/.luacheckrc b/mods/plantlife_modpack/.luacheckrc new file mode 100644 index 0000000..a8b6e7c --- /dev/null +++ b/mods/plantlife_modpack/.luacheckrc @@ -0,0 +1,21 @@ +unused_args = false +allow_defined_top = true +max_line_length = 185 + +exclude_files = {".luacheckrc"} + +globals = { + "biome_lib", + "bushes_classic", +} + +read_globals = { + table = {fields = {"copy"}}, + + "minetest", "ItemStack", + "vector", + + "default", + "moretrees", + "dump", +} diff --git a/mods/plantlife_modpack/3dmushrooms/init.lua b/mods/plantlife_modpack/3dmushrooms/init.lua new file mode 100644 index 0000000..170a0da --- /dev/null +++ b/mods/plantlife_modpack/3dmushrooms/init.lua @@ -0,0 +1,65 @@ +-- 3D Mushroom mod by VanessaE + +minetest.override_item("flowers:mushroom_fertile_brown", { + drawtype = "mesh", + mesh = "3dmushrooms.obj", + tiles = {"3dmushrooms_brown.png"}, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} + }, + inventory_image = "3dmushrooms_brown_inv.png", + wield_image = "3dmushrooms_brown_inv.png" +}) + +minetest.override_item("flowers:mushroom_brown", { + drawtype = "mesh", + mesh = "3dmushrooms.obj", + tiles = {"3dmushrooms_brown.png"}, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} + }, + inventory_image = "3dmushrooms_brown_inv.png", + wield_image = "3dmushrooms_brown_inv.png" +}) + +minetest.override_item("flowers:mushroom_fertile_red", { + drawtype = "mesh", + mesh = "3dmushrooms.obj", + tiles = {"3dmushrooms_red.png"}, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} + }, + inventory_image = "3dmushrooms_red_inv.png", + wield_image = "3dmushrooms_red_inv.png" +}) + +minetest.override_item("flowers:mushroom_red", { + drawtype = "mesh", + mesh = "3dmushrooms.obj", + tiles = {"3dmushrooms_red.png"}, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3} + }, + inventory_image = "3dmushrooms_red_inv.png", + wield_image = "3dmushrooms_red_inv.png" +}) + +-- aliases to the default mushrooms + +minetest.register_alias("mushroom:brown", "flowers:mushroom_brown") +minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_fertile_brown") +minetest.register_alias("mushroom:spore_brown", "flowers:mushroom_spores_brown") +minetest.register_alias("mushroom:spore2", "flowers:mushroom_spores_brown") +minetest.register_alias("mushroom:brown_essence", "flowers:mushroom_brown") + +minetest.register_alias("mushroom:red", "flowers:mushroom_red") +minetest.register_alias("mushroom:red_natural", "flowers:mushroom_fertile_red") +minetest.register_alias("mushroom:spore_red", "flowers:mushroom_spores_red") +minetest.register_alias("mushroom:spore1", "flowers:mushroom_spores_red") +minetest.register_alias("mushroom:poison", "flowers:mushroom_red") + +minetest.register_alias("mushroom:identifier", "default:mese_crystal_fragment") diff --git a/mods/plantlife_modpack/3dmushrooms/mod.conf b/mods/plantlife_modpack/3dmushrooms/mod.conf new file mode 100644 index 0000000..d7b881e --- /dev/null +++ b/mods/plantlife_modpack/3dmushrooms/mod.conf @@ -0,0 +1,2 @@ +name = 3dmushrooms +depends = flowers diff --git a/mods/plantlife_modpack/3dmushrooms/models/3dmushrooms.obj b/mods/plantlife_modpack/3dmushrooms/models/3dmushrooms.obj new file mode 100644 index 0000000..bce1ed6 --- /dev/null +++ b/mods/plantlife_modpack/3dmushrooms/models/3dmushrooms.obj @@ -0,0 +1,329 @@ +# Blender v2.73 (sub 0) OBJ File: 'plantlife_mushroom.blend' +# www.blender.org +o Cylinder +v 0.261489 -0.177877 -0.000000 +v 0.165972 -0.203714 -0.000000 +v 0.210761 -0.224729 -0.000000 +v 0.258520 -0.211811 -0.000000 +v 0.185335 -0.171215 -0.184553 +v 0.116925 -0.199423 -0.118862 +v 0.148161 -0.219252 -0.151707 +v 0.182366 -0.205148 -0.184553 +v 0.001484 -0.155130 -0.260997 +v -0.001484 -0.189063 -0.168096 +v -0.002969 -0.206030 -0.214547 +v -0.001484 -0.189063 -0.260997 +v -0.182366 -0.139045 -0.184553 +v -0.119894 -0.178704 -0.118862 +v -0.154099 -0.192808 -0.151707 +v -0.185335 -0.172979 -0.184553 +v -0.258520 -0.132382 -0.000000 +v -0.168941 -0.174413 -0.000000 +v -0.216699 -0.187331 -0.000000 +v -0.261489 -0.166316 -0.000000 +v -0.182366 -0.139045 0.184553 +v -0.119894 -0.178704 0.118862 +v -0.154099 -0.192808 0.151707 +v -0.185335 -0.172979 0.184553 +v 0.001484 -0.155130 0.260997 +v -0.001484 -0.189063 0.168096 +v -0.002969 -0.206030 0.214547 +v -0.001484 -0.189063 0.260997 +v 0.185335 -0.171215 0.184553 +v 0.116925 -0.199423 0.118862 +v 0.148161 -0.219252 0.151708 +v 0.182366 -0.205148 0.184553 +v 0.059333 -0.075538 0.000000 +v 0.044915 -0.074277 -0.034942 +v 0.010106 -0.071232 -0.049416 +v -0.024704 -0.068186 -0.034942 +v -0.039122 -0.066925 0.000000 +v -0.024704 -0.068186 0.034942 +v 0.010106 -0.071232 0.049416 +v 0.044915 -0.074277 0.034942 +v 0.004580 -0.119744 -0.206430 +v 0.149993 -0.132466 -0.145968 +v 0.004580 -0.119744 0.206430 +v -0.140833 -0.107022 0.145968 +v 0.210225 -0.137736 -0.000000 +v 0.149993 -0.132466 0.145968 +v -0.201064 -0.101752 -0.000000 +v -0.140833 -0.107022 -0.145968 +v 0.033054 -0.500000 -0.079800 +v 0.025067 -0.177627 -0.060518 +v 0.079800 -0.500000 -0.033054 +v 0.060518 -0.177627 -0.025067 +v 0.079800 -0.500000 0.033054 +v 0.060518 -0.177627 0.025067 +v 0.033054 -0.500000 0.079800 +v 0.025067 -0.177627 0.060518 +v -0.033054 -0.500000 0.079800 +v -0.025067 -0.177627 0.060518 +v -0.079800 -0.500000 0.033054 +v -0.060518 -0.177627 0.025067 +v -0.079800 -0.500000 -0.033054 +v -0.060518 -0.177627 -0.025067 +v -0.033054 -0.500000 -0.079800 +v -0.025067 -0.177627 -0.060518 +v 0.014323 -0.253674 -0.065067 +v 0.012105 -0.382623 -0.072780 +v 0.052438 -0.253674 -0.026952 +v 0.054739 -0.382623 -0.030146 +v 0.052438 -0.253674 0.026952 +v 0.054739 -0.382623 0.030146 +v 0.014323 -0.253674 0.065067 +v 0.012105 -0.382623 0.072780 +v -0.039580 -0.253674 0.065067 +v -0.048187 -0.382623 0.072780 +v -0.077695 -0.253674 0.026952 +v -0.090820 -0.382623 0.030146 +v -0.077695 -0.253674 -0.026952 +v -0.090820 -0.382623 -0.030146 +v -0.039580 -0.253674 -0.065067 +v -0.048187 -0.382623 -0.072780 +vt 0.261010 0.917920 +vt 0.235559 0.983636 +vt 0.016350 0.764426 +vt 0.080814 0.737724 +vt 0.545568 0.235207 +vt 0.764778 0.454417 +vt 0.690996 0.484978 +vt 0.517617 0.311599 +vt 0.235559 0.235207 +vt 0.515845 0.302693 +vt 0.261010 0.302693 +vt 0.578125 0.234375 +vt 0.765625 0.234375 +vt 0.765625 0.312500 +vt 0.578125 0.312500 +vt 0.015625 0.234375 +vt 0.203125 0.234375 +vt 0.203125 0.312500 +vt 0.015625 0.312500 +vt 0.390625 0.312500 +vt 0.578125 0.390625 +vt 0.390625 0.390625 +vt 0.016350 0.454417 +vt 0.080814 0.482889 +vt 0.545569 0.983636 +vt 0.515845 0.917920 +vt 0.099043 0.730173 +vt 0.272422 0.903553 +vt 0.290733 0.368408 +vt 0.490395 0.368408 +vt 0.149550 0.709253 +vt 0.149550 0.509591 +vt 0.764778 0.764426 +vt 0.696041 0.737725 +vt 0.696041 0.482889 +vt 0.099043 0.484978 +vt 0.203125 0.390625 +vt 0.765625 0.390625 +vt 0.272422 0.311599 +vt 0.631577 0.509591 +vt 0.390625 0.234375 +vt 0.517617 0.903553 +vt 0.690996 0.730173 +vt 0.432320 0.675133 +vt 0.473823 0.633629 +vt 0.015625 0.390625 +vt 0.490395 0.850435 +vt 0.290733 0.850435 +vt 0.631577 0.709253 +vt 0.373624 0.533431 +vt 0.332121 0.574934 +vt 0.473823 0.574934 +vt 0.432320 0.533431 +vt 0.332121 0.633630 +vt 0.373624 0.675133 +vt 0.935126 0.767633 +vt 0.998032 0.830539 +vt 0.998032 0.919502 +vt 0.935126 0.982408 +vt 0.846164 0.982408 +vt 0.783257 0.919502 +vt 0.783258 0.830539 +vt 0.846164 0.767633 +vt 0.375000 0.187500 +vt 0.375000 0.031250 +vt 0.500000 0.031250 +vt 0.500000 0.187500 +vt 0.625000 0.031250 +vt 0.625000 0.187500 +vt 0.750000 0.031250 +vt 0.750000 0.187500 +vt 0.875000 0.031250 +vt 0.875000 0.187500 +vt 1.000000 0.031250 +vt 1.000000 0.187500 +vt 0.000000 0.031250 +vt 0.125000 0.031250 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.250000 0.031250 +vt 0.250000 0.187500 +vt 0.542224 0.015885 +vt 0.601585 0.075246 +vt 0.601585 0.159195 +vt 0.542224 0.218556 +vt 0.458275 0.218556 +vt 0.398914 0.159195 +vt 0.398914 0.075246 +vt 0.458275 0.015885 +vt 0.625000 0.125000 +vt 0.500000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.125000 +vt 1.000000 0.125000 +vt 0.125000 0.125000 +vt 0.000000 0.125000 +vt 0.250000 0.125000 +vt 0.375000 0.125000 +vn -0.147000 -0.987300 0.060400 +vn -0.648700 -0.460200 0.606100 +vn -0.898800 -0.438400 0.000000 +vn -0.172000 -0.985100 0.000000 +vn 0.672500 0.376500 0.637100 +vn 0.935400 0.353500 0.000000 +vn 0.529200 0.848500 0.000000 +vn 0.396700 0.860200 0.320400 +vn -0.044900 -0.513100 -0.857100 +vn 0.558900 -0.565900 -0.606100 +vn -0.026600 -0.997800 -0.060400 +vn -0.086800 -0.992500 -0.085500 +vn -0.044900 -0.513100 0.857100 +vn 0.037800 0.432000 0.901100 +vn -0.596900 0.487600 0.637100 +vn -0.648700 -0.460200 -0.606100 +vn -0.596900 0.487600 -0.637100 +vn 0.037800 0.432000 -0.901100 +vn 0.809000 -0.587800 0.000000 +vn 0.672500 0.376500 -0.637100 +vn -0.147000 -0.987300 -0.060400 +vn -0.086800 -0.992500 0.085500 +vn -0.859800 0.510500 0.000000 +vn -0.372100 0.928200 0.000000 +vn -0.240600 0.916500 -0.319400 +vn -0.085100 -0.972600 0.216400 +vn -0.237500 -0.959200 0.153000 +vn 0.130500 -0.991400 0.000000 +vn 0.067400 -0.985900 0.153000 +vn 0.558900 -0.565900 0.606100 +vn -0.026600 -0.997800 0.060400 +vn -0.001700 -1.000000 0.000000 +vn -0.240600 0.916500 0.319400 +vn 0.077500 0.888400 0.452400 +vn -0.300700 -0.953700 0.000000 +vn 0.077500 0.888400 -0.452400 +vn 0.396700 0.860200 -0.320400 +vn 0.086200 0.978700 -0.186300 +vn 0.217800 0.967000 -0.132200 +vn -0.085100 -0.972600 -0.216400 +vn 0.067400 -0.985900 -0.153000 +vn -0.237500 -0.959200 -0.153000 +vn 0.086200 0.978700 0.186300 +vn -0.044600 0.990300 0.131300 +vn 0.272600 0.962100 0.000000 +vn 0.217800 0.967000 0.132200 +vn -0.098600 0.995100 0.000000 +vn -0.044600 0.990300 -0.131300 +vn -0.273500 -0.626100 -0.730200 +vn -0.402500 0.040600 -0.914500 +vn 0.360300 0.084000 -0.929000 +vn 0.335600 -0.581700 -0.740900 +vn 0.369900 0.027700 -0.928600 +vn 0.921100 -0.031200 -0.388000 +vn 0.913800 0.116800 -0.388800 +vn 0.921100 -0.031200 0.388000 +vn 0.913800 0.116800 0.388800 +vn 0.369900 0.027700 0.928600 +vn 0.360300 0.084000 0.929000 +vn -0.391600 0.105700 0.914000 +vn -0.402500 0.040600 0.914500 +vn -0.914200 0.156600 0.373800 +vn -0.927200 0.012400 0.374500 +vn -0.914200 0.156600 -0.373800 +vn -0.927200 0.012400 -0.374500 +vn -0.391600 0.105700 -0.914000 +vn 0.774400 -0.552100 -0.309000 +vn 0.774400 -0.552100 0.309000 +vn 0.335600 -0.581700 0.740900 +vn -0.273500 -0.626100 0.730200 +vn -0.690800 -0.658600 0.298100 +vn -0.690800 -0.658600 -0.298100 +vn 0.416700 -0.004500 -0.909100 +vn 0.925800 -0.089300 -0.367400 +vn 0.925800 -0.089300 0.367400 +vn 0.416700 -0.004500 0.909100 +vn -0.344300 0.121400 0.931000 +vn -0.896600 0.212200 0.388700 +vn -0.896600 0.212200 -0.388700 +vn -0.344300 0.121400 -0.931000 +s 1 +f 23/1/1 24/2/2 20/3/3 19/4/4 +f 29/5/5 1/6/6 45/7/7 46/8/8 +f 12/9/9 8/5/10 7/10/11 11/11/12 +f 24/12/2 28/13/13 25/14/14 21/15/15 +f 12/16/9 16/17/16 13/18/17 9/19/18 +f 4/20/19 8/15/10 5/21/20 1/22/6 +f 16/23/16 12/9/9 11/11/12 15/24/21 +f 28/25/13 24/2/2 23/1/1 27/26/22 +f 13/2/17 17/3/23 47/27/24 48/28/25 +f 10/29/26 11/11/12 7/10/11 6/30/27 +f 18/31/28 19/4/4 15/24/21 14/32/29 +f 4/6/19 32/33/30 31/34/31 3/35/32 +f 17/3/23 21/23/15 44/36/33 47/27/24 +f 32/18/30 4/20/19 1/22/6 29/37/5 +f 8/5/10 4/6/19 3/35/32 7/10/11 +f 8/15/10 12/14/9 9/38/18 5/21/20 +f 25/9/14 29/5/5 46/8/8 43/39/34 +f 6/30/27 7/10/11 3/35/32 2/40/35 +f 16/17/16 20/41/3 17/20/23 13/18/17 +f 31/34/31 32/33/30 28/25/13 27/26/22 +f 5/33/20 9/25/18 41/42/36 42/43/37 +f 41/42/36 35/44/38 34/45/39 42/43/37 +f 15/24/21 11/11/12 10/29/26 14/32/29 +f 20/41/3 24/12/2 21/15/15 17/20/23 +f 1/6/6 5/33/20 42/43/37 45/7/7 +f 19/4/4 20/3/3 16/23/16 15/24/21 +f 28/19/13 32/18/30 29/37/5 25/46/14 +f 26/47/40 27/26/22 23/1/1 22/48/41 +f 21/23/15 25/9/14 43/39/34 44/36/33 +f 9/25/18 13/2/17 48/28/25 41/42/36 +f 23/1/1 19/4/4 18/31/28 22/48/41 +f 2/40/35 3/35/32 31/34/31 30/49/42 +f 43/39/34 39/50/43 38/51/44 44/36/33 +f 45/7/7 33/52/45 40/53/46 46/8/8 +f 42/43/37 34/45/39 33/52/45 45/7/7 +f 46/8/8 40/53/46 39/50/43 43/39/34 +f 44/36/33 38/51/44 37/54/47 47/27/24 +f 47/27/24 37/54/47 36/55/48 48/28/25 +f 48/28/25 36/55/48 35/44/38 41/42/36 +f 35/44/38 36/55/48 37/54/47 38/51/44 39/50/43 40/53/46 33/52/45 34/45/39 +f 6/56/27 2/57/35 30/58/42 26/59/40 22/60/41 18/61/28 14/62/29 10/63/26 +f 63/64/49 80/65/50 66/66/51 49/67/52 +f 65/66/53 67/68/54 68/69/55 66/67/51 +f 67/68/54 69/70/56 70/71/57 68/69/55 +f 69/70/56 71/72/58 72/73/59 70/71/57 +f 71/72/58 73/74/60 74/75/61 72/73/59 +f 73/76/60 75/77/62 76/78/63 74/79/61 +f 75/77/62 77/80/64 78/81/65 76/78/63 +f 77/80/64 79/65/66 80/64/50 78/81/65 +f 49/82/52 51/83/67 53/84/68 55/85/69 57/86/70 59/87/71 61/88/72 63/89/49 +f 50/66/73 52/68/74 67/90/54 65/91/53 +f 52/68/74 54/70/75 69/92/56 67/90/54 +f 66/66/51 68/68/55 51/69/67 49/67/52 +f 54/70/75 56/72/76 71/93/58 69/92/56 +f 68/68/55 70/70/57 53/71/68 51/69/67 +f 56/72/76 58/74/77 73/94/60 71/93/58 +f 70/70/57 72/72/59 55/73/69 53/71/68 +f 58/76/77 60/77/78 75/95/62 73/96/60 +f 72/72/59 74/74/61 57/75/70 55/73/69 +f 60/77/78 62/80/79 77/97/64 75/95/62 +f 74/76/61 76/77/63 59/78/71 57/79/70 +f 62/80/79 64/65/80 79/98/66 77/97/64 +f 76/77/63 78/80/65 61/81/72 59/78/71 +f 31/34/31 27/26/22 26/47/40 30/49/42 +f 78/80/65 80/65/50 63/64/49 61/81/72 +f 79/98/66 64/65/80 50/66/73 65/91/53 +f 79/65/66 65/66/53 66/67/51 80/64/50 diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png new file mode 100644 index 0000000..b82168e Binary files /dev/null and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown.png differ diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown_inv.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown_inv.png new file mode 100644 index 0000000..c9a7b3c Binary files /dev/null and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_brown_inv.png differ diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png new file mode 100644 index 0000000..91cc4a5 Binary files /dev/null and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red.png differ diff --git a/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png new file mode 100644 index 0000000..9868053 Binary files /dev/null and b/mods/plantlife_modpack/3dmushrooms/textures/3dmushrooms_red_inv.png differ diff --git a/mods/plantlife_modpack/LICENSE b/mods/plantlife_modpack/LICENSE new file mode 100644 index 0000000..624a8ec --- /dev/null +++ b/mods/plantlife_modpack/LICENSE @@ -0,0 +1,603 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +These licenses apply to all modules and components in this modpack, +unless otherwise stated. + +############################################################################### + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/plantlife_modpack/README b/mods/plantlife_modpack/README new file mode 100644 index 0000000..8c62e49 --- /dev/null +++ b/mods/plantlife_modpack/README @@ -0,0 +1,72 @@ +README file for Plantlife mod, by Vanessa Ezekowitz +--------------------------------------------------- + +Plantlife is a combined form of my Flowers and Poison Ivy mods and an expanded +version of the old Bushes mod, now called bushes_classic. The entire package +has been significantly rewritten and re-organized. This mod supplies all +three of these components and should be 100% compatible with mods that used +the old versions. + +Its purpose is to add various kinds of flowers, cotton plants, water foliage, +poison ivy, and fruit bushes, obviously. :-) All of these are spawned as +normal nodes and can be collected and used in any recipes that depend on the +old mods. + +Spawning of plants is sensitive to the amount of available light. Flowers, +cotton, and waterlilies only spawn when there at least a signficant amount of +light. Seaweed will grow only in dimly-lit areas. Poison ivy also grows only +in the daytime, but require less light than flowers. + +Growing of poison ivy will only occur for plants that are on the same surface +that is necessary for them to spawn on, so they won't grow if placed on e.g. +cobble or homedecor flower pot, etc. This doesn't affect wall-climbing poison +ivy, since it uses a different growth pattern. + +All plants use multiple controls provided by biome_lib, to keep where they +grow under control - no more random spread of plants! In addition, the density +of the plants in any region they appear in has been fixed and brought under +control. + +Poison ivy is found sparsely among junglegrass, but will not grow near flowers. + +------------------------------------------------------------------------------ + +Important details: + +Configuration: Any of the three components of this mod can be disabled +by just removing their respective directories. + +Dependencies: Just the game's default stuff. + +Recommends: Nothing in particular. + +Conflicts: This mod should not be installed alongside the original, separate +Poison Ivy, or old Bushes mods. If those exist, delete them, as this mod +supplies their functionality. If you still use the old Jungle Grass mod +either as previously supplied with this modpack, or in its standalone form, +you'll want to delete the "junglegrass" directory from this modpack to get rid +of the aliases-to-air that it supplies. + +Software Requirements: This mod requires Minetest 0.4.11 or later. It is +unlikely to work with old versions. + +------------------------------------------------------------------------------ + +Crafting: + +For crafting recipes, please see the forum thread for this modpack: + +https://forum.minetest.net/viewtopic.php?f=11&t=3898 + +------------------------------------------------------------------------------ + +Notes: + +Poison Ivy will spawn on grass and in some cases, on vertical surfaces +including trees and jungle trees where they meet the dirt or grass. Ivy +previously spawned on the ground taller/thicker or start climbing up said +vertical surfaces and trees. + +At present, the poison ivy presents little more than an annoyance - they can +only be cut down and either re-planted or thrown away. No damage is done by +harvesting them, yet. ;-) diff --git a/mods/plantlife_modpack/bushes/init.lua b/mods/plantlife_modpack/bushes/init.lua new file mode 100644 index 0000000..9b5c553 --- /dev/null +++ b/mods/plantlife_modpack/bushes/init.lua @@ -0,0 +1,317 @@ +-- Bushes Mod by Mossmanikin, Evergreen, & Neuromancer +-- The initial code for this was taken from Mossmanikin's Grasses Mod, +-- then heavilly modified by Neuromancer for this mod. +-- Mossmanikin also greatly helped with providing samples for coding. +-- bush leaf textures are from VannessaE's moretrees mod. +-- (Leaf texture created by RealBadAngel or VanessaE) +-- Branch textures created by Neuromancer. + +-- support for i18n +local S = minetest.get_translator("bushes") + +local bush_rarity = minetest.settings:get("bushes.bush_rarity") or 0.008 +local youngtree_rarity = minetest.settings:get("youngtree.bush_rarity") or 0.006 + +minetest.register_node("bushes:youngtree2_bottom", { + description = S("Young Tree 2 (bottom)"), + drawtype="nodebox", + tiles = {"bushes_youngtree2trunk.png"}, + inventory_image = "bushes_youngtree2trunk_inv.png", + wield_image = "bushes_youngtree2trunk_inv.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + node_box = { + type = "fixed", + fixed = { + {-0.0612,-0.500000,-0.500000,0.0612,0.500000,-0.375000}, --NodeBox 1 + } + }, + groups = {snappy=3,flammable=2,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + drop = 'default:stick' +}) + +local BushBranchCenter = { {1,1}, {3,2} } +for i in pairs(BushBranchCenter) do + local Num = BushBranchCenter[i][1] + local TexNum = BushBranchCenter[i][2] + minetest.register_node("bushes:bushbranches"..Num, { + description = S("Bush Branches @1", Num), + drawtype = "nodebox", + tiles = { + "bushes_leaves_"..TexNum..".png", + "bushes_branches_center_"..TexNum..".png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {0, -1/2, -1/2, -1/4, 1/2, 1/2}, + {0, -1/2, -1/2, 1/4, 1/2, 1/2} + }, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, + }, + inventory_image = "bushes_branches_center_"..TexNum..".png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = { + -- tree=1, -- MM: disabled because some recipes use group:tree for trunks + snappy=3, + flammable=2, + leaves=1, + attached_node=1 + }, + sounds = default.node_sound_leaves_defaults(), + drop = 'default:stick 4' + }) +end + +local BushBranchSide = { {2,1}, {4,2} } +for i in pairs(BushBranchSide) do + local Num = BushBranchSide[i][1] + local TexNum = BushBranchSide[i][2] + minetest.register_node("bushes:bushbranches"..Num, { + description = S("Bush Branches @1", Num), + drawtype = "nodebox", + tiles = { +--[[top]] "bushes_leaves_"..TexNum..".png", +--[[bottom]]"bushes_branches_center_"..TexNum..".png", +--[[right]] "bushes_branches_left_"..TexNum..".png", +--[[left]] "bushes_branches_right_"..TexNum..".png", -- MM: We could also mirror the previous here, +--[[back]] "bushes_branches_center_"..TexNum..".png",-- unless U really want 'em 2 B different +--[[front]] "bushes_branches_right_"..TexNum..".png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { +-- { left , bottom , front, right , top , back } + {0.137748,-0.491944, 0.5 ,-0.125000,-0.179444,-0.007790}, --NodeBox 1 + {0.262748,-0.185995, 0.5 ,-0.237252, 0.126505,-0.260269}, --NodeBox 2 + {0.500000, 0.125000, 0.5 ,-0.500000, 0.500000,-0.500000}, --NodeBox 3 + }, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, + }, + inventory_image = "bushes_branches_right_"..TexNum..".png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = { + -- tree=1, -- MM: disabled because some recipes use group:tree for trunks + snappy=3, + flammable=2, + leaves=1, + attached_node=1 + }, + sounds = default.node_sound_leaves_defaults(), + drop = 'default:stick 3' + }) +end + +local BushLeafNode = { {1}, {2}} +for i in pairs(BushLeafNode) do + local Num = BushLeafNode[i][1] + minetest.register_node("bushes:BushLeaves"..Num, { + description = S("Bush Leaves @1", Num), + drawtype = "allfaces_optional", + tiles = {"bushes_leaves_"..Num..".png"}, + use_texture_alpha = "clip", + paramtype = "light", + groups = { -- MM: Should we add leafdecay? + snappy=3, + flammable=2, + attached_node=1, + leaves=1 + }, + sounds = default.node_sound_leaves_defaults(), + }) +end + +local function grow_bush_node(pos, dir, leaf_type) + local right_here = {x=pos.x, y=pos.y+1, z=pos.z} + local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z} + + local bush_branch_type = 2 + + if dir ~= 5 and leaf_type == 1 then + bush_branch_type = 2 + end + if dir ~= 5 and leaf_type == 2 then + bush_branch_type = 4 + end + if dir == 5 and leaf_type == 1 then + bush_branch_type = 1 + dir = 1 + end + if dir == 5 and leaf_type == 2 then + bush_branch_type = 3 + dir = 1 + end + + local nodename = minetest.get_node(right_here).name + if nodename == "air" or nodename == "default:junglegrass" then -- instead of check_air = true, + minetest.swap_node(right_here, {name="bushes:bushbranches"..bush_branch_type , param2=dir}) + minetest.swap_node(above_right_here, {name="bushes:BushLeaves"..leaf_type}) + + local chance_of_high_leaves = math.random(1,10) + if chance_of_high_leaves > 5 then + local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z} + minetest.swap_node(two_above_right_here, {name="bushes:BushLeaves"..leaf_type}) + end + end +end + +local function grow_bush(pos) + -- replace possible grass nodes + minetest.swap_node({x=pos.x, y=pos.y+1, z=pos.z}, {name="air"}) + + local leaf_type = math.random(1,2) + local bush_side_height = math.random(0,1) + + local chance_of_bush_node_right = math.random(1,10) + if chance_of_bush_node_right > 5 then + local right_pos = {x=pos.x+1, y=pos.y+bush_side_height, z=pos.z} + grow_bush_node(right_pos,3,leaf_type) + end + + local chance_of_bush_node_left = math.random(1,10) + if chance_of_bush_node_left > 5 then + local left_pos = {x=pos.x-1, y=pos.y+bush_side_height, z=pos.z} + grow_bush_node(left_pos,1,leaf_type) + end + + local chance_of_bush_node_front = math.random(1,10) + if chance_of_bush_node_front > 5 then + local front_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z+1} + grow_bush_node(front_pos,2,leaf_type) + end + + local chance_of_bush_node_back = math.random(1,10) + if chance_of_bush_node_back > 5 then + local back_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z-1} + grow_bush_node(back_pos,0,leaf_type) + end + + grow_bush_node(pos,5,leaf_type) +end + +minetest.register_decoration({ + name = "bushes:bush", + decoration = { + "air" + }, + fill_ratio = bush_rarity, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", +}) + +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +local did +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("bushes:bush") + minetest.set_gen_notify("decoration", {did}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations = g["decoration#" .. did] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_bush(pos) + end +end) + +local function grow_youngtree_node2(pos, height) + local right_here = {x=pos.x, y=pos.y+1, z=pos.z} + local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z} + local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z} + local three_above_right_here = {x=pos.x, y=pos.y+4, z=pos.z} + + local nodename = minetest.get_node(right_here).name + if nodename == "air" or nodename == "default:junglegrass" then -- instead of check_air = true, + if height == 4 then + local two_above_right_here_south = {x=pos.x, y=pos.y+3, z=pos.z-1} + local three_above_right_here_south = {x=pos.x, y=pos.y+4, z=pos.z-1} + + minetest.swap_node(right_here, {name="bushes:youngtree2_bottom"}) + minetest.swap_node(above_right_here, {name="bushes:youngtree2_bottom"}) + minetest.swap_node(two_above_right_here, {name="bushes:bushbranches2" , param2=2}) + minetest.swap_node(two_above_right_here_south, {name="bushes:bushbranches2" , param2=0}) + minetest.swap_node(three_above_right_here, {name="bushes:BushLeaves1" }) + minetest.swap_node(three_above_right_here_south, {name="bushes:BushLeaves1" }) + end + end +end + +local function grow_youngtree2(pos) + local height = math.random(4,5) + grow_youngtree_node2(pos,height) +end + +minetest.register_decoration({ + name = "bushes:youngtree", + decoration = { + "air" + }, + fill_ratio = youngtree_rarity, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", +}) + +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +local did2 +minetest.register_on_mods_loaded(function() + did2 = minetest.get_decoration_id("bushes:youngtree") + minetest.set_gen_notify("decoration", {did2}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations = g["decoration#" .. did2] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_youngtree2(pos) + end +end) \ No newline at end of file diff --git a/mods/plantlife_modpack/bushes/locale/bushes.de.tr b/mods/plantlife_modpack/bushes/locale/bushes.de.tr new file mode 100644 index 0000000..af63ead --- /dev/null +++ b/mods/plantlife_modpack/bushes/locale/bushes.de.tr @@ -0,0 +1,4 @@ +# textdomain: bushes +Young Tree 2 (bottom)=Strauch 2 (Ansatz) +Bush Branches @1=Buschäste @1 +Bush Leaves @1=Buschblätter @1 diff --git a/mods/plantlife_modpack/bushes/locale/bushes.eo.tr b/mods/plantlife_modpack/bushes/locale/bushes.eo.tr new file mode 100644 index 0000000..95ef7ab --- /dev/null +++ b/mods/plantlife_modpack/bushes/locale/bushes.eo.tr @@ -0,0 +1,4 @@ +# textdomain: bushes +Young Tree 2 (bottom)=Juna Arbo 2 (malsupro) +Bush Branches @1=Arbustaj Branĉoj @1 +Bush Leaves @1=Arbustaj Folioj @1 diff --git a/mods/plantlife_modpack/bushes/locale/bushes.fr.tr b/mods/plantlife_modpack/bushes/locale/bushes.fr.tr new file mode 100644 index 0000000..6289a52 --- /dev/null +++ b/mods/plantlife_modpack/bushes/locale/bushes.fr.tr @@ -0,0 +1,4 @@ +# textdomain: bushes +Young Tree 2 (bottom)=Arbuste 2 (bas) +Bush Branches @1=Branches de buisson @1 +Bush Leaves @1=Feuilles de buisson @1 diff --git a/mods/plantlife_modpack/bushes/locale/template.txt b/mods/plantlife_modpack/bushes/locale/template.txt new file mode 100644 index 0000000..412fb60 --- /dev/null +++ b/mods/plantlife_modpack/bushes/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: bushes +Young Tree 2 (bottom)= +Bush Branches @1= +Bush Leaves @1= diff --git a/mods/plantlife_modpack/bushes/mod.conf b/mods/plantlife_modpack/bushes/mod.conf new file mode 100644 index 0000000..5ebb64d --- /dev/null +++ b/mods/plantlife_modpack/bushes/mod.conf @@ -0,0 +1,4 @@ +name = bushes +title = Bushes +depends = default +optional_depends = stoneage, sumpf, ebiomes diff --git a/mods/plantlife_modpack/bushes/settingtypes.txt b/mods/plantlife_modpack/bushes/settingtypes.txt new file mode 100644 index 0000000..34b2cb0 --- /dev/null +++ b/mods/plantlife_modpack/bushes/settingtypes.txt @@ -0,0 +1,5 @@ +# Bush rarity (higher number -> higher probability) +bushes.bush_rarity (Bush rarity) float 0.008 0.0001 1 + +# Youngtree rarity (higher number -> higher probability) +bushes.youngtree_rarity (Youngtree rarity) float 0.006 0.0001 1 diff --git a/mods/plantlife_modpack/bushes/textures/bushes_branches_center_1.png b/mods/plantlife_modpack/bushes/textures/bushes_branches_center_1.png new file mode 100644 index 0000000..bac3ee4 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_branches_center_1.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_branches_center_2.png b/mods/plantlife_modpack/bushes/textures/bushes_branches_center_2.png new file mode 100644 index 0000000..c21edf6 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_branches_center_2.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_branches_left_1.png b/mods/plantlife_modpack/bushes/textures/bushes_branches_left_1.png new file mode 100644 index 0000000..120f100 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_branches_left_1.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_branches_left_2.png b/mods/plantlife_modpack/bushes/textures/bushes_branches_left_2.png new file mode 100644 index 0000000..1c17bac Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_branches_left_2.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_branches_right_1.png b/mods/plantlife_modpack/bushes/textures/bushes_branches_right_1.png new file mode 100644 index 0000000..af5de67 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_branches_right_1.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_branches_right_2.png b/mods/plantlife_modpack/bushes/textures/bushes_branches_right_2.png new file mode 100644 index 0000000..8fb8332 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_branches_right_2.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_leaves_1.png b/mods/plantlife_modpack/bushes/textures/bushes_leaves_1.png new file mode 100644 index 0000000..594c958 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_leaves_1.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_leaves_2.png b/mods/plantlife_modpack/bushes/textures/bushes_leaves_2.png new file mode 100644 index 0000000..e6de482 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_leaves_2.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk.png b/mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk.png new file mode 100644 index 0000000..ea685e3 Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk.png differ diff --git a/mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk_inv.png b/mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk_inv.png new file mode 100644 index 0000000..7d6728f Binary files /dev/null and b/mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk_inv.png differ diff --git a/mods/plantlife_modpack/bushes_classic/cooking.lua b/mods/plantlife_modpack/bushes_classic/cooking.lua new file mode 100644 index 0000000..80d264d --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/cooking.lua @@ -0,0 +1,126 @@ +-- support for i18n +local S = minetest.get_translator("bushes_classic") + +-- Basket + +minetest.register_craft({ + output = "bushes:basket_empty", + recipe = { + { "default:stick", "default:stick", "default:stick" }, + { "", "default:stick", "" }, + }, +}) + +-- Sugar + +if not minetest.registered_items["farming:sugar"] then + minetest.register_craftitem(":bushes:sugar", { + description = S("Sugar"), + inventory_image = "bushes_sugar.png", + on_use = minetest.item_eat(1), + groups = {food_sugar=1, flammable = 2} + }) + + minetest.register_craft({ + output = "bushes:sugar 1", + recipe = { + { "default:papyrus", "default:papyrus" }, + }, + }) +else + minetest.register_alias("bushes:sugar", "farming:sugar") +end + +-- override farming_plus strawberry and add food_ group +if minetest.get_modpath("farming_plus") then + local groups = table.copy(minetest.registered_items["farming_plus:strawberry_item"].groups) + groups["food_strawberry"] = 1 + groups["food_berry"] = 1 + + minetest.override_item("farming_plus:strawberry_item", { + groups = groups, + }) +end + + +for i, berry in ipairs(bushes_classic.bushes) do + + local groups = {food_berry = 1, flammable = 2} + + if berry ~= "mixed_berry" then + + groups["food_" .. berry] = 1 + + -- Berry + minetest.register_craftitem(":bushes:"..berry, { + description = bushes_classic.bushes_descriptions[i][1], + inventory_image = "bushes_"..berry..".png", + groups = groups, + on_use = minetest.item_eat(1), + }) + end + + -- Raw pie + minetest.register_craftitem(":bushes:"..berry.."_pie_raw", { + description = bushes_classic.bushes_descriptions[i][2], + inventory_image = "bushes_"..berry.."_pie_raw.png", + on_use = minetest.item_eat(4), + }) + + if berry ~= "mixed_berry" then + + minetest.register_craft({ + output = "bushes:"..berry.."_pie_raw 1", + recipe = { + { "group:food_sugar", "farming:flour", "group:food_sugar" }, + { "group:food_"..berry, "group:food_"..berry, "group:food_"..berry }, + }, + }) + else + minetest.register_craft({ + output = "bushes:mixed_berry_pie_raw 2", + recipe = { + { "group:food_sugar", "farming:flour", "group:food_sugar" }, + { "group:food_berry", "group:food_berry", "group:food_berry" }, + { "group:food_berry", "group:food_berry", "group:food_berry" }, + }, + }) + end + + -- Cooked pie + minetest.register_craftitem(":bushes:"..berry.."_pie_cooked", { + description = bushes_classic.bushes_descriptions[i][3], + inventory_image = "bushes_"..berry.."_pie_cooked.png", + on_use = minetest.item_eat(6), + }) + + minetest.register_craft({ + type = "cooking", + output = "bushes:"..berry.."_pie_cooked", + recipe = "bushes:"..berry.."_pie_raw", + cooktime = 30, + }) + + -- Slice of pie + minetest.register_craftitem(":bushes:"..berry.."_pie_slice", { + description = bushes_classic.bushes_descriptions[i][4], + inventory_image = "bushes_"..berry.."_pie_slice.png", + on_use = minetest.item_eat(1), + }) + + minetest.register_craft({ + output = "bushes:"..berry.."_pie_slice 6", + recipe = { + { "bushes:"..berry.."_pie_cooked" }, + }, + }) + + -- Basket with pies + minetest.register_craft({ + output = "bushes:basket_"..berry.." 1", + recipe = { + { "bushes:"..berry.."_pie_cooked", "bushes:"..berry.."_pie_cooked", "bushes:"..berry.."_pie_cooked" }, + { "", "bushes:basket_empty", "" }, + }, + }) +end diff --git a/mods/plantlife_modpack/bushes_classic/image_credits.txt b/mods/plantlife_modpack/bushes_classic/image_credits.txt new file mode 100644 index 0000000..a4ddc51 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/image_credits.txt @@ -0,0 +1,5 @@ +strawberry: http://www.clker.com/clipart-4060.html +blueberry: http://www.clker.com/clipart-cerezafiro12.html +blackberry: http://www.clker.com/clipart-blackberry-2.html +raspberry: http://www.clker.com/clipart-simple-raspberry.html +gooseberry: http://www.clker.com/clipart-26281.html diff --git a/mods/plantlife_modpack/bushes_classic/init.lua b/mods/plantlife_modpack/bushes_classic/init.lua new file mode 100644 index 0000000..2918a5d --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/init.lua @@ -0,0 +1,80 @@ +-- Bushes classic mod originally by unknown +-- now maintained by VanessaE + +bushes_classic = {} + +-- support for i18n +local S = minetest.get_translator("bushes_classic") + +bushes_classic.bushes = { + "strawberry", + "blackberry", + "blueberry", + "raspberry", + "gooseberry", + "mixed_berry" +} + +bushes_classic.bushes_descriptions = { + {S("Strawberry"), S("Raw Strawberry pie"), S("Cooked Strawberry pie"), S("Slice of Strawberry pie"), S("Basket with Strawberry pies"), S("Strawberry Bush")}, + {S("Blackberry"), S("Raw Blackberry pie"), S("Cooked Blackberry pie"), S("Slice of Blackberry pie"), S("Basket with Blackberry pies"), S("Blackberry Bush")}, + {S("Blueberry"), S("Raw Blueberry pie"), S("Cooked Blueberry pie"), S("Slice of Blueberry pie"), S("Basket with Blueberry pies"), S("Blueberry Bush")}, + {S("Raspberry"), S("Raw Raspberry pie"), S("Cooked Raspberry pie"), S("Slice of Raspberry pie"), S("Basket with Raspberry pies"), S("Raspberry Bush")}, + {S("Gooseberry"), S("Raw Gooseberry pie"), S("Cooked Gooseberry pie"), S("Slice of Gooseberry pie"), S("Basket with Gooseberry pies"), S("Gooseberry Bush")}, + {S("Mixed Berry"), S("Raw Mixed Berry pie"), S("Cooked Mixed Berry pie"), S("Slice of Mixed Berry pie"), S("Basket with Mixed Berry pies"), S("Currently fruitless Bush")} +} + +bushes_classic.spawn_list = {} + +local modpath = minetest.get_modpath('bushes_classic') +dofile(modpath..'/cooking.lua') +dofile(modpath..'/nodes.lua') + +local spawn_plants = bushes_classic.spawn_list + +local function get_biome_data(pos, perlin_fertile) + local fertility = perlin_fertile:get_2d({x=pos.x, y=pos.z}) + + local data = minetest.get_biome_data(pos) + -- Original values this method returned were +1 (lowest) to -1 (highest) + -- so we need to convert the 0-100 range from get_biome_data() to that. + return fertility, 1 - (data.heat / 100 * 2), 1 - (data.humidity / 100 * 2) +end + +minetest.register_abm({ + nodenames = { + "default:dirt_with_grass", + "woodsoils:dirt_with_leaves_1", + "woodsoils:grass_with_leaves_1", + "woodsoils:grass_with_leaves_2", + "farming:soil", + "farming:soil_wet" + }, + interval = 3600, + chance = 100, + label = "[bushes_classic] spawn bushes", + min_y = -16, + max_y = 48, + action = function(pos, node) + local p_top = {x = pos.x, y = pos.y + 1, z = pos.z} + local n_top = minetest.get_node_or_nil(p_top) + if not n_top or n_top.name ~= "air" then return end + + local perlin_fertile_area = minetest.get_perlin(545342534, 3, 0.6, 100) + + local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area) + + local pos_biome_ok = fertility > -0.1 and temperature <= 0.15 and temperature >= -0.15 and humidity <= 0 and humidity >= -1 + if not pos_biome_ok then return end + + if minetest.find_node_near(p_top, 10 + math.random(-1.5,2), {"group:bush"}) then + return -- Nodes to avoid are nearby + end + + local plant_to_spawn = spawn_plants[math.random(1, #spawn_plants)] + + minetest.swap_node(p_top, {name = plant_to_spawn, param2 = 0}) + end +}) + +minetest.register_alias("bushes:basket_pies", "bushes:basket_strawberry") diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr new file mode 100644 index 0000000..727b0b2 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.de.tr @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar=Zucker +Strawberry=Erdbeere +Raw Strawberry pie=Rohe Erdbeertorte +Cooked Strawberry pie=Erdbeertorte +Slice of Strawberry pie=Erdbeertortenstück +Basket with Strawberry pies=Korb mit Erdbeertorten +Strawberry Bush=Erdbeerbusch +Blackberry=Brombeere +Raw Blackberry pie=Rohe Brombeertorte +Cooked Blackberry pie=Brombeertorte +Slice of Blackberry pie=Brombeertortenstück +Basket with Blackberry pies=Korb mit Brombeertorten +Blackberry Bush=Brombeerbusch +Blueberry=Blaubeere +Raw Blueberry pie=Rohe Blaubeertorte +Cooked Blueberry pie=Blaubeertorte +Slice of Blueberry pie=Blaubeertortenstück +Basket with Blueberry pies=Korb mit Blaubeertorten +Blueberry Bush=Blaubeerbusch +Raspberry=Himbeere +Raw Raspberry pie=Rohe Himbeertorte +Cooked Raspberry pie=Himbeertorte +Slice of Raspberry pie=Himbeertortenstück +Basket with Raspberry pies=Korb mit Himbeertorten +Raspberry Bush=Himbeerbusch +Gooseberry=Stachelbeere +Raw Gooseberry pie=Rohe Stachelbeertorte +Cooked Gooseberry pie=Stachelbeertorte +Slice of Gooseberry pie=Stachelbeertortenstück +Basket with Gooseberry pies=Korb mit Stachelbeertorten +Gooseberry Bush=Stachelbeerbusch +Mixed Berry=Beerenmix +Raw Mixed Berry pie=Rohe Beerenmixtorte +Cooked Mixed Berry pie=Beerenmixtorte +Slice of Mixed Berry pie=Beerenmixtortenstück +Basket with Mixed Berry pies=Korb mit Beerenmixtorten +Currently fruitless Bush=Zur Zeit früchteloser Busch +Basket=Korb diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr new file mode 100644 index 0000000..194cc17 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar=Sukero +Strawberry=Frago +Raw Strawberry pie=Kruda Fragokuko +Cooked Strawberry pie=Kuirita Fragokuko +Slice of Strawberry pie=Tranĉaĵo de Fragokuko +Basket with Strawberry pies=Korbo kun Fragokukoj +Strawberry Bush=Fraga Arbusto +Blackberry=Rubuso +Raw Blackberry pie=Kruda Rubusokuko +Cooked Blackberry pie=Kuirita Rubusokuko +Slice of Blackberry pie=Tranĉaĵo de Rubusokuko +Basket with Blackberry pies=Korbo kun Rubusokukoj +Blackberry Bush=Rubusa Arbusto +Blueberry=Mirtelo +Raw Blueberry pie=Kruda Mirtelokuko +Cooked Blueberry pie=Kuirita Mirtelokuko +Slice of Blueberry pie=Tranĉaĵo de Mirtelokuko +Basket with Blueberry pies=Korbo kun Mirtelokukoj +Blueberry Bush=Mirtela Arbusto +Raspberry=Frambo +Raw Raspberry pie=Kruda Frambokuko +Cooked Raspberry pie=Kuirita Frambokuko +Slice of Raspberry pie=Tranĉaĵo de Frambokuko +Basket with Raspberry pies=Korbo kun Frambokukoj +Raspberry Bush=Framba Arbusto +Gooseberry=Grosbero +Raw Gooseberry pie=Kruda Grosberkuko +Cooked Gooseberry pie=Kuirita Grosberkuko +Slice of Gooseberry pie=Tranĉaĵo de Grosberkuko +Basket with Gooseberry pies=Korbo kun Grosberkuko +Gooseberry Bush=Grosberarbusto +Mixed Berry=Miksita Bero +Raw Mixed Berry pie=Kruda Miksita Bera Kuko +Cooked Mixed Berry pie=Kuirita Miksa Beraj Kukoj +Slice of Mixed Berry pie=Tranĉaĵo de Miksita Bera Kuko +Basket with Mixed Berry pies=Korbo kun Miksitaj Beraj Kukoj +Currently fruitless Bush=Nuntempe senfrukta Arbusto +Basket=Korbo diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr new file mode 100644 index 0000000..2a900bc --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.es.tr @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar=Azúcar +Strawberry=Frutilla +Raw Strawberry pie=Pastel de Frutilla Crudo +Cooked Strawberry pie=Pastel de Frutilla Cocido +Slice of Strawberry pie=Rebanada de Pastel de Frutilla +Basket with Strawberry pies=Cesta con Pasteles de Frutilla +Strawberry Bush=Arbusto de Frutilla +Blackberry=Mora +Raw Blackberry pie=Pastel de Mora Crudo +Cooked Blackberry pie=Pastel de Mora Cocido +Slice of Blackberry pie=Rebanada de Pastel de Mora +Basket with Blackberry pies=Cesta con Pasteles de Mora +Blackberry Bush=Arbusto de Mora +Blueberry=Arándano +Raw Blueberry pie=Pastel de Arándano Crudo +Cooked Blueberry pie=Pastel de Arándano Cocido +Slice of Blueberry pie=Rebanada de Pastel de Arándano +Basket with Blueberry pies=Cesta con Pasteles de Arándano +Blueberry Bush=Arbusto de Arándano +Raspberry=Frambuesa +Raw Raspberry pie=Pastel de Frambuesa Crudo +Cooked Raspberry pie=Pastel de Frambuesa Cocido +Slice of Raspberry pie=Rebanada de Pastel de Frambuesa +Basket with Raspberry pies=Cesta con Pasteles de Frambuesa +Raspberry Bush=Arbusto de Frambuesa +Gooseberry=Grosella +Raw Gooseberry pie=Pastel de Grosella Crudo +Cooked Gooseberry pie=Pastel de Grosella Cocido +Slice of Gooseberry pie=Rebanada de Pastel de Grosella +Basket with Gooseberry pies=Cesta con Pasteles de Grosella +Gooseberry Bush=Arbusto de Grosella +Mixed Berry=Mezcla de Baya +Raw Mixed Berry pie=Pastel de Mezcla de Bayas Cruda +Cooked Mixed Berry pie=Pastel de Mezcla de Bayas Cocido +Slice of Mixed Berry pie=Rebanada de Pastel de Mezcla de Bayas +Basket with Mixed Berry pies=Cesta con Pasteles de Mezcla de Baya +Currently fruitless Bush=Arbusto actualmente infructuoso +Basket=Cesta diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr new file mode 100644 index 0000000..b64e3b6 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.fr.tr @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar=Sucre +Strawberry=Fraises +Raw Strawberry pie=Tarte aux fraises (crue) +Cooked Strawberry pie=Tarte aux fraises (cuite) +Slice of Strawberry pie=Part de tarte aux fraises +Basket with Strawberry pies=Panier de tartes aux fraises +Strawberry Bush=Buisson de fraises +Blackberry=Mûres +Raw Blackberry pie=Tarte aux mûres (crue) +Cooked Blackberry pie=Tarte aux mûres (cuite) +Slice of Blackberry pie=Part de tarte aux mûres +Basket with Blackberry pies=Panier de tartes aux fraises +Blackberry Bush=Buisson de mûres +Blueberry=Myrtilles +Raw Blueberry pie=Tarte aux myrtilles (crue) +Cooked Blueberry pie=Tarte aux myrtilles (cuite) +Slice of Blueberry pie=Part de tarte aux myrtilles +Basket with Blueberry pies=Panier de tartes aux mûres +Blueberry Bush=Buisson de myrtilles +Raspberry=Framboises +Raw Raspberry pie=Tarte aux framboises (crue) +Cooked Raspberry pie=Tarte aux framboises (cuite) +Slice of Raspberry pie=Part de tarts aux framboises +Basket with Raspberry pies=Panier de tartes aux framboises +Raspberry Bush=Buisson de framboises +Gooseberry=Groseilles +Raw Gooseberry pie=Tarte aux groseilles (crue) +Cooked Gooseberry pie=Tarte aux groseilles (cuite) +Slice of Gooseberry pie=Part de tarte aux groseilles +Basket with Gooseberry pies=Panier de tartes aux groseilles +Gooseberry Bush=Buisson de groseilles +Mixed Berry=Fruits rouges +Raw Mixed Berry pie=Tarte aux fruits rouges (crue) +Cooked Mixed Berry pie=Tarte aux fruits rouges (cuite) +Slice of Mixed Berry pie=Part de tarte aux fruits rouges +Basket with Mixed Berry pies=Panier de tartes aux fruits rouges +Currently fruitless Bush=Buisson sans fruits pour l'instant +Basket=Panier diff --git a/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr new file mode 100644 index 0000000..c88b716 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/bushes_classic.tr.tr @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar=Şeker +Strawberry=Çilek +Raw Strawberry pie=Çilekli çiğ pasta +Cooked Strawberry pie=Pişmiş çilekli pasta +Slice of Strawberry pie=Çilekli pasta dilimi +Basket with Strawberry pies=Çilekli pasta sepeti +Strawberry Bush=Çilek fidanı +Blackberry=Böğürtlen +Raw Blackberry pie=Böğürtlenli çiğ pasta +Cooked Blackberry pie=Pişmiş böğürtlenli pasta +Slice of Blackberry pie=Böğürtlenli pasta dilimi +Basket with Blackberry pies=Böğürtlenli pasta sepeti +Blackberry Bush=Böğürtlen fidanı +Blueberry=Yaban mersini +Raw Blueberry pie=Yaban mersinli çiğ pasta +Cooked Blueberry pie=Pişmiş yaban mersinli pasta +Slice of Blueberry pie=Yaban mersinli pasta dilimi +Basket with Blueberry pies=Yaban mersini pastalı sepet +Blueberry Bush=Yaban mersini fidanı +Raspberry=Ahududu +Raw Raspberry pie=Ahududulu çiğ pasta +Cooked Raspberry pie=Pişmiş ahududulu pasta +Slice of Raspberry pie=Ahududulu pasta dilimi +Basket with Raspberry pies=Ahududulu pasta sepeti +Raspberry Bush=Ahududu fidanı +Gooseberry=Bektaşi üzümü +Raw Gooseberry pie=Bektaşi üzümlü çiğ pasta +Cooked Gooseberry pie=Pişmiş bektaşi üzümlü pasta +Slice of Gooseberry pie=Bektaşi üzümlü pasta dilimi +Basket with Gooseberry pies=Bektaşi üzümlü pasta sepeti +Gooseberry Bush=Bektaşi üzümü fidanı +Mixed Berry=Dut +Raw Mixed Berry pie=Dutlu çiğ pasta +Cooked Mixed Berry pie=Pişmiş dutlu pasta +Slice of Mixed Berry pie=Dutlu pasta dilimi +Basket with Mixed Berry pies=Dutlu pasta sepeti +Currently fruitless Bush=Fidanı şu anda meyvesiz +Basket=Sepet diff --git a/mods/plantlife_modpack/bushes_classic/locale/template.txt b/mods/plantlife_modpack/bushes_classic/locale/template.txt new file mode 100644 index 0000000..69fc2a1 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/locale/template.txt @@ -0,0 +1,39 @@ +# textdomain: bushes_classic +Sugar= +Strawberry= +Raw Strawberry pie= +Cooked Strawberry pie= +Slice of Strawberry pie= +Basket with Strawberry pies= +Strawberry Bush= +Blackberry= +Raw Blackberry pie= +Cooked Blackberry pie= +Slice of Blackberry pie= +Basket with Blackberry pies= +Blackberry Bush= +Blueberry= +Raw Blueberry pie= +Cooked Blueberry pie= +Slice of Blueberry pie= +Basket with Blueberry pies= +Blueberry Bush= +Raspberry= +Raw Raspberry pie= +Cooked Raspberry pie= +Slice of Raspberry pie= +Basket with Raspberry pies= +Raspberry Bush= +Gooseberry= +Raw Gooseberry pie= +Cooked Gooseberry pie= +Slice of Gooseberry pie= +Basket with Gooseberry pies= +Gooseberry Bush= +Mixed Berry= +Raw Mixed Berry pie= +Cooked Mixed Berry pie= +Slice of Mixed Berry pie= +Basket with Mixed Berry pies= +Currently fruitless Bush= +Basket= diff --git a/mods/plantlife_modpack/bushes_classic/mod.conf b/mods/plantlife_modpack/bushes_classic/mod.conf new file mode 100644 index 0000000..2a74a26 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/mod.conf @@ -0,0 +1,2 @@ +name = bushes_classic +optional_depends = farming, farming_plus diff --git a/mods/plantlife_modpack/bushes_classic/models/bushes_basket_empty.obj b/mods/plantlife_modpack/bushes_classic/models/bushes_basket_empty.obj new file mode 100644 index 0000000..0179c31 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/models/bushes_basket_empty.obj @@ -0,0 +1,46 @@ +# Blender v2.73 (sub 0) OBJ File: 'basket-of-pies.blend' +# www.blender.org +o basket_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 -0.437500 +v 0.437500 0.500000 -0.437500 +v 0.437500 0.500000 0.437500 +v -0.437500 -0.437500 0.437500 +v -0.437500 -0.437500 -0.437500 +v 0.437500 -0.437500 -0.437500 +v 0.437500 -0.437500 0.437500 +vt 0.484848 0.984848 +vt 0.015152 0.984848 +vt 0.015152 0.515152 +vt 0.484848 0.515152 +vt 0.515152 0.984848 +vt 0.515152 0.515152 +vt 0.984848 0.515152 +vt 0.984848 0.984848 +vt 0.954545 0.545455 +vt 0.545455 0.545455 +vt 0.954545 0.954545 +vt 0.545455 0.954545 +s off +f 5/1 6/2 2/3 1/4 +f 6/1 7/2 3/3 2/4 +f 7/1 8/2 4/3 3/4 +f 8/1 5/2 1/3 4/4 +f 1/5 2/6 3/7 4/8 +f 5/6 8/7 12/9 9/10 +f 8/7 7/8 11/11 12/9 +f 7/8 6/5 10/12 11/11 +f 6/5 5/6 9/10 10/12 +f 9/1 12/2 16/3 13/4 +f 12/1 11/2 15/3 16/4 +f 11/1 10/2 14/3 15/4 +f 10/1 9/2 13/3 14/4 +f 13/10 16/9 15/11 14/12 diff --git a/mods/plantlife_modpack/bushes_classic/models/bushes_basket_full.obj b/mods/plantlife_modpack/bushes_classic/models/bushes_basket_full.obj new file mode 100644 index 0000000..5a3e1a8 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/models/bushes_basket_full.obj @@ -0,0 +1,330 @@ +# Blender v2.73 (sub 0) OBJ File: 'basket-of-pies.blend' +# www.blender.org +o pies_Cylinder +v -0.089468 -0.116804 -0.438000 +v -0.116691 -0.091480 -0.438000 +v 0.024696 0.005921 -0.404659 +v -0.002527 0.031245 -0.404659 +v 0.121480 0.109962 -0.309713 +v 0.094258 0.135286 -0.309713 +v 0.186149 0.179480 -0.167615 +v 0.158927 0.204804 -0.167615 +v 0.208858 0.203891 0.000000 +v 0.181635 0.229215 0.000000 +v 0.186149 0.179480 0.167615 +v 0.158927 0.204804 0.167615 +v 0.121480 0.109962 0.309713 +v 0.094258 0.135286 0.309713 +v 0.024696 0.005921 0.404659 +v -0.002527 0.031245 0.404659 +v -0.089468 -0.116804 0.438000 +v -0.116691 -0.091480 0.438000 +v -0.230856 -0.214204 0.404659 +v -0.327640 -0.318245 0.309713 +v -0.392309 -0.387763 0.167615 +v -0.415018 -0.412175 -0.000000 +v -0.392309 -0.387763 -0.167615 +v -0.327640 -0.318245 -0.309713 +v -0.230856 -0.214204 -0.404659 +v -0.135230 -0.074234 -0.383250 +v -0.035336 0.033150 -0.354077 +v 0.049350 0.124186 -0.270999 +v 0.105936 0.185014 -0.146663 +v 0.125806 0.206374 0.000000 +v 0.105936 0.185014 0.146663 +v 0.049350 0.124186 0.270999 +v -0.035336 0.033150 0.354077 +v -0.135230 -0.074234 0.383250 +v -0.235124 -0.181618 0.354077 +v -0.319810 -0.272654 0.270999 +v -0.376395 -0.333482 0.146663 +v -0.396266 -0.354842 -0.000000 +v -0.376395 -0.333482 -0.146664 +v -0.319810 -0.272654 -0.270999 +v -0.235124 -0.181618 -0.354077 +v 0.071215 -0.085999 -0.438000 +v 0.041377 -0.063816 -0.438000 +v 0.171221 0.048513 -0.404659 +v 0.141384 0.070697 -0.404659 +v 0.256002 0.162547 -0.309713 +v 0.226165 0.184731 -0.309713 +v 0.312652 0.238743 -0.167615 +v 0.282814 0.260926 -0.167615 +v 0.332544 0.265499 0.000000 +v 0.302707 0.287682 0.000000 +v 0.312652 0.238743 0.167615 +v 0.282814 0.260926 0.167615 +v 0.256002 0.162547 0.309713 +v 0.226165 0.184731 0.309713 +v 0.171221 0.048513 0.404659 +v 0.141383 0.070697 0.404659 +v 0.071215 -0.085999 0.438000 +v 0.041377 -0.063816 0.438000 +v -0.058629 -0.198328 0.404659 +v -0.058629 -0.198328 -0.404659 +v 0.021058 -0.048709 -0.383250 +v 0.108564 0.068989 -0.354077 +v 0.182747 0.168769 -0.270999 +v 0.232315 0.235440 -0.146663 +v 0.249721 0.258852 0.000000 +v 0.232315 0.235440 0.146663 +v 0.182747 0.168769 0.270999 +v 0.108564 0.068989 0.354077 +v 0.021058 -0.048709 0.383250 +v -0.066448 -0.166408 0.354077 +v -0.140632 -0.266188 0.270999 +v -0.190200 -0.332858 0.146663 +v -0.207605 -0.356270 -0.000000 +v -0.190199 -0.332858 -0.146664 +v -0.140631 -0.266188 -0.270999 +v -0.066448 -0.166408 -0.354077 +v 0.220377 -0.057101 -0.438000 +v 0.188086 -0.038671 -0.438000 +v 0.303465 0.088470 -0.404659 +v 0.271175 0.106901 -0.404659 +v 0.373905 0.211880 -0.309713 +v 0.341614 0.230311 -0.309713 +v 0.420971 0.294340 -0.167615 +v 0.388680 0.312771 -0.167615 +v 0.437498 0.323296 0.000000 +v 0.405208 0.341727 0.000000 +v 0.420971 0.294340 0.167615 +v 0.388680 0.312771 0.167615 +v 0.373905 0.211880 0.309713 +v 0.341614 0.230311 0.309713 +v 0.303465 0.088470 0.404659 +v 0.271175 0.106901 0.404659 +v 0.220377 -0.057101 0.438000 +v 0.188086 -0.038671 0.438000 +v 0.104997 -0.184242 0.404659 +v 0.104997 -0.184242 -0.404659 +v 0.166096 -0.026119 -0.383250 +v 0.238799 0.101256 -0.354077 +v 0.300433 0.209240 -0.270999 +v 0.341616 0.281392 -0.146663 +v 0.356078 0.306728 0.000000 +v 0.341616 0.281392 0.146664 +v 0.300433 0.209240 0.270999 +v 0.238799 0.101256 0.354077 +v 0.166096 -0.026119 0.383250 +v 0.093393 -0.153495 0.354077 +v 0.031759 -0.261478 0.270999 +v -0.009424 -0.333631 0.146663 +v -0.023885 -0.358967 -0.000000 +v -0.009424 -0.333631 -0.146664 +v 0.031759 -0.261478 -0.270999 +v 0.093394 -0.153495 -0.354077 +vt 0.000000 0.054054 +vt 0.000000 0.000000 +vt 0.062500 0.000000 +vt 0.062500 0.054054 +vt 0.125000 0.000000 +vt 0.125000 0.054054 +vt 0.187500 0.000000 +vt 0.187500 0.054054 +vt 0.250000 0.000000 +vt 0.250000 0.054054 +vt 0.312500 0.000000 +vt 0.312500 0.054054 +vt 0.375000 0.000000 +vt 0.375000 0.054054 +vt 0.437500 0.000000 +vt 0.437500 0.054054 +vt 0.500000 0.000000 +vt 0.500000 0.054054 +vt 0.055610 0.293778 +vt 0.110171 0.184656 +vt 0.123905 0.225763 +vt 0.076165 0.321244 +vt 0.316174 0.801264 +vt 0.253798 0.852938 +vt 0.186282 0.852938 +vt 0.123905 0.801264 +vt 0.076165 0.705782 +vt 0.050327 0.581029 +vt 0.050327 0.445997 +vt 0.186282 0.174088 +vt 0.253798 0.174089 +vt 0.316174 0.225763 +vt 0.363915 0.321245 +vt 0.389752 0.445997 +vt 0.389752 0.581029 +vt 0.363915 0.705782 +vt 0.384468 0.733249 +vt 0.329907 0.842371 +vt 0.055610 0.733249 +vt 0.026082 0.590674 +vt 0.384468 0.293778 +vt 0.413996 0.436353 +vt 0.258619 0.901428 +vt 0.181458 0.901428 +vt 0.181458 0.125599 +vt 0.258619 0.125599 +vt 0.026082 0.436353 +vt 0.413996 0.590674 +vt 0.110171 0.842371 +vt 0.329907 0.184656 +vt 0.076566 0.705251 +vt 0.050729 0.580498 +vt 0.050729 0.445466 +vt 0.076566 0.320713 +vt 0.124307 0.225232 +vt 0.186684 0.173557 +vt 0.254199 0.173557 +vt 0.316576 0.225232 +vt 0.364317 0.320713 +vt 0.390154 0.445466 +vt 0.390154 0.580498 +vt 0.364317 0.705251 +vt 0.316576 0.800732 +vt 0.254199 0.852407 +vt 0.186684 0.852407 +vt 0.124307 0.800732 +vt 0.110573 0.841838 +vt 0.056012 0.732716 +vt 0.330309 0.841838 +vt 0.259022 0.900894 +vt 0.026484 0.590141 +vt 0.026484 0.435819 +vt 0.414398 0.435819 +vt 0.414398 0.590141 +vt 0.181861 0.900894 +vt 0.384870 0.732716 +vt 0.384870 0.293245 +vt 0.389637 0.582094 +vt 0.363799 0.706847 +vt 0.316059 0.802329 +vt 0.253682 0.854003 +vt 0.186166 0.854003 +vt 0.123790 0.802329 +vt 0.076049 0.706847 +vt 0.050212 0.582094 +vt 0.050212 0.447062 +vt 0.076049 0.322309 +vt 0.123790 0.226828 +vt 0.186166 0.175153 +vt 0.253682 0.175153 +vt 0.316058 0.226828 +vt 0.363799 0.322310 +vt 0.389637 0.447062 +vt 0.413881 0.437419 +vt 0.413881 0.591741 +vt 0.258504 0.126666 +vt 0.329792 0.185722 +vt 0.384353 0.734315 +vt 0.329792 0.843437 +vt 0.055495 0.294844 +vt 0.110056 0.185722 +vt 0.384353 0.294844 +vt 0.181343 0.126666 +vt 0.025967 0.437419 +g pies_Cylinder_pie +s off +f 1/1 2/2 4/3 3/4 +f 3/4 4/3 6/5 5/6 +f 5/6 6/5 8/7 7/8 +f 7/8 8/7 10/9 9/10 +f 9/10 10/9 12/11 11/12 +f 11/12 12/11 14/13 13/14 +f 13/14 14/13 16/15 15/16 +f 15/16 16/15 18/17 17/18 +f 20/19 19/20 35/21 36/22 +f 27/23 26/24 41/25 40/26 39/27 38/28 37/29 36/22 35/21 34/30 33/31 32/32 31/33 30/34 29/35 28/36 +f 6/37 4/38 27/23 28/36 +f 23/39 22/40 38/28 39/27 +f 12/41 10/42 30/34 31/33 +f 2/43 25/44 41/25 26/24 +f 4/38 2/43 26/24 27/23 +f 18/45 16/46 33/31 34/30 +f 21/47 20/19 36/22 37/29 +f 8/48 6/37 28/36 29/35 +f 24/49 23/39 39/27 40/26 +f 14/50 12/41 31/33 32/32 +f 19/20 18/45 34/30 35/21 +f 22/40 21/47 37/29 38/28 +f 10/42 8/48 29/35 30/34 +f 25/44 24/49 40/26 41/25 +f 16/46 14/50 32/32 33/31 +f 42/1 43/2 45/3 44/4 +f 44/4 45/3 47/5 46/6 +f 46/6 47/5 49/7 48/8 +f 48/8 49/7 51/9 50/10 +f 50/10 51/9 53/11 52/12 +f 52/12 53/11 55/13 54/14 +f 54/14 55/13 57/15 56/16 +f 56/16 57/15 59/17 58/18 +f 63/51 62/52 77/53 76/54 75/55 74/56 73/57 72/58 71/59 70/60 69/61 68/62 67/63 66/64 65/65 64/66 +f 47/67 45/68 63/51 64/66 +f 53/69 51/70 66/64 67/63 +f 43/71 61/72 77/53 62/52 +f 45/68 43/71 62/52 63/51 +f 59/73 57/74 69/61 70/60 +f 49/75 47/67 64/66 65/65 +f 55/76 53/69 67/63 68/62 +f 60/77 59/73 70/60 71/59 +f 51/70 49/75 65/65 66/64 +f 57/74 55/76 68/62 69/61 +f 78/1 79/2 81/3 80/4 +f 80/4 81/3 83/5 82/6 +f 82/6 83/5 85/7 84/8 +f 84/8 85/7 87/9 86/10 +f 86/10 87/9 89/11 88/12 +f 88/12 89/11 91/13 90/14 +f 90/14 91/13 93/15 92/16 +f 92/16 93/15 95/17 94/18 +f 99/78 98/79 113/80 112/81 111/82 110/83 109/84 108/85 107/86 106/87 105/88 104/89 103/90 102/91 101/92 100/93 +f 83/94 81/95 99/78 100/93 +f 89/96 87/97 102/91 103/90 +f 79/98 97/99 113/80 98/79 +f 81/95 79/98 98/79 99/78 +f 95/100 93/101 105/88 106/87 +f 85/102 83/94 100/93 101/92 +f 91/103 89/96 103/90 104/89 +f 96/104 95/100 106/87 107/86 +f 87/97 85/102 101/92 102/91 +f 93/101 91/103 104/89 105/88 +o basket_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 -0.437500 +v 0.437500 0.500000 -0.437500 +v 0.437500 0.500000 0.437500 +v -0.437500 -0.437500 0.437500 +v -0.437500 -0.437500 -0.437500 +v 0.437500 -0.437500 -0.437500 +v 0.437500 -0.437500 0.437500 +vt 0.484848 0.984848 +vt 0.015152 0.984848 +vt 0.015152 0.515152 +vt 0.484848 0.515152 +vt 0.515152 0.984848 +vt 0.515152 0.515152 +vt 0.984848 0.515152 +vt 0.984848 0.984848 +vt 0.954545 0.545455 +vt 0.545455 0.545455 +vt 0.954545 0.954545 +vt 0.545455 0.954545 +g basket_Cube.001_basket +s off +f 118/105 119/106 115/107 114/108 +f 119/105 120/106 116/107 115/108 +f 120/105 121/106 117/107 116/108 +f 121/105 118/106 114/107 117/108 +f 114/109 115/110 116/111 117/112 +f 118/110 121/111 125/113 122/114 +f 121/111 120/112 124/115 125/113 +f 120/112 119/109 123/116 124/115 +f 119/109 118/110 122/114 123/116 +f 122/105 125/106 129/107 126/108 +f 125/105 124/106 128/107 129/108 +f 124/105 123/106 127/107 128/108 +f 123/105 122/106 126/107 127/108 +f 126/114 129/113 128/115 127/116 diff --git a/mods/plantlife_modpack/bushes_classic/models/bushes_bush.obj b/mods/plantlife_modpack/bushes_classic/models/bushes_bush.obj new file mode 100644 index 0000000..a69bfce --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/models/bushes_bush.obj @@ -0,0 +1,329 @@ +# Blender v2.73 (sub 0) OBJ File: 'bush.blend' +# www.blender.org +o nodebox-4 +v 0.467076 -0.122686 -0.190481 +v -0.453590 -0.119789 -0.192145 +v 0.420865 -0.181680 -0.171396 +v -0.429008 -0.188000 -0.182314 +v -0.450977 0.041977 -0.191409 +v -0.271687 -0.294075 -0.114977 +v -0.096925 -0.495759 -0.044091 +v -0.070286 -0.344209 -0.030750 +v -0.163971 -0.173437 -0.403793 +v -0.188139 -0.116431 0.446425 +v 0.069865 0.462329 0.170043 +v -0.175980 -0.180649 0.417932 +v -0.184276 0.039248 0.437271 +v -0.121692 -0.319322 0.290049 +v -0.039557 -0.495759 0.097032 +v -0.029307 -0.346230 0.070496 +v -0.440307 0.205163 -0.203598 +v -0.440281 0.206327 0.191785 +v -0.339366 0.327086 -0.144329 +v -0.267923 0.418413 0.108270 +v -0.264994 0.405691 -0.113216 +v 0.173823 0.186657 0.424935 +v -0.172109 0.470396 -0.073638 +v -0.090743 0.491063 -0.039539 +v -0.173625 0.180559 0.412022 +v 0.108534 0.404586 0.263698 +v -0.137870 0.317286 0.327397 +v 0.149454 0.342906 0.361857 +v -0.115069 0.426252 0.274637 +v 0.116858 -0.311812 0.284557 +v -0.074459 0.465500 0.178311 +v -0.036397 0.486640 0.094150 +v 0.044199 -0.495759 -0.101459 +v 0.034559 -0.377127 -0.079219 +v 0.116886 -0.299764 -0.276145 +v -0.172864 0.462259 0.069984 +v 0.173974 -0.178414 -0.411782 +v 0.191827 0.042411 -0.453422 +v 0.190055 -0.117435 -0.449613 +v -0.136929 0.321997 -0.339476 +v 0.101567 -0.495759 0.039664 +v 0.076778 -0.365788 0.030191 +v 0.292232 -0.320027 0.121743 +v -0.067752 0.451498 -0.167691 +v 0.433751 -0.189348 0.181586 +v 0.457624 0.044950 0.184732 +v 0.473778 -0.128221 0.198329 +v -0.113891 -0.307852 -0.282552 +v 0.081961 0.458662 -0.191580 +v 0.042947 0.491063 -0.093885 +v 0.109202 0.397842 -0.257691 +v 0.145450 0.328672 -0.343352 +v 0.191241 0.038411 0.444768 +v -0.184306 0.045052 -0.456452 +v -0.289997 -0.318897 0.117161 +v 0.182461 0.185982 -0.431178 +v 0.180190 0.469152 0.074510 +v 0.097292 0.491063 0.039804 +v 0.264954 0.412421 0.110505 +v 0.355939 0.336100 0.148277 +v -0.474575 0.042725 0.191924 +v -0.169486 0.185035 -0.418844 +v -0.445009 -0.118527 0.180804 +v 0.427054 0.187979 0.172057 +v 0.350926 0.339079 -0.143384 +v 0.189060 -0.125023 0.462241 +v 0.269270 -0.290650 -0.109472 +v 0.175816 -0.186803 0.429367 +v 0.259570 0.406980 -0.105942 +v -0.103158 0.398344 -0.255462 +v -0.339105 0.330270 0.137302 +v -0.186029 -0.123369 -0.460126 +v -0.418539 -0.180131 0.169838 +v 0.041492 0.491063 0.094145 +v 0.487251 0.041118 -0.191308 +v 0.173059 0.459504 -0.070716 +v 0.460259 0.206607 -0.196213 +v 0.108065 0.487446 -0.045199 +v -0.103423 0.491173 0.040772 +v -0.040665 0.496765 -0.107957 +v -0.070153 -0.343292 0.028053 +v -0.028215 -0.347521 -0.072596 +v 0.028031 -0.329368 0.067986 +v 0.075170 -0.358957 -0.031186 +v -0.037332 -0.495759 -0.099759 +v 0.099867 -0.495759 -0.041867 +v -0.095225 -0.495759 0.037440 +v 0.041974 -0.495759 0.095332 +v 0.001777 0.503796 -0.003546 +v 0.002321 -0.495758 -0.002214 +vt 0.875000 0.281250 +vt 1.000000 0.281250 +vt 1.000000 0.421875 +vt 0.875000 0.421875 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.234375 +vt 0.375000 0.234375 +vt 0.625000 0.234375 +vt 0.625000 0.281250 +vt 0.500000 0.281250 +vt 0.500000 0.609375 +vt 0.500000 0.656250 +vt 0.375000 0.656250 +vt 0.375000 0.609375 +vt 0.625000 0.421875 +vt 0.500000 0.421875 +vt 0.375000 0.281250 +vt 0.375000 0.421875 +vt 0.125000 0.609375 +vt 0.125000 0.656250 +vt 0.000000 0.656250 +vt 0.000000 0.609375 +vt 0.846670 0.983596 +vt 0.823789 0.862038 +vt 0.861831 0.862038 +vt 0.500000 0.531250 +vt 0.375000 0.531250 +vt 0.234375 0.609375 +vt 0.234375 0.531250 +vt 0.875000 0.234375 +vt 0.750000 0.234375 +vt 0.750000 0.125000 +vt 0.875000 0.125000 +vt 0.125000 0.234375 +vt 0.125000 0.125000 +vt 0.234375 0.125000 +vt 0.234375 0.234375 +vt 0.125000 0.281250 +vt 0.234375 0.281250 +vt 0.234375 0.421875 +vt 0.125000 0.421875 +vt 0.125000 0.703125 +vt 0.000000 0.703125 +vt 0.875000 0.656250 +vt 0.750000 0.656250 +vt 0.750000 0.609375 +vt 0.875000 0.609375 +vt 0.625000 0.656250 +vt 0.625000 0.609375 +vt 0.234375 0.656250 +vt 0.375000 0.703125 +vt 0.234375 0.703125 +vt 0.125000 0.531250 +vt 0.875000 0.531250 +vt 1.000000 0.531250 +vt 1.000000 0.609375 +vt 0.500000 0.703125 +vt 0.000000 0.421875 +vt 0.000000 0.531250 +vt 0.875000 0.703125 +vt 0.750000 0.703125 +vt 0.328125 0.812500 +vt 0.328125 0.875000 +vt 0.265625 0.890625 +vt 0.265625 0.781250 +vt 0.750000 0.531250 +vt 1.000000 0.234375 +vt -0.000000 0.281250 +vt 0.000000 0.234375 +vt 0.375000 0.921875 +vt 0.328125 0.984375 +vt 0.562500 0.812500 +vt 0.500000 0.828125 +vt 0.625000 0.125000 +vt 0.625000 0.531250 +vt 0.970570 0.983596 +vt 0.918853 0.862038 +vt 0.983390 0.862038 +vt 1.000000 0.703125 +vt 1.000000 0.656250 +vt 0.694849 0.983596 +vt 0.653099 0.862038 +vt 0.703461 0.862038 +vt 0.453125 1.000000 +vt 0.437500 0.937500 +vt 0.546875 0.937500 +vt 0.375000 0.765625 +vt 0.625000 0.703125 +vt 0.750000 0.281250 +vt 0.000000 0.125000 +vt 0.781059 0.974219 +vt 0.740272 0.862038 +vt 0.773590 0.862038 +vt 0.823762 0.862067 +vt 0.773656 0.862066 +vt 0.800723 0.801332 +vt 0.750000 0.421875 +vt 1.000000 0.125000 +vt 0.881508 0.980225 +vt 0.923791 0.982865 +vt 0.819499 0.959318 +vt 0.634200 0.973424 +vt 0.659430 0.971277 +vt 0.724959 0.956989 +vt 0.755822 0.968617 +vt 0.125000 0.000000 +vt 0.234375 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.000000 +vt 1.000000 0.000000 +vt 0.625000 0.000000 +vt 0.000000 0.000000 +vt 0.618713 0.862038 +vt 0.453125 0.781250 +vt 0.484375 0.890625 +vt 0.406250 0.859375 +vt 0.738525 0.828462 +vt 0.741806 0.778103 +vt 0.777683 0.740596 +vt 0.827789 0.740597 +vt 0.862920 0.774201 +vt 0.859639 0.824560 +s off +f 63/1 10/2 13/3 61/4 +f 67/5 35/6 37/7 3/8 +f 9/9 72/10 39/11 37/7 +f 52/12 51/13 69/14 65/15 +f 72/10 54/16 38/17 39/11 +f 1/18 39/11 38/17 75/19 +f 28/20 26/21 29/22 27/23 +f 82/24 33/25 85/26 +f 75/19 38/17 56/27 77/28 +f 77/28 65/15 60/29 64/30 +f 73/31 4/32 6/33 55/34 +f 68/35 30/36 43/37 45/38 +f 66/39 47/40 46/41 53/42 +f 11/43 31/44 29/22 26/21 +f 20/45 21/46 19/47 71/48 +f 70/49 40/50 19/47 21/46 +f 59/51 69/14 76/52 57/53 +f 3/8 37/7 39/11 1/18 +f 28/20 22/54 64/30 60/29 +f 71/48 18/55 25/56 27/57 +f 69/14 51/13 49/58 76/52 +f 13/59 53/42 22/54 25/60 +f 36/61 23/62 21/46 20/45 +f 58/63 74/64 11/65 57/66 +f 57/53 11/43 26/21 59/51 +f 19/47 17/67 18/55 71/48 +f 73/31 12/68 10/2 63/1 +f 68/35 66/39 10/69 12/70 +f 74/64 32/71 31/72 11/65 +f 53/42 46/41 64/30 22/54 +f 25/56 18/55 61/4 13/3 +f 49/58 44/73 80/74 +f 45/38 3/8 1/18 47/40 +f 9/9 48/75 6/33 4/32 +f 62/76 40/50 52/12 56/27 +f 81/77 7/78 87/79 +f 31/80 36/61 20/45 29/81 +f 83/82 15/83 88/84 +f 36/85 79/86 23/87 +f 78/88 58/63 57/66 +f 17/67 19/47 40/50 62/76 +f 45/38 47/40 66/39 68/35 +f 51/13 70/49 44/89 49/58 +f 4/32 73/31 63/1 2/90 +f 12/70 14/91 30/36 68/35 +f 84/92 41/93 86/94 +f 33/95 86/96 90/97 +f 70/49 21/46 23/62 44/89 +f 54/16 62/76 56/27 38/17 +f 29/81 20/45 71/48 27/57 +f 37/7 35/6 48/75 9/9 +f 5/98 17/67 62/76 54/16 +f 18/55 17/67 5/98 61/4 +f 10/69 66/39 53/42 13/59 +f 12/68 73/31 55/34 14/99 +f 51/13 52/12 40/50 70/49 +f 27/23 25/60 22/54 28/20 +f 65/15 69/14 59/51 60/29 +f 56/27 52/12 65/15 77/28 +f 46/41 75/19 77/28 64/30 +f 60/29 59/51 26/21 28/20 +f 47/40 1/18 75/19 46/41 +f 2/90 5/98 54/16 72/10 +f 4/32 2/90 72/10 9/9 +f 43/37 67/5 3/8 45/38 +f 2/90 63/1 61/4 5/98 +f 82/100 7/78 8/101 +f 82/24 34/102 33/25 +f 81/103 15/83 16/104 +f 81/77 8/101 7/78 +f 83/82 41/93 42/105 +f 83/82 16/104 15/83 +f 84/92 33/25 34/102 +f 84/92 42/106 41/93 +f 30/36 83/107 42/108 43/37 +f 42/108 84/109 67/5 43/37 +f 67/5 84/109 34/110 35/6 +f 55/34 6/33 8/111 81/112 +f 55/34 81/112 16/113 14/99 +f 34/110 82/114 48/75 35/6 +f 48/75 82/114 8/111 6/33 +f 30/36 14/91 16/115 83/107 +f 7/78 82/100 85/26 +f 15/83 81/103 87/116 +f 41/93 83/82 88/84 +f 33/25 84/92 86/94 +f 80/74 50/117 49/58 +f 23/87 24/118 80/74 +f 80/74 44/73 23/87 +f 79/86 36/85 31/72 +f 79/86 24/118 23/87 +f 31/72 32/71 79/86 +f 78/88 49/58 50/117 +f 78/88 57/66 76/52 +f 76/52 49/58 78/88 +f 24/118 79/86 89/119 +f 79/86 32/71 89/119 +f 32/71 74/64 89/119 +f 74/64 58/63 89/119 +f 58/63 78/88 89/119 +f 78/88 50/117 89/119 +f 50/117 80/74 89/119 +f 80/74 24/118 89/119 +f 86/96 41/120 90/97 +f 41/120 88/121 90/97 +f 88/121 15/122 90/97 +f 15/122 87/123 90/97 +f 87/123 7/124 90/97 +f 7/124 85/125 90/97 +f 85/125 33/95 90/97 diff --git a/mods/plantlife_modpack/bushes_classic/nodes.lua b/mods/plantlife_modpack/bushes_classic/nodes.lua new file mode 100644 index 0000000..6f4a8f0 --- /dev/null +++ b/mods/plantlife_modpack/bushes_classic/nodes.lua @@ -0,0 +1,215 @@ +-- support for i18n +local S = minetest.get_translator("bushes_classic") + +plantlife_bushes = {} + +-- TODO: add support for nodebreakers? those dig like mese picks +plantlife_bushes.after_dig_node = function(pos, oldnode, oldmetadata, digger) + if not (digger and pos and oldnode) then + return + end + + -- find out which bush type we are dealing with + local bush_name = "" + local can_harvest = false + + if oldnode.name == "bushes:fruitless_bush" then + -- this bush has not grown fruits yet (but will eventually) + bush_name = oldmetadata.fields.bush_type + -- no fruits to be found, so can_harvest stays false + else + local name_parts = oldnode.name:split(":") + if #name_parts >= 2 and name_parts[2] ~= nil then + + name_parts = name_parts[2]:split("_") + + if #name_parts >= 2 and name_parts[1] ~= nil then + bush_name = name_parts[1] + -- this bush really carries fruits + can_harvest = true + end + end + end + + -- find out which tool the digger was wielding (if any) + local toolstack = digger:get_wielded_item() + local capabilities = toolstack:get_tool_capabilities() + + -- what the player will get + local harvested + + -- failure to find out what the tool can do: destroy the bush and return nothing + local groupcaps = capabilities.groupcaps + if not groupcaps then + return + + -- digging with the hand or something like that + elseif groupcaps.snappy then + + -- plant a new bush without fruits + minetest.swap_node(pos, {type = "node", name = "bushes:fruitless_bush"}) + local meta = minetest.get_meta(pos) + meta:set_string('bush_type', bush_name) + + -- construct the stack of fruits the player will get + -- only bushes that have grown fruits can actually give fruits + if can_harvest then + local amount = "4" + harvested = "bushes:" .. bush_name .. " " .. amount + end + + -- something like a shovel + elseif groupcaps.crumbly then + + -- with a chance of 1/3, return 2 bushes + local amount + if can_harvest and math.random(1,3) == 1 then + amount = "2" + else + amount = "1" + end + -- return the bush itself + harvested = "bushes:" .. bush_name .. "_bush "..amount + + -- something like an axe + elseif groupcaps.choppy then + + -- the amount of sticks may vary + local amount = math.random(4, 20) + -- return some sticks + harvested = "default:stick " .. amount + + -- nothing known - destroy the plant + else + return + end + + -- give the harvested result to the player + if harvested then + --minetest.chat_send_player("singleplayer","you would now get "..tostring( harvested ) ); + local itemstack = ItemStack(harvested) + local inventory = digger:get_inventory() + if inventory:room_for_item("main", itemstack) then + inventory:add_item("main", itemstack) + else + minetest.item_drop(itemstack, digger, pos) + end + end +end + +plantlife_bushes.after_place_node = function(pos, placer, itemstack) + + if not (itemstack and pos) then + return + end + + local name_parts = itemstack:get_name():split(":") + if #name_parts < 2 or name_parts[2] == nil then + return + end + + name_parts = name_parts[2]:split("_") + + if #name_parts < 2 or name_parts[1] == nil then + return + end + + minetest.swap_node(pos, {name = "bushes:fruitless_bush"}) + local meta = minetest.get_meta(pos) + meta:set_string("bush_type", name_parts[1]) +end + +-- regrow berries (uses a base abm instead of biome_lib because of the use of metadata). + +minetest.register_abm({ + nodenames = {"bushes:fruitless_bush"}, + neighbors = {"group:soil", "group:potting_soil"}, + interval = 500, + chance = 5, + action = function(pos, node, active_object_count, active_object_count_wider) + + local meta = minetest.get_meta(pos) + local bush_name = meta:get_string("bush_type") + + if bush_name and bush_name ~= "" then + local dirtpos = {x = pos.x, y = pos.y-1, z = pos.z} + local dirt = minetest.get_node(dirtpos) + local is_soil = minetest.get_item_group(dirt.name, "soil") or minetest.get_item_group(dirt.name, "potting_soil") + + if is_soil and (dirt.name == "farming:soil_wet" or math.random(1,3) == 1) then + minetest.swap_node( pos, {name = "bushes:" .. bush_name .. "_bush"}) + end + end + end +}) + +-- Define the basket and bush nodes + +for i, bush_name in ipairs(bushes_classic.bushes) do + + minetest.register_node(":bushes:basket_"..bush_name, { + description = bushes_classic.bushes_descriptions[i][5], + drawtype = "mesh", + mesh = "bushes_basket_full.obj", + tiles = { + "bushes_basket_pie_"..bush_name..".png", + "bushes_basket.png" + }, + paramtype = "light", + paramtype2 = "facedir", + on_use = minetest.item_eat(18), + groups = { dig_immediate = 3 }, + is_ground_content = false, + }) + + + local groups = {snappy = 3, bush = 1, flammable = 2, attached_node=1} + if bush_name == "mixed_berry" then + bush_name = "fruitless"; + groups.not_in_creative_inventory = 1 + end + + local node_dig_prediction + local node_placement_prediction + if bush_name ~= "fruitless" then + node_dig_prediction = "bushes:fruitless_bush" + node_placement_prediction = "bushes:fruitless_bush" + end + + minetest.register_node(":bushes:" .. bush_name .. "_bush", { + description = bushes_classic.bushes_descriptions[i][6], + drawtype = "mesh", + mesh = "bushes_bush.obj", + tiles = {"bushes_bush_"..bush_name..".png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = groups, + sounds = default.node_sound_leaves_defaults(), + drop = "", + node_dig_prediction = node_dig_prediction, + node_placement_prediction = node_placement_prediction, + after_dig_node = function( pos, oldnode, oldmetadata, digger ) + return plantlife_bushes.after_dig_node(pos, oldnode, oldmetadata, digger); + end, + after_place_node = function( pos, placer, itemstack ) + return plantlife_bushes.after_place_node(pos, placer, itemstack); + end, + }) + + -- do not spawn fruitless bushes + if bush_name ~= "fruitless" then + table.insert(bushes_classic.spawn_list, "bushes:"..bush_name.."_bush") + end +end + +minetest.register_node(":bushes:basket_empty", { + description = S("Basket"), + drawtype = "mesh", + mesh = "bushes_basket_empty.obj", + tiles = { "bushes_basket.png" }, + paramtype = "light", + paramtype2 = "facedir", + groups = { dig_immediate = 3 }, + is_ground_content = false, +}) diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png new file mode 100644 index 0000000..098515a Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png new file mode 100644 index 0000000..cbf30c6 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blackberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png new file mode 100644 index 0000000..9f4c844 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_blueberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png new file mode 100644 index 0000000..4d1404b Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_gooseberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png new file mode 100644 index 0000000..b63bec6 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_mixed_berry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png new file mode 100644 index 0000000..8cc7d50 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_raspberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png new file mode 100644 index 0000000..2ce9876 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_basket_pie_strawberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry.png new file mode 100644 index 0000000..76b742b Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_cooked.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_cooked.png new file mode 100644 index 0000000..a6af5ca Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_cooked.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_raw.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_raw.png new file mode 100644 index 0000000..c37f987 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_raw.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_slice.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_slice.png new file mode 100644 index 0000000..90be80e Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_slice.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry.png new file mode 100644 index 0000000..e15047f Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_cooked.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_cooked.png new file mode 100644 index 0000000..11ce60f Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_cooked.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_raw.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_raw.png new file mode 100644 index 0000000..6e8dd9e Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_raw.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_slice.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_slice.png new file mode 100644 index 0000000..eb6bf5a Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_slice.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png new file mode 100644 index 0000000..8cedd1b Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blackberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png new file mode 100644 index 0000000..870c855 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_blueberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png new file mode 100644 index 0000000..32f14c4 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_fruitless.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png new file mode 100644 index 0000000..2d0db19 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_gooseberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png new file mode 100644 index 0000000..f57c640 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_raspberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png new file mode 100644 index 0000000..7e07d73 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_bush_strawberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry.png new file mode 100644 index 0000000..e712cad Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_cooked.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_cooked.png new file mode 100644 index 0000000..caa4e92 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_cooked.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_raw.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_raw.png new file mode 100644 index 0000000..baf5af7 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_raw.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_slice.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_slice.png new file mode 100644 index 0000000..5cf2844 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_slice.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_cooked.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_cooked.png new file mode 100644 index 0000000..351a269 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_cooked.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_raw.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_raw.png new file mode 100644 index 0000000..6486989 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_raw.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_slice.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_slice.png new file mode 100644 index 0000000..8844c3d Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_slice.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry.png new file mode 100644 index 0000000..034fd48 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_cooked.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_cooked.png new file mode 100644 index 0000000..afeb7d8 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_cooked.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_raw.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_raw.png new file mode 100644 index 0000000..bb76a1d Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_raw.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_slice.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_slice.png new file mode 100644 index 0000000..a094488 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_slice.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry.png new file mode 100644 index 0000000..b6a74b6 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_cooked.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_cooked.png new file mode 100644 index 0000000..3d034ea Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_cooked.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_raw.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_raw.png new file mode 100644 index 0000000..932c073 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_raw.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_slice.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_slice.png new file mode 100644 index 0000000..f8d1d36 Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_slice.png differ diff --git a/mods/plantlife_modpack/bushes_classic/textures/bushes_sugar.png b/mods/plantlife_modpack/bushes_classic/textures/bushes_sugar.png new file mode 100644 index 0000000..726196b Binary files /dev/null and b/mods/plantlife_modpack/bushes_classic/textures/bushes_sugar.png differ diff --git a/mods/plantlife_modpack/cavestuff/init.lua b/mods/plantlife_modpack/cavestuff/init.lua new file mode 100644 index 0000000..d328f46 --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/init.lua @@ -0,0 +1,2 @@ +dofile(minetest.get_modpath("cavestuff").."/nodes.lua") +dofile(minetest.get_modpath("cavestuff").."/mapgen.lua") diff --git a/mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr b/mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr new file mode 100644 index 0000000..69bb0cc --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr @@ -0,0 +1,4 @@ +# textdomain: cavestuff +Pebble=Kieselstein +Desert Pebble=Wüstenkiesel +Stalactite=Stalaktit diff --git a/mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr b/mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr new file mode 100644 index 0000000..9da0f26 --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr @@ -0,0 +1,4 @@ +# textdomain: cavestuff +Pebble=Ŝtoneto +Desert Pebble=Dezerta Ŝtoneto +Stalactite=Stalaktito diff --git a/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr b/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr new file mode 100644 index 0000000..0c48fb0 --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/locale/cavestuff.fr.tr @@ -0,0 +1,4 @@ +# textdomain: cavestuff +Pebble=Caillou +Desert Pebble=Caillou du désert +Stalactite=Stalactite diff --git a/mods/plantlife_modpack/cavestuff/locale/template.txt b/mods/plantlife_modpack/cavestuff/locale/template.txt new file mode 100644 index 0000000..aae2112 --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: cavestuff +Pebble= +Desert Pebble= +Stalactite= diff --git a/mods/plantlife_modpack/cavestuff/mapgen.lua b/mods/plantlife_modpack/cavestuff/mapgen.lua new file mode 100644 index 0000000..64de328 --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/mapgen.lua @@ -0,0 +1,65 @@ +--Map Generation Stuff + +minetest.register_decoration({ + decoration = { + "cavestuff:pebble_1", + "cavestuff:pebble_2" + }, + place_on = { + "default:dirt_with_grass", + "default:gravel", + "default:stone", + "default:permafrost_with_stones" + }, + noise_params = { + offset = 0, + scale = 0.0078125, + spread = { + y = 100, + z = 100, + x = 100 + }, + seed = 0, + octaves = 3, + persist = 0.6, + flags = "absvalue", + lacunarity = 2 + }, + param2 = 0, + flags = "all_floors", + deco_type = "simple", + param2_max = 3, + y_min = -16, + y_max = 48 +}) + +minetest.register_decoration({ + decoration = { + "cavestuff:desert_pebble_1", + "cavestuff:desert_pebble_2" + }, + place_on = { + "default:desert_sand", + "default:desert_stone" + }, + noise_params = { + offset = 0, + scale = 0.0078125, + spread = { + y = 100, + z = 100, + x = 100 + }, + seed = 0, + octaves = 3, + persist = 0.6, + flags = "absvalue", + lacunarity = 2 + }, + param2 = 0, + flags = "all_floors", + deco_type = "simple", + param2_max = 3, + y_min = -16, + y_max = 48 +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/cavestuff/mod.conf b/mods/plantlife_modpack/cavestuff/mod.conf new file mode 100644 index 0000000..b021c9e --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/mod.conf @@ -0,0 +1,2 @@ +name = cavestuff +depends = default diff --git a/mods/plantlife_modpack/cavestuff/models/cavestuff_pebble.obj b/mods/plantlife_modpack/cavestuff/models/cavestuff_pebble.obj new file mode 100644 index 0000000..243d1ce --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/models/cavestuff_pebble.obj @@ -0,0 +1,279 @@ +# Blender v2.69 (sub 0) OBJ File: '' +# www.blender.org +mtllib cavestuff_pebble.mtl +o Icosphere.001_Icosphere.002 +v -0.000327 -0.410467 0.180121 +v -0.235610 -0.410468 0.155391 +v -0.284796 -0.410468 -0.076018 +v -0.121985 -0.209219 0.205980 +v -0.284738 -0.218753 0.040139 +v -0.201573 -0.219323 -0.168447 +v -0.100950 -0.116906 0.005837 +v -0.088586 -0.496875 -0.111804 +v -0.196648 -0.428134 -0.159917 +v -0.209011 -0.497294 -0.042276 +v -0.041805 -0.497429 0.108278 +v -0.180101 -0.487871 0.093742 +v -0.120956 -0.428134 0.196184 +v -0.288163 -0.428135 0.045629 +v -0.147553 -0.309844 -0.213938 +v -0.268157 -0.309844 -0.144718 +v -0.192465 -0.309844 0.211384 +v -0.054169 -0.309844 0.225920 +v -0.324717 -0.309844 -0.017682 +v -0.288965 -0.319377 0.114387 +v -0.023183 -0.210866 0.195570 +v -0.221888 -0.201086 0.143956 +v -0.275798 -0.233149 -0.072011 +v -0.160094 -0.150509 -0.096605 +v -0.113314 -0.150508 0.123477 +v -0.216653 -0.160042 0.030431 +v 0.073364 -0.397538 -0.267606 +v 0.268711 -0.397538 -0.091716 +v 0.161795 -0.397537 0.148424 +v 0.199614 -0.173928 -0.211396 +v 0.254265 -0.173928 0.045725 +v 0.026620 -0.195887 0.177156 +v -0.061812 -0.173929 -0.238874 +v 0.049992 -0.055394 -0.045225 +v 0.178551 -0.485125 -0.072552 +v 0.063729 -0.498396 -0.175936 +v 0.192289 -0.417167 -0.203264 +v -0.056339 -0.417167 -0.229396 +v -0.070077 -0.496109 -0.098684 +v 0.115708 -0.497252 0.068599 +v 0.244268 -0.417167 0.041273 +v 0.027763 -0.417167 0.166272 +v -0.001987 -0.285733 -0.289762 +v -0.109557 -0.285733 -0.245455 +v 0.258217 -0.285733 -0.165444 +v 0.151676 -0.285733 -0.273611 +v 0.235777 -0.285733 0.122059 +v 0.298622 -0.285733 -0.019093 +v 0.101971 -0.285733 0.199312 +v 0.072221 -0.154299 -0.256722 +v 0.258006 -0.154298 -0.089439 +v 0.156323 -0.154299 0.138946 +v 0.137937 -0.086893 -0.142897 +v -0.015725 -0.073070 -0.159049 +v 0.170060 -0.073069 0.008234 +v 0.036254 -0.095028 0.085487 +v -0.059660 -0.090744 -0.028814 +v -0.016904 -0.495185 -0.020480 +v -0.038530 -0.134593 0.104482 +v 0.018559 -0.297788 0.203363 +vt 0.999784 0.777888 +vt 0.781916 0.751069 +vt 0.930695 0.535842 +vt 0.718554 0.493678 +vt 0.498343 0.500066 +vt 0.612704 0.301958 +vt 0.278288 0.491767 +vt 0.136170 0.301428 +vt 0.385039 0.315647 +vt 0.861174 0.302958 +vt 0.817615 0.924676 +vt 0.662334 0.996212 +vt 0.719667 0.785775 +vt 0.955856 0.540882 +vt 0.919844 0.749017 +vt 0.810792 0.580191 +vt 0.698724 0.249779 +vt 0.882029 0.358101 +vt 0.648319 0.423681 +vt 0.738504 0.311189 +vt 0.859769 0.100574 +vt 0.955856 0.301223 +vt 0.603011 0.109855 +vt 0.889116 0.979094 +vt 0.625593 0.954685 +vt 0.572947 0.723101 +vt 0.629662 0.708272 +vt 0.361849 0.694965 +vt 0.626863 0.523494 +vt 0.877334 0.514944 +vt 0.753445 0.687054 +vt 0.678897 0.522004 +vt 0.804007 0.322784 +vt 0.508145 0.125975 +vt 0.614686 0.322544 +vt 0.274631 0.088482 +vt 0.046907 0.080882 +vt 0.724191 0.150589 +vt 0.955856 0.101994 +vt 0.459738 0.810380 +vt 0.524431 0.596612 +vt 0.614955 0.619521 +vt 0.385224 0.455707 +vt 0.518113 0.743431 +vt 0.397247 0.481913 +vt 0.473092 0.333636 +vt 0.593136 0.806842 +vt 0.542133 0.566645 +vt 0.245991 0.361941 +vt 0.291514 0.126530 +vt 0.515385 0.289890 +vt 0.348981 0.560141 +vt 0.480373 0.537386 +vt 0.705144 0.472239 +vt 0.601667 0.722403 +vt 0.283471 0.700220 +vt 0.061144 0.812481 +vt 0.120014 0.502516 +vt 0.080353 0.535703 +vt 0.356859 0.719702 +vt 0.417004 0.243099 +vt 0.001005 0.468262 +vt 0.186797 0.314823 +vt 0.187216 0.555587 +vt 0.094383 0.931756 +vt 0.003057 0.709324 +vt 0.238065 0.772821 +vt 0.569632 0.999536 +vt 0.323797 1.000000 +vt 0.482075 0.313011 +vt 0.735871 0.182001 +vt 0.032983 0.251846 +vt 0.574313 0.080491 +vt 0.318361 0.961238 +vt 0.229901 0.178033 +vt 0.256609 0.467686 +vt 0.464307 0.768933 +vt 0.865183 0.712997 +vt 0.725052 0.926500 +vt 0.093408 0.705147 +vt 0.230523 0.921209 +vt 0.968797 0.984796 +vt 0.210756 0.792236 +vt 0.477482 0.962103 +vt 0.256493 0.223509 +vt 0.000000 0.255402 +vt 0.543998 0.500902 +vt 0.362414 0.637562 +vt 0.469769 0.648982 +vt 0.379376 0.894841 +vt 0.246514 0.544201 +vt 0.117965 0.884444 +vt 0.047032 0.632888 +vt 0.079441 0.605161 +vt 0.000000 0.325670 +vt 0.241712 0.163133 +vt 0.470206 0.343559 +usemtl None +s off +f 2/1 13/2 17/3 +f 3/4 14/5 19/6 +f 2/7 17/8 20/9 +f 3/4 19/6 16/10 +f 4/11 21/12 25/13 +f 5/14 22/15 26/16 +f 6/17 23/18 24/19 +f 9/20 10/21 3/22 +f 9/20 8/23 10/21 +f 12/24 13/2 2/1 +f 12/24 11/25 13/2 +f 11/25 1/26 13/2 +f 10/27 14/5 3/4 +f 10/27 12/28 14/5 +f 12/28 2/7 14/5 +f 15/29 16/30 6/31 +f 15/29 9/20 16/30 +f 9/20 3/22 16/30 +f 17/3 18/32 4/33 +f 17/3 13/2 18/32 +f 13/2 1/26 18/32 +f 19/6 20/9 5/34 +f 19/6 14/5 20/9 +f 14/5 2/7 20/9 +f 18/32 21/35 4/33 +f 20/9 22/36 5/34 +f 20/9 17/8 22/36 +f 17/8 4/37 22/36 +f 16/10 23/38 6/39 +f 16/10 19/6 23/38 +f 19/6 5/34 23/38 +f 56/40 57/41 7/42 +f 57/41 54/43 24/19 +f 1/26 42/44 49/45 +f 38/46 9/20 15/29 +f 25/13 21/12 59/47 +f 15/29 6/31 44/48 +f 26/16 25/13 7/42 +f 26/16 22/15 25/13 +f 22/15 4/11 25/13 +f 24/19 26/16 7/42 +f 24/19 23/18 26/16 +f 23/18 5/14 26/16 +f 27/49 36/50 38/46 +f 32/51 21/35 49/45 +f 27/49 38/46 43/52 +f 28/53 37/54 45/55 +f 29/56 41/57 47/58 +f 1/26 11/25 42/44 +f 27/49 43/52 46/59 +f 28/53 45/55 48/60 +f 29/56 47/58 49/45 +f 6/17 24/19 33/61 +f 30/62 50/63 53/64 +f 31/65 51/66 55/67 +f 32/68 52/69 56/40 +f 35/70 37/54 28/53 +f 35/70 36/71 37/54 +f 36/50 27/49 37/72 +f 9/20 38/46 8/23 +f 38/46 36/50 39/73 +f 40/74 41/57 29/56 +f 40/75 35/70 41/76 +f 35/70 28/53 41/76 +f 44/48 38/46 15/29 +f 38/46 39/73 8/23 +f 40/74 29/56 42/44 +f 43/52 44/48 33/77 +f 43/52 38/46 44/48 +f 45/55 46/78 30/79 +f 45/55 37/54 46/78 +f 37/72 27/49 46/59 +f 47/80 48/60 31/81 +f 47/80 41/76 48/60 +f 41/76 28/53 48/60 +f 11/25 40/74 42/44 +f 42/44 29/56 49/45 +f 46/78 50/82 30/79 +f 46/59 43/52 50/83 +f 43/52 33/77 50/83 +f 48/60 51/84 31/81 +f 48/60 45/55 51/84 +f 45/55 30/79 51/84 +f 49/45 52/85 32/51 +f 49/45 47/58 52/85 +f 47/58 31/86 52/85 +f 18/32 1/26 60/87 +f 21/35 18/32 60/87 +f 6/31 33/77 44/48 +f 53/64 54/43 34/88 +f 53/64 50/63 54/43 +f 50/63 33/61 54/43 +f 55/67 53/64 34/88 +f 55/67 51/66 53/64 +f 51/66 30/62 53/64 +f 56/40 55/67 34/88 +f 56/40 52/69 55/67 +f 52/69 31/65 55/67 +f 57/41 56/40 34/88 +f 21/12 32/68 56/40 +f 25/13 59/47 7/42 +f 54/43 57/41 34/88 +f 7/42 57/41 24/19 +f 33/61 24/19 54/43 +f 11/89 12/90 58/91 +f 12/90 10/92 58/91 +f 10/92 8/93 58/91 +f 8/93 39/94 58/91 +f 39/94 36/95 58/91 +f 36/95 35/96 58/91 +f 35/96 40/97 58/91 +f 40/97 11/89 58/91 +f 21/12 56/40 59/47 +f 59/47 56/40 7/42 +f 1/26 49/45 60/87 +f 49/45 21/35 60/87 diff --git a/mods/plantlife_modpack/cavestuff/nodes.lua b/mods/plantlife_modpack/cavestuff/nodes.lua new file mode 100644 index 0000000..018963c --- /dev/null +++ b/mods/plantlife_modpack/cavestuff/nodes.lua @@ -0,0 +1,160 @@ +-- support for i18n +local S = minetest.get_translator("cavestuff") + +--Rocks + +local cbox = { + type = "fixed", + fixed = {-5/16, -8/16, -6/16, 5/16, -1/32, 5/16}, +} + +minetest.register_node("cavestuff:pebble_1",{ + description = S("Pebble"), + drawtype = "mesh", + mesh = "cavestuff_pebble.obj", + tiles = {"undergrowth_pebble.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, stone=1, attached_node=1, dig_immediate=3}, + selection_box = cbox, + collision_box = cbox, + on_place = function(itemstack, placer, pointed_thing) + -- place a random pebble node + local stack = ItemStack("cavestuff:pebble_"..math.random(1,2)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("cavestuff:pebble_1 "..itemstack:get_count()-(1-ret:get_count())) + end, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("cavestuff:pebble_2",{ + drawtype = "mesh", + mesh = "cavestuff_pebble.obj", + tiles = {"undergrowth_pebble.png"}, + drop = "cavestuff:pebble_1", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1, dig_immediate=3}, + selection_box = cbox, + collision_box = cbox, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("cavestuff:desert_pebble_1",{ + description = S("Desert Pebble"), + drawtype = "mesh", + mesh = "cavestuff_pebble.obj", + tiles = {"default_desert_stone.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, stone=1, attached_node=1, dig_immediate=3}, + selection_box = cbox, + collision_box = cbox, + on_place = function(itemstack, placer, pointed_thing) + -- place a random pebble node + local stack = ItemStack("cavestuff:desert_pebble_"..math.random(1,2)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("cavestuff:desert_pebble_1 "..itemstack:get_count()-(1-ret:get_count())) + end, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("cavestuff:desert_pebble_2",{ + drawtype = "mesh", + mesh = "cavestuff_pebble.obj", + drop = "cavestuff:desert_pebble_1", + tiles = {"default_desert_stone.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1, dig_immediate=3}, + selection_box = cbox, + collision_box = cbox, + sounds = default.node_sound_stone_defaults(), +}) + +--Staclactites + +minetest.register_node("cavestuff:stalactite_1",{ + drawtype="nodebox", + tiles = {"undergrowth_pebble.png"}, + groups = {cracky=3,attached_node=1}, + is_ground_content = false, + description = S("Stalactite"), + paramtype = "light", + paramtype2 = "wallmounted", + node_box = { + type = "fixed", + fixed = { + {-0.187500,-0.425000,-0.150003,0.162500,-0.500000,0.162500}, + {-0.112500,-0.162500,-0.100000,0.087500,-0.475000,0.087500}, + {-0.062500,0.275000,-0.062500,0.062500,-0.500000,0.062500}, + {-0.037500,0.837500,0.037500,0.037500,-0.500000,-0.025000}, + } + }, + on_place = function(itemstack, placer, pointed_thing) + local dir = vector.subtract(pointed_thing.above, pointed_thing.under) + local base = pointed_thing.under + local place = vector.add(base, dir) + local above = vector.add(place, dir) + + if not placer then return end + local playername = placer:get_player_name() + if minetest.is_protected(place, playername) + or minetest.is_protected(above, playername) then + minetest.record_protection_violation(place, playername) + return + end + + if minetest.get_node(base).name == "default:stone" + and minetest.get_node(place).name == "air" + and minetest.get_node(above).name == "air" + then + minetest.swap_node(place, { + name = "cavestuff:stalactite_"..math.random(1,3), + param2 = minetest.dir_to_wallmounted(vector.multiply(dir, -1)) + }) + if not minetest.is_creative_enabled(playername) then + itemstack:take_item() + end + end + return itemstack + end, +}) + +minetest.register_node("cavestuff:stalactite_2",{ + drawtype="nodebox", + tiles = {"undergrowth_pebble.png"}, + groups = {cracky=3,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, + drop = "cavestuff:stalactite_1", + paramtype = "light", + paramtype2 = "wallmounted", + node_box = { + type = "fixed", + fixed = { + {-0.187500,-0.387500,-0.150003,0.162500,-0.500000,0.162500}, + {-0.112500,-0.112500,-0.100000,0.087500,-0.475000,0.087500}, + {-0.062500,0.675000,-0.062500,0.062500,-0.500000,0.062500}, + {-0.037500,0.975000,0.037500,0.037500,-0.500000,-0.025000}, + } + }, +}) + +minetest.register_node("cavestuff:stalactite_3",{ + drawtype="nodebox", + tiles = {"undergrowth_pebble.png"}, + groups = {cracky=3,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, + drop = "cavestuff:stalactite_1", + paramtype = "light", + paramtype2 = "wallmounted", + node_box = { + type = "fixed", + fixed = { + {-0.187500,-0.387500,-0.150003,0.162500,-0.500000,0.162500}, + {-0.112500,-0.037500,-0.100000,0.087500,-0.475000,0.087500}, + {-0.062500,0.437500,-0.062500,0.062500,-0.500000,0.062500}, + {-0.037500,1.237500,0.037500,0.037500,-0.500000,-0.025000}, + } + }, +}) diff --git a/mods/plantlife_modpack/cavestuff/textures/undergrowth_desert_pebble.png b/mods/plantlife_modpack/cavestuff/textures/undergrowth_desert_pebble.png new file mode 100644 index 0000000..966e937 Binary files /dev/null and b/mods/plantlife_modpack/cavestuff/textures/undergrowth_desert_pebble.png differ diff --git a/mods/plantlife_modpack/cavestuff/textures/undergrowth_pebble.png b/mods/plantlife_modpack/cavestuff/textures/undergrowth_pebble.png new file mode 100644 index 0000000..306ca6a Binary files /dev/null and b/mods/plantlife_modpack/cavestuff/textures/undergrowth_pebble.png differ diff --git a/mods/plantlife_modpack/copyright.txt b/mods/plantlife_modpack/copyright.txt new file mode 100644 index 0000000..63d2431 --- /dev/null +++ b/mods/plantlife_modpack/copyright.txt @@ -0,0 +1,10 @@ +Ironzorg's Flowers mod served as the basis for the three mods that eventually +went into creating this file. Any code still remaining from that mod is +entirely his work (though I'm pretty sure it's all been phased out). + +Flowers textures by Ironzorg. + +Junglegrass textures are modified copies of the original one from the game's +default set. + +All remaining code, textures, etc. by Vanessa Ezekowitz. diff --git a/mods/plantlife_modpack/dryplants/crafting.lua b/mods/plantlife_modpack/dryplants/crafting.lua new file mode 100644 index 0000000..97be53e --- /dev/null +++ b/mods/plantlife_modpack/dryplants/crafting.lua @@ -0,0 +1,359 @@ +----------------------------------------------------------------------------------------------- +-- Dry Plants - Recipes 0.1.0 -- Short Grass -> Dirt +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Looked at code from: darkage, default, farming, sickle, stairs +-- Dependencies: default, farming +-- Supports: flint, stoneage, sumpf +----------------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------------------- +-- Short Grass +----------------------------------------------------------------------------------------------- +minetest.register_craft({ + output = "default:dirt", + recipe = { + {"dryplants:grass_short"}, + } +}) + +----------------------------------------------------------------------------------------------- +-- Cut Grass +----------------------------------------------------------------------------------------------- +-- grass recipes (remove roots) +minetest.register_craft({ + output = "dryplants:grass", + recipe = { + {"default:grass_1"}, + } +}) +minetest.register_craft({ + output = "dryplants:grass", + recipe = { + {"default:junglegrass"}, + } +}) +if minetest.get_modpath("sumpf") ~= nil then + minetest.register_craft({ + output = "dryplants:grass", + recipe = { + {"sumpf:gras"}, + } + }) +end + +----------------------------------------------------------------------------------------------- +-- Sickle +----------------------------------------------------------------------------------------------- +minetest.register_craft({ + output = "dryplants:sickle", + recipe = { + {"group:stone",""}, + {"", "default:stick"}, + {"default:stick",""} + } +}) +if minetest.get_modpath("flint") then + minetest.register_craft({ + output = "dryplants:sickle", + recipe = { + {"flint:flintstone",""}, + {"", "default:stick"}, + {"default:stick",""} + } + }) +end +if minetest.get_modpath("stoneage") then + minetest.register_craft({ + output = "dryplants:sickle", + recipe = { + {"stoneage:silex",""}, + {"", "default:stick"}, + {"default:stick",""} + } + }) +end + +----------------------------------------------------------------------------------------------- +-- Hay +----------------------------------------------------------------------------------------------- +--cooking +minetest.register_craft({ + type = "cooking", + output = "dryplants:hay", + recipe = "dryplants:grass", + cooktime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "dryplants:hay", + burntime = 1, +}) + +----------------------------------------------------------------------------------------------- +-- Wet Reed +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- papyrus -> wetreed + output = "dryplants:wetreed 2", + recipe = { + {"default:papyrus","default:papyrus"}, + {"default:papyrus","default:papyrus"}, + } +}) +minetest.register_craft({ -- reedmace_sapling -> wetreed + output = "dryplants:wetreed 2", + recipe = { + {"dryplants:reedmace_sapling","dryplants:reedmace_sapling"}, + {"dryplants:reedmace_sapling","dryplants:reedmace_sapling"}, + } +}) +minetest.register_craft({ -- reedmace_top -> wetreed + output = "dryplants:wetreed 2", + recipe = { + {"dryplants:reedmace_top","dryplants:reedmace_top"}, + {"dryplants:reedmace_top","dryplants:reedmace_top"}, + } +}) +minetest.register_craft({ -- reedmace -> wetreed + output = "dryplants:wetreed 2", + recipe = { + {"dryplants:reedmace","dryplants:reedmace"}, + {"dryplants:reedmace","dryplants:reedmace"}, + } +}) +minetest.register_craft({ -- reedmace_bottom -> wetreed + output = "dryplants:wetreed 2", + recipe = { + {"dryplants:reedmace_bottom","dryplants:reedmace_bottom"}, + {"dryplants:reedmace_bottom","dryplants:reedmace_bottom"}, + } +}) + + +local ReeD = { + {"wetreed"}, + {"reed"} +} +for i in pairs(ReeD) do + local reed = "dryplants:"..ReeD[i][1] + local slab = reed.."_slab" + local roof = reed.."_roof" + local corner = roof.."_corner" + local corner_2 = corner.."_2" +----------------------------------------------------------------------------------------------- +-- Block +----------------------------------------------------------------------------------------------- + minetest.register_craft({ -- slab -> block + output = reed, + recipe = { + {slab}, + {slab}, + } + }) + minetest.register_craft({ -- roof -> block + output = reed, + recipe = { + {roof}, + {roof}, + } + }) + minetest.register_craft({ -- corner -> block + type = "shapeless", + output = reed.." 3", + recipe = {corner,corner,corner,corner,corner,corner,corner,corner}, -- 8x + }) + minetest.register_craft({ -- corner_2 -> block + type = "shapeless", + output = reed.." 3", + recipe = {corner_2,corner_2,corner_2,corner_2,corner_2,corner_2,corner_2,corner_2}, -- 8x + }) +----------------------------------------------------------------------------------------------- +-- Slab +----------------------------------------------------------------------------------------------- + minetest.register_craft({ -- block -> slab + output = slab.." 6", + recipe = { + {reed,reed,reed}, + } + }) + minetest.register_craft({ -- roof -> slab + output = slab, + recipe = { + {roof}, + } + }) + minetest.register_craft({ -- corner -> slab + output = slab.." 3", + recipe = { + {corner,corner}, + {corner,corner}, + } + }) + minetest.register_craft({ -- corner_2 -> slab + output = slab.." 3", + recipe = { + {corner_2,corner_2}, + {corner_2,corner_2}, + } + }) +----------------------------------------------------------------------------------------------- +-- Roof +----------------------------------------------------------------------------------------------- + minetest.register_craft({ -- block -> roof + output = roof.." 4", + recipe = { + {reed,""}, + {"",reed}, + } + }) + minetest.register_craft({ -- block -> roof + output = roof.." 4", + recipe = { + {"",reed}, + {reed,""}, + } + }) + minetest.register_craft({ -- slab -> roof + output = roof, + recipe = { + {slab}, + } + }) +----------------------------------------------------------------------------------------------- +-- Roof Corner +----------------------------------------------------------------------------------------------- + minetest.register_craft({ -- block -> corner + output = corner.." 8", + recipe = { + {"",reed,""}, + {reed,"",reed}, + } + }) + minetest.register_craft({ -- corner_2 -> corner + output = corner, + recipe = { + {corner_2}, + } + }) +----------------------------------------------------------------------------------------------- +-- Roof Corner 2 +----------------------------------------------------------------------------------------------- + minetest.register_craft({ -- block -> corner_2 + output = corner_2.." 8", + recipe = { + {reed,"",reed}, + {"",reed,""}, + } + }) + minetest.register_craft({ -- corner -> corner_2 + output = corner_2, + recipe = { + {corner}, + } + }) +end + +----------------------------------------------------------------------------------------------- +-- Reed +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- hay -> reed + output = "dryplants:reed 2", + recipe = { + {"dryplants:hay","dryplants:hay"}, + {"dryplants:hay","dryplants:hay"}, + } +}) +--cooking +minetest.register_craft({ -- wetreed -> reed + type = "cooking", + output = "dryplants:reed", + recipe = "dryplants:wetreed", + cooktime = 2, +}) +--fuel +minetest.register_craft({ + type = "fuel", + recipe = "dryplants:reed", + burntime = 4, +}) +----------------------------------------------------------------------------------------------- +-- Reed Slab +----------------------------------------------------------------------------------------------- +--cooking +minetest.register_craft({ -- wetreed_slab -> reed_slab + type = "cooking", + output = "dryplants:reed_slab", + recipe = "dryplants:wetreed_slab", + cooktime = 1, +}) +--fuel +minetest.register_craft({ + type = "fuel", + recipe = "dryplants:reed_slab", + burntime = 2, +}) +----------------------------------------------------------------------------------------------- +-- Reed Roof +----------------------------------------------------------------------------------------------- +--cooking +minetest.register_craft({ -- wetreed_roof -> reed_roof + type = "cooking", + output = "dryplants:reed_roof", + recipe = "dryplants:wetreed_roof", + cooktime = 1, +}) +--fuel +minetest.register_craft({ + type = "fuel", + recipe = "dryplants:reed_roof", + burntime = 2, +}) +----------------------------------------------------------------------------------------------- +-- Reed Roof Corner +----------------------------------------------------------------------------------------------- +--cooking +minetest.register_craft({ -- wetreed_roof_corner -> reed_roof_corner + type = "cooking", + output = "dryplants:reed_roof_corner", + recipe = "dryplants:wetreed_roof_corner", + cooktime = 1, +}) +--fuel +minetest.register_craft({ + type = "fuel", + recipe = "dryplants:reed_roof_corner", + burntime = 2, +}) +----------------------------------------------------------------------------------------------- +-- Wet Reed Roof Corner 2 +----------------------------------------------------------------------------------------------- +--cooking +minetest.register_craft({ -- wetreed_roof_corner -> reed_roof_corner + type = "cooking", + output = "dryplants:reed_roof_corner_2", + recipe = "dryplants:wetreed_roof_corner_2", + cooktime = 1, +}) +--fuel +minetest.register_craft({ + type = "fuel", + recipe = "dryplants:reed_roof_corner_2", + burntime = 2, +}) +----------------------------------------------------------------------------------------------- +-- Dandelion Leave +----------------------------------------------------------------------------------------------- +--[[minetest.register_craftitem("dryplants:dandelion_leave", { + description = "Dandelion Leave", + inventory_image = "dryplants_dandelion_leave.png", + on_use = minetest.item_eat(1), +}) +minetest.register_craft({ + type = "shapeless", + output = "dryplants:dandelion_leave 4", + recipe = {"flowers:dandelion_yellow"}, + replacements = { + {"flowers:dandelion_yellow", "dye:yellow"} + }, +})]] diff --git a/mods/plantlife_modpack/dryplants/init.lua b/mods/plantlife_modpack/dryplants/init.lua new file mode 100644 index 0000000..46b3607 --- /dev/null +++ b/mods/plantlife_modpack/dryplants/init.lua @@ -0,0 +1,187 @@ +-- support for i18n +local S = minetest.get_translator("dryplants") + +abstract_dryplants = {} + +dofile(minetest.get_modpath("dryplants").."/crafting.lua") +dofile(minetest.get_modpath("dryplants").."/reed.lua") + +dofile(minetest.get_modpath("dryplants").."/reedmace.lua") +dofile(minetest.get_modpath("dryplants").."/juncus.lua") +dofile(minetest.get_modpath("dryplants").."/moregrass.lua") + +--dofile(minetest.get_modpath("dryplants").."/meadowvariation.lua") + +----------------------------------------------------------------------------------------------- +-- Sickle +----------------------------------------------------------------------------------------------- +local function sickle_can_break(pos, deff, player) + local def = ItemStack({name=deff.name}):get_definition() + + if not def.diggable or (def.can_dig and not def.can_dig(pos,player)) then + minetest.log("info", player:get_player_name() .. " tried to sickle " + .. def.name .. " which is not diggable " + .. minetest.pos_to_string(pos)) + return + end + + if minetest.is_protected(pos, player:get_player_name()) then + minetest.log("action", player:get_player_name() + .. " tried to sickle " .. def.name + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + + return true +end +-- turns nodes with group flora=1 & flower=0 into cut grass +local function sickle_on_use(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local above_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(above_pos) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + if not sickle_can_break(pt.under, under, user) then + return + end + -- check if something that can be cut using fine tools + if minetest.get_item_group(under.name, "snappy") > 0 then + -- check if flora but no flower + if minetest.get_item_group(under.name, "flora") == 1 and minetest.get_item_group(under.name, "flower") == 0 then + -- turn the node into cut grass, wear out item and play sound + minetest.swap_node(pt.under, {name="dryplants:grass"}) + else -- otherwise dig the node + if not minetest.node_dig(pt.under, under, user) then + return + end + end + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.5, + }) + itemstack:add_wear(65535/(uses-1)) + return itemstack + elseif string.find(under.name, "default:dirt_with_grass") then + if minetest.is_protected(above_pos, user:get_player_name()) or above.name ~= "air" then + return + end + minetest.swap_node(pt.under, {name="dryplants:grass_short"}) + minetest.swap_node(above_pos, {name="dryplants:grass"}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.5, + }) + itemstack:add_wear(65535/(uses-1)) + return itemstack + end +end +-- the tool +minetest.register_tool("dryplants:sickle", { + description = S("Sickle"), + inventory_image = "dryplants_sickle.png", + on_use = function(itemstack, user, pointed_thing) + return sickle_on_use(itemstack, user, pointed_thing, 220) + end, +}) + +----------------------------------------------------------------------------------------------- +-- Cut Grass +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:grass", { + description = S("Cut Grass"), + inventory_image = "dryplants_grass.png", + wield_image = "dryplants_grass.png", + paramtype = "light", + sunlight_propagates = true, + tiles = {"dryplants_grass.png"}, + use_texture_alpha = "clip", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.5 , -0.5 , -0.5 , 0.5 , -0.4375, 0.5 }, + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Cut Grass becomes Hay over time +----------------------------------------------------------------------------------------------- +minetest.register_abm({ + nodenames = {"dryplants:grass"}, + interval = 3600, --1200, -- 20 minutes: a minetest-day/night-cycle + chance = 1, + action = function(pos) + minetest.swap_node(pos, {name="dryplants:hay"}) + end, +}) + +----------------------------------------------------------------------------------------------- +-- Hay +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:hay", { + description = S("Hay"), + inventory_image = "dryplants_hay.png", + wield_image = "dryplants_hay.png", + paramtype = "light", + sunlight_propagates = true, + tiles = {"dryplants_hay.png"}, + use_texture_alpha = "clip", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.5 , -0.5 , -0.5 , 0.5 , -0.4375, 0.5 }, + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Short Grass +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:grass_short", { + description = S("Short Grass"), + tiles = {"default_grass.png^dryplants_grass_short.png", "default_dirt.png", "default_dirt.png^default_grass_side.png^dryplants_grass_short_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, + --drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), +}) + +----------------------------------------------------------------------------------------------- +-- Short Grass becomes Dirt with Grass over time +----------------------------------------------------------------------------------------------- +minetest.register_abm({ + nodenames = {"dryplants:grass_short"}, + interval = 1200, --1200, -- 20 minutes: a minetest-day/night-cycle + chance = 100/1200, + action = function(pos) + -- Only become dirt with grass if no cut grass or hay lies on top + local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) + if above.name ~= "dryplants:grass" and above.name ~= "dryplants:hay" then + minetest.swap_node(pos, {name="default:dirt_with_grass"}) + end + end, +}) diff --git a/mods/plantlife_modpack/dryplants/juncus.lua b/mods/plantlife_modpack/dryplants/juncus.lua new file mode 100644 index 0000000..4a73861 --- /dev/null +++ b/mods/plantlife_modpack/dryplants/juncus.lua @@ -0,0 +1,156 @@ +-- support for i18n +local S = minetest.get_translator("dryplants") + +local function grow_juncus(pos) + local juncus_type = math.random(2,3) + local right_here = {x=pos.x, y=pos.y+1, z=pos.z} + + local nodename = minetest.get_node(right_here).name + if nodename == "air" or nodename == "default:junglegrass" then + if juncus_type == 2 then + minetest.swap_node(right_here, {name="dryplants:juncus_02"}) + else + minetest.swap_node(right_here, {name="dryplants:juncus"}) + end + end +end + +minetest.register_node("dryplants:juncus", { + description = S("Juncus"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"dryplants_juncus_03.png"}, + inventory_image = "dryplants_juncus_inv.png", + walkable = false, + buildable_to = true, + groups = { + snappy=3, + flammable=2, + attached_node=1, + flora=1 + --not_in_creative_inventory=1 + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, + on_place = function(itemstack, placer, pointed_thing) + if not itemstack or not placer or not pointed_thing then + return + end + + local playername = placer:get_player_name() + if minetest.is_protected(pointed_thing.above, playername) or + minetest.is_protected(pointed_thing.under, playername) then + minetest.chat_send_player(playername, "Someone else owns that spot.") + return + end + local pos = pointed_thing.under + local juncus_type = math.random(2,3) + local right_here = {x=pos.x, y=pos.y+1, z=pos.z} + if juncus_type == 2 then + minetest.swap_node(right_here, {name="dryplants:juncus_02"}) + else + minetest.swap_node(right_here, {name="dryplants:juncus"}) + end + if not minetest.is_creative_enabled(playername) then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_node("dryplants:juncus_02", { + description = S("Juncus"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"dryplants_juncus_02.png"}, + walkable = false, + buildable_to = true, + groups = { + snappy=3, + flammable=2, + attached_node=1, + flora=1, + not_in_creative_inventory=1 + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, + drop = "dryplants:juncus", +}) +----------------------------------------------------------------------------------------------- +-- GENERATE SMALL JUNCUS +----------------------------------------------------------------------------------------------- +-- near water or swamp +minetest.register_decoration({ + name = "dryplants:juncus_water", + decoration = {"air"}, + fill_ratio = 0.16, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source", + "sumpf:sumpf" + }, + check_offset = -1, + num_spawn_by = 1 +}) + +-- at dunes/beach +minetest.register_decoration({ + name = "dryplants:juncus_beach", + decoration = {"air"}, + fill_ratio = 0.08, + y_min = 1, + y_max = 40, + place_on = { + "default:sand", + }, + deco_type = "simple", + flags = "all_floors", + spawn_by = {"default:dirt_with_grass"}, + check_offset = -1, + num_spawn_by = 1 +}) + +local did, did2 +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("dryplants:juncus_water") + did2 = minetest.get_decoration_id("dryplants:juncus_beach") + minetest.set_gen_notify("decoration", {did, did2}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations_1 = g["decoration#" .. did] or {} + local deco_locations_2 = g["decoration#" .. did2] or {} + + for _, pos in pairs(deco_locations_1) do + locations[#locations+1] = pos + end + for _, pos in pairs(deco_locations_2) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_juncus(pos) + end +end) \ No newline at end of file diff --git a/mods/plantlife_modpack/dryplants/locale/dryplants.de.tr b/mods/plantlife_modpack/dryplants/locale/dryplants.de.tr new file mode 100644 index 0000000..9558c58 --- /dev/null +++ b/mods/plantlife_modpack/dryplants/locale/dryplants.de.tr @@ -0,0 +1,21 @@ +# textdomain: dryplants +Sickle=Sichel +Cut Grass=Grasschnitt +Hay=Heu +Short Grass=Kurzes Gras +Juncus=Binsen +Wet Reed=Nasses Schilf +Wet Reed Slab=Nasse Schilfplatte +Wet Reed Roof=Nasses Schilfdach +Wet Reed Roof Corner 1=Nasser Schilfdachwinkel 1 +Wet Reed Roof Corner 2=Nasser Schilfdachwinkel 2 +Reed=Schilf +Reed Slab=Schilfstufe +Reed Roof=Schilfdach +Reed Roof Corner 1=Schilfdachwinkel 1 +Reed Roof Corner 2=Schilfdachwinkel +Reedmace=Rohrkolben +Reedmace, height: 1=Rohrkolben, Höhe: 1 +Reedmace, height: 2=Rohrkolben, Höhe: 2 +Reedmace, height: 3=Rohrkolben, Höhe: 3 +Reedmace, height: 3 & Spikes=Rohrkolben, Höhe: 3 & Rispe diff --git a/mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr b/mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr new file mode 100644 index 0000000..afa0c0b --- /dev/null +++ b/mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr @@ -0,0 +1,21 @@ +# textdomain: dryplants +Sickle= +Cut Grass=Tranĉita Herbenon +Hay=Fojno +Short Grass=Mallonga Herbo +Juncus=Junko +Wet Reed=Malseka Kano +Wet Reed Slab=Slabo de Malseka Kano +Wet Reed Roof=Tegmento de Malseka Kano +Wet Reed Roof Corner 1=Tegmentangulo 1 de Malseka Kano +Wet Reed Roof Corner 2=Tegmentangulo 2 de Malseka Kano +Reed=Kano +Reed Slab=Slabo de Kano +Reed Roof=Tegmento de Kano +Reed Roof Corner 1=Tegmentangulo 1 de Kano +Reed Roof Corner 2=Tegmentangulo 2 de Kano +Reedmace=Tifeo +Reedmace, height: 1=Tifeo, alteco: 1 +Reedmace, height: 2=Tifeo, alteco: 2 +Reedmace, height: 3=Tifeo, alteco: 3 +Reedmace, height: 3 & Spikes=Tifeo, alteco: 3 & Pikiloj diff --git a/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr b/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr new file mode 100644 index 0000000..b2a102f --- /dev/null +++ b/mods/plantlife_modpack/dryplants/locale/dryplants.fr.tr @@ -0,0 +1,21 @@ +# textdomain: dryplants +Sickle=Faucille +Cut Grass=Herbe coupée +Hay=Foin +Short Grass=Herbes courtes +Juncus=Joncs +Wet Reed=Bloc de roseau humide +Wet Reed Slab=Dalle en roseau humide +Wet Reed Roof=Toit en roseau humide +Wet Reed Roof Corner 1=Angle de toit en roseau humide 1 +Wet Reed Roof Corner 2=Angle de toit en roseau humide 2 +Reed=Roseau +Reed Slab=Dalle en roseau +Reed Roof=Toit en roseau +Reed Roof Corner 1=Angle de toit en roseau 1 +Reed Roof Corner 2=Angle de toit en roseau 2 +Reedmace=Roseau +Reedmace, height: 1=Roseau, 1 de hauteur +Reedmace, height: 2=Roseau, 2 de hauteur +Reedmace, height: 3=Roseau, 3 de hauteur +Reedmace, height: 3 & Spikes=Roseau, 3 de hauteur avec panicules diff --git a/mods/plantlife_modpack/dryplants/locale/template.txt b/mods/plantlife_modpack/dryplants/locale/template.txt new file mode 100644 index 0000000..a14ca62 --- /dev/null +++ b/mods/plantlife_modpack/dryplants/locale/template.txt @@ -0,0 +1,21 @@ +# textdomain: dryplants +Sickle= +Cut Grass= +Hay= +Short Grass= +Juncus= +Wet Reed= +Wet Reed Slab= +Wet Reed Roof= +Wet Reed Roof Corner 1= +Wet Reed Roof Corner 2= +Reed= +Reed Slab= +Reed Roof= +Reed Roof Corner 1= +Reed Roof Corner 2= +Reedmace= +Reedmace, height: 1= +Reedmace, height: 2= +Reedmace, height: 3= +Reedmace, height: 3 & Spikes= diff --git a/mods/plantlife_modpack/dryplants/meadowvariation.lua b/mods/plantlife_modpack/dryplants/meadowvariation.lua new file mode 100644 index 0000000..c9ebf1c --- /dev/null +++ b/mods/plantlife_modpack/dryplants/meadowvariation.lua @@ -0,0 +1,12 @@ +-- @reviewer: couldn't even find using biome_lib +minetest.register_decoration({ + decoration = {"dryplants:grass_short"}, + fill_ratio = 0.8, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + }, + deco_type = "simple", + flags = "all_floors" +}) diff --git a/mods/plantlife_modpack/dryplants/mod.conf b/mods/plantlife_modpack/dryplants/mod.conf new file mode 100644 index 0000000..e42d8ab --- /dev/null +++ b/mods/plantlife_modpack/dryplants/mod.conf @@ -0,0 +1,3 @@ +name = dryplants +depends = default +optional_depends = farming, ebiomes diff --git a/mods/plantlife_modpack/dryplants/models/plantlike.obj b/mods/plantlife_modpack/dryplants/models/plantlike.obj new file mode 100644 index 0000000..4b38d39 --- /dev/null +++ b/mods/plantlife_modpack/dryplants/models/plantlike.obj @@ -0,0 +1,28 @@ +# Blender v2.73 (sub 0) OBJ File: '' +# www.blender.org +o Cylinder +v 0.359670 -0.500000 0.347329 +v 0.359670 0.500000 0.347329 +v -0.359670 -0.500000 -0.347329 +v -0.359670 0.500000 -0.347329 +v 0.347329 0.500000 -0.359670 +v 0.347329 -0.500000 -0.359670 +v -0.347329 0.500000 0.359670 +v -0.347329 -0.500000 0.359670 +v 0.359670 -0.500000 0.347329 +v 0.359670 0.500000 0.347329 +v -0.359670 -0.500000 -0.347329 +v -0.359670 0.500000 -0.347329 +v 0.347329 0.500000 -0.359670 +v 0.347329 -0.500000 -0.359670 +v -0.347329 0.500000 0.359670 +v -0.347329 -0.500000 0.359670 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +s off +f 1/1 2/2 4/3 3/4 +f 8/1 7/2 5/3 6/4 +f 9/1 11/4 12/3 10/2 +f 16/1 14/4 13/3 15/2 diff --git a/mods/plantlife_modpack/dryplants/moregrass.lua b/mods/plantlife_modpack/dryplants/moregrass.lua new file mode 100644 index 0000000..5e27a9c --- /dev/null +++ b/mods/plantlife_modpack/dryplants/moregrass.lua @@ -0,0 +1,20 @@ +minetest.register_decoration({ + decoration = { + "default:grass_1", + "default:grass_2", + "default:grass_3", + "default:grass_4", + "default:grass_5" + }, + fill_ratio = 0.8, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors" +}) diff --git a/mods/plantlife_modpack/dryplants/reed.lua b/mods/plantlife_modpack/dryplants/reed.lua new file mode 100644 index 0000000..a15ee0a --- /dev/null +++ b/mods/plantlife_modpack/dryplants/reed.lua @@ -0,0 +1,385 @@ +----------------------------------------------------------------------------------------------- +-- Dry Plants - Reed 0.0.5 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Looked at code from: darkage, default, stairs +-- Dependencies: default +----------------------------------------------------------------------------------------------- +-- support for i18n +local S = minetest.get_translator("dryplants") + +minetest.register_alias("stairs:stair_wetreed", "dryplants:wetreed_roof") +minetest.register_alias("stairs:slab_wetreed", "dryplants:wetreed_slab") +minetest.register_alias("stairs:stair_reed", "dryplants:reed_roof") +minetest.register_alias("stairs:slab_reed", "dryplants:reed_slab") + + +----------------------------------------------------------------------------------------------- +-- Wet Reed +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:wetreed", { + description = S("Wet Reed"), + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed_wet.png"}, + groups = {snappy=3, flammable=2}, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Wet Reed Slab +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:wetreed_slab", { + description = S("Wet Reed Slab"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed_wet.png"}, + node_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Wet Reed Roof +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:wetreed_roof", { + description = S("Wet Reed Roof"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed_wet.png"}, + node_box = { + type = "fixed", +-- { left , bottom , front , right , top , back } + fixed = { + {-1/2, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, -1/2, -1/2, 1/2, 0, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, -1/2, -1/2, 1/2, 0, 0}, + } + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +local CoRNeR = { +-- MaTeRiaL + {"wetreed"}, + {"reed"} +} + +for i in pairs(CoRNeR) do + + local MaTeRiaL = CoRNeR[i][1] + local roof = "dryplants:"..MaTeRiaL.."_roof" + local corner = "dryplants:"..MaTeRiaL.."_roof_corner" + local corner_2 = "dryplants:"..MaTeRiaL.."_roof_corner_2" + + minetest.register_abm({ + nodenames = {roof}, + interval = 1, + chance = 1, + action = function(pos) + + local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }) + local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }) + local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) + local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) + -- corner 1 + if ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner, param2=0}) + end + + if ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner, param2=1}) + end + + if ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner, param2=2}) + end + + if ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner, param2=3}) + end + -- corner 2 + if ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner_2 and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner_2 and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner_2, param2=0}) + end + + if ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner_2 and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner_2 and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner_2, param2=1}) + end + + if ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner_2 and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner_2 and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner_2, param2=2}) + end + + if ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner_2 and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner_2 and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner_2, param2=3}) + end + + end, + }) +end + +----------------------------------------------------------------------------------------------- +-- Wet Reed Roof Corner 1 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:wetreed_roof_corner", { + description = S("Wet Reed Roof Corner 1"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed_wet.png"}, + node_box = { + type = "fixed", +-- { left , bottom , front , right , top , back } + fixed = { + {-1/2, 0, 0, 0, 1/2, 1/2}, + {0, -1/2, 0, 1/2, 0, 1/2}, + {-1/2, -1/2, -1/2, 0, 0, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, 0, 0, 0, 1/2, 1/2}, + {0, -1/2, 0, 1/2, 0, 1/2}, + {-1/2, -1/2, -1/2, 0, 0, 0}, + } + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Wet Reed Roof Corner 2 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:wetreed_roof_corner_2", { + description = S("Wet Reed Roof Corner 2"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed_wet.png"}, + node_box = { + type = "fixed", +-- { left , bottom , front , right , top , back } + fixed = { + {-1/2, -1/2, 0, 0, 0, 1/2}, + {0, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, 0, -1/2, 0, 1/2, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, -1/2, 0, 0, 0, 1/2}, + {0, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, 0, -1/2, 0, 1/2, 0}, + } + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Wet Reed becomes (dry) Reed over time +----------------------------------------------------------------------------------------------- +local DRyiNG = { +-- WeT DRy + {"dryplants:wetreed", "dryplants:reed"}, + {"dryplants:wetreed_slab", "dryplants:reed_slab"}, + {"dryplants:wetreed_roof", "dryplants:reed_roof"}, + {"dryplants:wetreed_roof_corner", "dryplants:reed_roof_corner"}, + {"dryplants:wetreed_roof_corner_2", "dryplants:reed_roof_corner_2"} +} +for i in pairs(DRyiNG) do + + local WeT = DRyiNG[i][1] + local DRy = DRyiNG[i][2] + + minetest.register_abm({ + nodenames = {WeT}, + interval = 3600, --1200, -- 20 minutes: a minetest-day/night-cycle + chance = 1, + action = function(pos) + local direction = minetest.get_node(pos).param2 + minetest.swap_node(pos, {name=DRy, param2=direction}) + end, + }) +end + +----------------------------------------------------------------------------------------------- +-- Reed +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reed", { + description = S("Reed"), + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed.png"}, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Reed Slab +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reed_slab", { + description = S("Reed Slab"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed.png"}, + node_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Reed Roof +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reed_roof", { + description = S("Reed Roof"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed.png"}, + node_box = { + type = "fixed", +-- { left , bottom , front , right , top , back } + fixed = { + {-1/2, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, -1/2, -1/2, 1/2, 0, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, -1/2, -1/2, 1/2, 0, 0}, + } + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Reed Roof Corner 1 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reed_roof_corner", { + description = S("Reed Roof Corner 1"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed.png"}, + node_box = { + type = "fixed", +-- { left , bottom , front , right , top , back } + fixed = { + {-1/2, 0, 0, 0, 1/2, 1/2}, + {0, -1/2, 0, 1/2, 0, 1/2}, + {-1/2, -1/2, -1/2, 0, 0, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, 0, 0, 0, 1/2, 1/2}, + {0, -1/2, 0, 1/2, 0, 1/2}, + {-1/2, -1/2, -1/2, 0, 0, 0}, + } + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- Reed Roof Corner 2 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reed_roof_corner_2", { + description = S("Reed Roof Corner 2"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"dryplants_reed.png"}, + node_box = { + type = "fixed", +-- { left , bottom , front , right , top , back } + fixed = { + {-1/2, -1/2, 0, 0, 0, 1/2}, + {0, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, 0, -1/2, 0, 1/2, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, -1/2, 0, 0, 0, 1/2}, + {0, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, 0, -1/2, 0, 1/2, 0}, + } + }, + groups = {snappy=3, flammable=2}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) diff --git a/mods/plantlife_modpack/dryplants/reedmace.lua b/mods/plantlife_modpack/dryplants/reedmace.lua new file mode 100644 index 0000000..483072e --- /dev/null +++ b/mods/plantlife_modpack/dryplants/reedmace.lua @@ -0,0 +1,448 @@ +-- NOTES (from wikipedia, some of this might get implemented) +-- rhizomes are edible +-- outer portion of young plants can be peeled and the heart can be eaten raw or boiled and eaten like asparagus +-- leaf bases can be eaten raw or cooked +-- sheath can be removed from the developing green flower spike, which can then be boiled and eaten like corn on the cob +-- pollen can be collected and used as a flour supplement or thickener +-- Typha stems and leaves can be used to make paper +-- The seed hairs were used by some Native American groups as tinder for starting fires + +-- support for i18n +local S = minetest.get_translator("dryplants") + +----------------------------------------------------------------------------------------------- +-- REEDMACE SHAPES +----------------------------------------------------------------------------------------------- + +local function grow_reedmace(pos) + local size = math.random(1,3) + local spikes = math.random(1,3) + local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_02 = {x = pos.x, y = pos.y + 2, z = pos.z} + local pos_03 = {x = pos.x, y = pos.y + 3, z = pos.z} + + local nodename = minetest.get_node(pos_01).name + if nodename == "air" -- bug fix + or nodename == "dryplants:reedmace_sapling" then + if minetest.get_node(pos_02).name ~= "air" then + minetest.swap_node(pos_01, {name="dryplants:reedmace_top"}) + elseif minetest.get_node(pos_03).name ~= "air" then + minetest.swap_node(pos_01, {name="dryplants:reedmace_height_2"}) + elseif size == 1 then + minetest.swap_node(pos_01, {name="dryplants:reedmace_top"}) + elseif size == 2 then + minetest.swap_node(pos_01, {name="dryplants:reedmace_height_2"}) + elseif size == 3 then + if spikes == 1 then + minetest.swap_node(pos_01, {name="dryplants:reedmace_height_3_spikes"}) + else + minetest.swap_node(pos_01, {name="dryplants:reedmace_height_3"}) + end + end + end +end + +local function grow_reedmace_water(pos) + local size = math.random(1,3) + local spikes = math.random(1,3) + local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z} + local pos_02 = {x = pos.x, y = pos.y + 2, z = pos.z} + local pos_03 = {x = pos.x, y = pos.y + 3, z = pos.z} + local pos_04 = {x = pos.x, y = pos.y + 4, z = pos.z} + + minetest.add_entity(pos_01, "dryplants:reedmace_water_entity") + + if minetest.get_node(pos_02).name == "air" then -- bug fix + if minetest.get_node(pos_03).name ~= "air" then + minetest.swap_node(pos_02, {name="dryplants:reedmace_top"}) + elseif minetest.get_node(pos_04).name ~= "air" then + minetest.swap_node(pos_02, {name="dryplants:reedmace_height_2"}) + elseif size == 1 then + minetest.swap_node(pos_02, {name="dryplants:reedmace_top"}) + elseif size == 2 then + minetest.swap_node(pos_02, {name="dryplants:reedmace_height_2"}) + elseif size == 3 then + if spikes == 1 then + minetest.swap_node(pos_02, {name="dryplants:reedmace_height_3_spikes"}) + else + minetest.swap_node(pos_02, {name="dryplants:reedmace_height_3"}) + end + end + end +end + +abstract_dryplants.grow_reedmace = grow_reedmace -- compatibility + +----------------------------------------------------------------------------------------------- +-- REEDMACE SPIKES +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_spikes", { + description = S("Reedmace"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"dryplants_reedmace_spikes.png"}, + inventory_image = "dryplants_reedmace_spikes.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE height: 1 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_top", { + description = S("Reedmace, height: 1"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"dryplants_reedmace_top.png"}, + inventory_image = "dryplants_reedmace_top.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE height: 2 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_height_2", { + description = S("Reedmace, height: 2"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"dryplants_reedmace_height_2.png"}, + inventory_image = "dryplants_reedmace_top.png", + walkable = false, + groups = { + snappy=3, + flammable=2--, + --not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE height: 3 +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_height_3", { + description = S("Reedmace, height: 3"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"dryplants_reedmace_height_3.png"}, + inventory_image = "dryplants_reedmace_top.png", + walkable = false, + groups = { + snappy=3, + flammable=2--, + --not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE height: 3 & Spikes +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_height_3_spikes", { + description = S("Reedmace, height: 3 & Spikes"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"dryplants_reedmace_height_3_spikes.png"}, + inventory_image = "dryplants_reedmace_top.png", + walkable = false, + groups = { + snappy=3, + flammable=2--, + --not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE STEMS +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace", { + description = S("Reedmace"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"dryplants_reedmace.png"}, + inventory_image = "dryplants_reedmace.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + after_destruct = function(pos,oldnode) + local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if node.name == "dryplants:reedmace_top" + or node.name == "dryplants:reedmace_spikes" then + minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z}) + minetest.add_item(pos,"dryplants:reedmace_sapling") + end + end, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE BOTTOM +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_bottom", { + description = S("Reedmace"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"dryplants_reedmace_bottom.png"}, + inventory_image = "dryplants_reedmace_bottom.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = 'dryplants:reedmace_sapling', + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + after_destruct = function(pos,oldnode) + local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if node.name == "dryplants:reedmace" + or node.name == "dryplants:reedmace_top" + or node.name == "dryplants:reedmace_spikes" then + minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z}) + minetest.add_item(pos,"dryplants:reedmace_sapling") + end + end, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE "SAPLING" (the drop from the above) +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_sapling", { + description = S("Reedmace"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"dryplants_reedmace_sapling.png"}, + inventory_image = "dryplants_reedmace_sapling.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + attached_node=1, + sapling=1, + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +-- abm +minetest.register_abm({ + nodenames = "dryplants:reedmace_sapling", + interval = 600, + chance = 100/5, + action = function(pos, node, _, _) + if string.find(minetest.get_node({x = pos.x + 1, y = pos.y, z = pos.z }).name, "default:water") + or string.find(minetest.get_node({x = pos.x, y = pos.y, z = pos.z + 1}).name, "default:water") + or string.find(minetest.get_node({x = pos.x - 1, y = pos.y, z = pos.z }).name, "default:water") + or string.find(minetest.get_node({x = pos.x, y = pos.y, z = pos.z - 1}).name, "default:water") then + if minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name == "air" then + grow_reedmace_water({x = pos.x, y = pos.y - 1, z = pos.z}) + end + minetest.swap_node({x=pos.x, y=pos.y, z=pos.z}, {name="default:water_source"}) + else + grow_reedmace({x = pos.x, y = pos.y - 1, z = pos.z}) + end + end +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE WATER (for entity) +----------------------------------------------------------------------------------------------- +minetest.register_node("dryplants:reedmace_water", { + description = S("Reedmace"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"dryplants_reedmace_water.png"}, + inventory_image = "dryplants_reedmace_water.png", + groups = {not_in_creative_inventory=1}, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, +}) +----------------------------------------------------------------------------------------------- +-- REEDMACE WATER ENTITY +----------------------------------------------------------------------------------------------- +minetest.register_entity("dryplants:reedmace_water_entity",{ + visual = "mesh", + mesh = "plantlike.obj", + visual_size = {x=10, y=10}, + textures = {"dryplants_reedmace_water.png"}, + collisionbox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}, + on_punch = function(self, puncher) + if puncher:is_player() and puncher:get_inventory() then + if not minetest.is_creative_enabled(puncher:get_player_name()) then + puncher:get_inventory():add_item("main", "dryplants:reedmace_sapling") + end + self.object:remove() + end + end, +}) +----------------------------------------------------------------------------------------------- +-- GENERATE REEDMACE +----------------------------------------------------------------------------------------------- +-- near water or swamp +minetest.register_decoration({ + name = "dryplants:reedmace_swamp", + decoration = {"air"}, + fill_ratio = "0.05", + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass", + "default:desert_sand", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source", + "sumpf:sumpf" + }, + check_offset = -1, + num_spawn_by = 1 +}) + +-- in water +minetest.register_decoration({ + name = "dryplants:reedmace_water", + decoration = {"air"}, + fill_ratio = "0.01", + y_min = 0, + y_max = 0, + place_on = { + "default:dirt", + "default:dirt_with_grass", + "stoneage:sand_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source" + }, + check_offset = -1, + num_spawn_by = 1 +}) + +-- for oases & tropical beaches & tropical swamps +minetest.register_decoration({ + name = "dryplants:reedmace_beach", + decoration = {"air"}, + fill_ratio = "0.05", + y_min = 1, + y_max = 40, + place_on = { + "default:sand", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", + spawn_by = { + "default:water_source", + "sumpf:dirtywater_source", + "sumpf:sumpf", + "default:desert_sand" + }, + check_offset = -1, + num_spawn_by = 1 +}) + +local did, did2, did3 +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("dryplants:reedmace_swamp") + did2 = minetest.get_decoration_id("dryplants:reedmace_water") + did3 = minetest.get_decoration_id("dryplants:reedmace_beach") + minetest.set_gen_notify("decoration", {did, did2, did3}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations_1 = g["decoration#" .. did] or {} + local deco_locations_3 = g["decoration#" .. did3] or {} + + for _, pos in pairs(deco_locations_1) do + locations[#locations+1] = pos + end + for _, pos in pairs(deco_locations_3) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_reedmace(pos) + end +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations_2 = g["decoration#" .. did2] or {} + + for _, pos in pairs(deco_locations_2) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + grow_reedmace_water(pos) + end +end) diff --git a/mods/plantlife_modpack/dryplants/textures/default_grass_1.png b/mods/plantlife_modpack/dryplants/textures/default_grass_1.png new file mode 100644 index 0000000..8820e7e Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/default_grass_1.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/default_grass_2.png b/mods/plantlife_modpack/dryplants/textures/default_grass_2.png new file mode 100644 index 0000000..9929548 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/default_grass_2.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/default_grass_3.png b/mods/plantlife_modpack/dryplants/textures/default_grass_3.png new file mode 100644 index 0000000..4d62f69 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/default_grass_3.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/default_grass_4.png b/mods/plantlife_modpack/dryplants/textures/default_grass_4.png new file mode 100644 index 0000000..8ad76c5 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/default_grass_4.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/default_grass_5.png b/mods/plantlife_modpack/dryplants/textures/default_grass_5.png new file mode 100644 index 0000000..799b0fd Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/default_grass_5.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_grass.png b/mods/plantlife_modpack/dryplants/textures/dryplants_grass.png new file mode 100644 index 0000000..cbd276e Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_grass.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_grass_short.png b/mods/plantlife_modpack/dryplants/textures/dryplants_grass_short.png new file mode 100644 index 0000000..30553aa Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_grass_short.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_grass_short_side.png b/mods/plantlife_modpack/dryplants/textures/dryplants_grass_short_side.png new file mode 100644 index 0000000..bc27507 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_grass_short_side.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_hay.png b/mods/plantlife_modpack/dryplants/textures/dryplants_hay.png new file mode 100644 index 0000000..600c508 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_hay.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_02.png b/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_02.png new file mode 100644 index 0000000..2e4f840 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_02.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_03.png b/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_03.png new file mode 100644 index 0000000..ff3d9c5 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_03.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_inv.png b/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_inv.png new file mode 100644 index 0000000..d5b9dca Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_juncus_inv.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reed.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reed.png new file mode 100644 index 0000000..b350a78 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reed.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reed_wet.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reed_wet.png new file mode 100644 index 0000000..cd4488a Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reed_wet.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace.png new file mode 100644 index 0000000..d14686f Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_bottom.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_bottom.png new file mode 100644 index 0000000..d83c36d Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_bottom.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_2.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_2.png new file mode 100644 index 0000000..4ac816a Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_2.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_3.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_3.png new file mode 100644 index 0000000..5cbd8d8 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_3.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_3_spikes.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_3_spikes.png new file mode 100644 index 0000000..16a29b3 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_height_3_spikes.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_sapling.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_sapling.png new file mode 100644 index 0000000..04b8c1f Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_sapling.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_spikes.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_spikes.png new file mode 100644 index 0000000..4a23745 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_spikes.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_top.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_top.png new file mode 100644 index 0000000..8532ece Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_top.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_water.png b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_water.png new file mode 100644 index 0000000..3ebf93c Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_reedmace_water.png differ diff --git a/mods/plantlife_modpack/dryplants/textures/dryplants_sickle.png b/mods/plantlife_modpack/dryplants/textures/dryplants_sickle.png new file mode 100644 index 0000000..e496062 Binary files /dev/null and b/mods/plantlife_modpack/dryplants/textures/dryplants_sickle.png differ diff --git a/mods/plantlife_modpack/ferns/crafting.lua b/mods/plantlife_modpack/ferns/crafting.lua new file mode 100644 index 0000000..af2abba --- /dev/null +++ b/mods/plantlife_modpack/ferns/crafting.lua @@ -0,0 +1,81 @@ +-- support for i18n +local S = minetest.get_translator("ferns") +----------------------------------------------------------------------------------------------- +-- Ferns - Crafting 0.0.5 +----------------------------------------------------------------------------------------------- +-- (by Mossmanikin) +----------------------------------------------------------------------------------------------- + +local fern1 = minetest.registered_items["default:fern_1"] or false +fern1 = (fern1 and fern1.name) or "ferns:fern_01" + + +minetest.register_craft({ + type = "shapeless", + output = "ferns:fiddlehead 3", + recipe = {"ferns:fern_01"}, + replacements = { + {fern1, "ferns:ferntuber"} + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "ferns:fiddlehead 3", + recipe = {"ferns:tree_fern_leaves"}, + replacements = { + {"ferns:tree_fern_leaves", "ferns:sapling_tree_fern"} + }, +}) +----------------------------------------------------------------------------------------------- +-- FIDDLEHEAD +----------------------------------------------------------------------------------------------- +minetest.register_alias("archaeplantae:fiddlehead", "ferns:fiddlehead") + +minetest.register_craftitem("ferns:fiddlehead", { + description = S("Fiddlehead"), + inventory_image = "ferns_fiddlehead.png", + on_use = minetest.item_eat(-1), -- slightly poisonous when raw +}) +minetest.register_craft({ + type = "cooking", + output = "ferns:fiddlehead_roasted", + recipe = "ferns:fiddlehead", + cooktime = 1, +}) +minetest.register_craftitem("ferns:fiddlehead_roasted", { + description = S("Roasted Fiddlehead"), + inventory_image = "ferns_fiddlehead_roasted.png", + on_use = minetest.item_eat(1), -- edible when cooked +}) +----------------------------------------------------------------------------------------------- +-- FERN TUBER +----------------------------------------------------------------------------------------------- +minetest.register_alias("archaeplantae:ferntuber", "ferns:ferntuber") + +minetest.register_craftitem("ferns:ferntuber", { + description = S("Fern Tuber"), + inventory_image = "ferns_ferntuber.png", +}) +minetest.register_craft({ + type = "cooking", + output = "ferns:ferntuber_roasted", + recipe = "ferns:ferntuber", + cooktime = 3, +}) + +minetest.register_alias("archaeplantae:ferntuber_roasted", "ferns:ferntuber_roasted") + +minetest.register_craftitem("ferns:ferntuber_roasted", { + description = S("Roasted Fern Tuber"), + inventory_image = "ferns_ferntuber_roasted.png", + on_use = minetest.item_eat(3), +}) +----------------------------------------------------------------------------------------------- +-- HORSETAIL (EQUISETUM) --> GREEN DYE https://en.wikipedia.org/wiki/Equisetum +----------------------------------------------------------------------------------------------- +minetest.register_craft({ + type = "shapeless", + output = "dye:green", + recipe = {"group:horsetail"}, +}) diff --git a/mods/plantlife_modpack/ferns/fern.lua b/mods/plantlife_modpack/ferns/fern.lua new file mode 100644 index 0000000..5d9f007 --- /dev/null +++ b/mods/plantlife_modpack/ferns/fern.lua @@ -0,0 +1,109 @@ +----------------------------------------------------------------------------------------------- +-- Ferns - Fern 0.1.0 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: default, flowers, painting, trees +-- Supports: dryplants, stoneage, sumpf +----------------------------------------------------------------------------------------------- +-- some inspiration from here +-- https://en.wikipedia.org/wiki/Athyrium_yokoscense +-- http://www.mygarden.net.au/gardening/athyrium-yokoscense/3900/1 +----------------------------------------------------------------------------------------------- + +minetest.register_alias("ferns:fern_03", "default:fern_3") +minetest.register_alias("ferns:fern_02", "default:fern_2") +minetest.register_alias("ferns:fern_01", "default:fern_1") + +-- minetest-0.5: End +minetest.register_alias("archaeplantae:fern", "ferns:fern_03") +minetest.register_alias("archaeplantae:fern_mid", "ferns:fern_02") +minetest.register_alias("archaeplantae:fern_small", "ferns:fern_01") +minetest.register_alias("ferns:fern_04", "ferns:fern_02") -- for placing + +local nodenames = {} + +----------------------------------------------------------------------------------------------- +-- Init +----------------------------------------------------------------------------------------------- + +for i = 1, 3 do + nodenames[i] = "ferns:fern_"..string.format("%02d", i) +end + +----------------------------------------------------------------------------------------------- +-- Spawning +----------------------------------------------------------------------------------------------- + +minetest.register_decoration({ -- near trees (woodlands) + decoration = nodenames, + deco_type = "simple", + flags = "all_floors", + place_on = { + "default:dirt_with_grass", + "default:mossycobble", + "default:desert_sand", + "default:sand", + "default:jungletree", + "stoneage:grass_with_silex", + "sumpf:sumpf" + }, + y_min = 1, -- above sea level + param2 = 0, + param2_max = 179, + spawn_by = "group:tree", + num_spawn_by = 1, + fill_ratio = 0.1, +}) + +minetest.register_decoration({ -- near stone (mountains) + decoration = nodenames, + deco_type = "simple", + flags = "all_floors", + place_on = { + "default:dirt_with_grass", + "default:mossycobble", + "group:falling_node", + --"default:jungletree", + "stoneage:grass_with_silex", + "sumpf:sumpf" + }, + y_min = 1, -- above sea level + param2 = 0, + param2_max = 179, + spawn_by = "group:stone", + num_spawn_by = 1, + fill_ratio = 0.3, +}) + +minetest.register_decoration({ -- near stone (mountains) + decoration = nodenames, + deco_type = "simple", + flags = "all_floors", + place_on = { + "default:dirt_with_grass", + "default:mossycobble", + "default:stone_with_coal", + "default:stone_with_iron", + "default:stone_with_tin", + "moreores:mineral_tin", + "moreores:mineral_silver", + "sumpf:sumpf" + }, + y_min = 1, -- above sea level + param2 = 0, + param2_max = 179, + spawn_by = { + "default:stone_with_iron", + --"default:stone_with_copper", + --"default:stone_with_mese", + --"default:stone_with_gold", + --"default:stone_with_diamond", + "default:stone_with_tin", + "moreores:mineral_tin", + "moreores:mineral_silver" + --"moreores:mineral_mithril" + }, + num_spawn_by = 1, + fill_ratio = 0.8, +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/ferns/gianttreefern.lua b/mods/plantlife_modpack/ferns/gianttreefern.lua new file mode 100644 index 0000000..5ccf8be --- /dev/null +++ b/mods/plantlife_modpack/ferns/gianttreefern.lua @@ -0,0 +1,353 @@ +----------------------------------------------------------------------------------------------- +-- Ferns - Giant Tree Fern 0.1.1 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: 4seasons, default +-- Supports: vines +----------------------------------------------------------------------------------------------- + +-- support for i18n +local S = minetest.get_translator("ferns") +-- lot of code, lot to load + +function abstract_ferns.can_grow_giant_tree_fern(pos) + local node_name = minetest.get_node(pos).name + if node_name ~= "air" and node_name ~= "ferns:sapling_giant_tree_fern" and node_name ~= "default:junglegrass" then + return false + end + + local below_name = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)).name + if minetest.get_item_group(below_name, "soil") == 0 and minetest.get_item_group(below_name, "sand") == 0 then + return false + end + + local light = minetest.get_node_light(pos, 0.5) + if light <= 8 then + return false + end + + return true +end + +abstract_ferns.grow_giant_tree_fern = function(pos) + local pos_aux = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(pos_aux).name + if name ~= "air" and name ~= "ferns:sapling_giant_tree_fern" + and name ~= "default:junglegrass" then + return + end + + local size = math.random(12,16) -- min of range must be >= 4 + + local leafchecks = { + { + direction = 3, + positions = { + {x = pos.x + 1, y = pos.y + size - 1, z = pos.z }, + {x = pos.x + 2, y = pos.y + size , z = pos.z }, + {x = pos.x + 3, y = pos.y + size - 1, z = pos.z }, + {x = pos.x + 4, y = pos.y + size - 2, z = pos.z } + } + }, + { + direction = 1, + positions = { + {x = pos.x - 1, y = pos.y + size - 1, z = pos.z }, + {x = pos.x - 2, y = pos.y + size, z = pos.z }, + {x = pos.x - 3, y = pos.y + size - 1, z = pos.z }, + {x = pos.x - 4, y = pos.y + size - 2, z = pos.z } + } + }, + { + direction = 2, + positions = { + {x = pos.x , y = pos.y + size - 1, z = pos.z + 1}, + {x = pos.x , y = pos.y + size , z = pos.z + 2}, + {x = pos.x , y = pos.y + size - 1, z = pos.z + 3}, + {x = pos.x , y = pos.y + size - 2, z = pos.z + 4} + } + }, + { + direction = 0, + positions = { + {x = pos.x , y = pos.y + size - 1, z = pos.z - 1}, + {x = pos.x , y = pos.y + size , z = pos.z - 2}, + {x = pos.x , y = pos.y + size - 1, z = pos.z - 3}, + {x = pos.x , y = pos.y + size - 2, z = pos.z - 4} + } + } + } + + local brk = false + for i = 1, size-3 do + pos_aux.y = pos.y + i + local nodename = minetest.get_node(pos_aux).name + if not (nodename == "air" or (i == 1 and nodename == "ferns:sapling_giant_tree_fern")) then + brk = true + break + end + minetest.swap_node({x = pos.x, y = pos.y + i, z = pos.z}, {name="ferns:fern_trunk_big"}) + end + if not brk then + minetest.swap_node({x = pos.x, y = pos.y + size-2, z = pos.z}, {name="ferns:fern_trunk_big_top"}) + minetest.swap_node({x = pos.x, y = pos.y + size-1, z = pos.z}, {name="ferns:tree_fern_leaves_giant"}) + + -- all the checking for air below is to prevent some ugly bugs (incomplete trunks of neighbouring trees), it's a bit slower, but worth the result + + -- assert(#leafchecks == 4) + for i = 1, 4 do + local positions = leafchecks[i].positions + local rot = leafchecks[i].direction + local endpos = 4 -- If the loop below adds all intermediate leaves then the "terminating" leaf will be at positions[4] + -- assert(#positions == 4) + -- add leaves so long as the destination nodes are air + for j = 1, 3 do + if minetest.get_node(positions[j]).name == "air" then + minetest.swap_node(positions[j], {name="ferns:tree_fern_leave_big"}) + else + endpos = j + break + end + end + -- add the terminating leaf if required and possible + if endpos == 4 and minetest.get_node(positions[endpos]).name == "air" then + minetest.swap_node(positions[endpos], {name="ferns:tree_fern_leave_big_end", param2=rot}) + end + end + end +end + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN LEAVES +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:tree_fern_leaves_giant", { + description = S("Tree Fern Crown (Dicksonia)"), + drawtype = "plantlike", + visual_scale = math.sqrt(11), + wield_scale = {x=0.175, y=0.175, z=0.175}, + paramtype = "light", + tiles = {"ferns_fern_tree_giant.png"}, + inventory_image = "ferns_fern_tree.png", + walkable = false, + groups = { + snappy=3, + flammable=2, + attached_node=1, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = { + max_items = 2, + items = { + { + -- occasionally, drop a second sapling instead of leaves + -- (extra saplings can also be obtained by replanting and + -- reharvesting leaves) + items = {"ferns:sapling_giant_tree_fern"}, + rarity = 10, + }, + { + items = {"ferns:sapling_giant_tree_fern"}, + }, + { + items = {"ferns:tree_fern_leaves_giant"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN LEAVE PART +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:tree_fern_leave_big", { + description = S("Giant Tree Fern Leaves"), + drawtype = "raillike", + paramtype = "light", + tiles = { + "ferns_tree_fern_leave_big.png", + }, + walkable = false, + groups = { + snappy=3, + flammable=2, + attached_node=1, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = "", + sounds = default.node_sound_leaves_defaults(), + after_destruct = function(pos,oldnode) + for _, d in pairs({{x=-1,z=0},{x=1,z=0},{x=0,z=-1},{x=0,z=1}}) do + local node = minetest.get_node({x=pos.x+d.x,y=pos.y+1,z=pos.z+d.z}) + if node.name == "ferns:tree_fern_leave_big" then + minetest.dig_node({x=pos.x+d.x,y=pos.y+1,z=pos.z+d.z}) + end + end + end, +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN LEAVE END +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:tree_fern_leave_big_end", { + description = S("Giant Tree Fern Leave End"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = { "ferns_tree_fern_leave_big_end.png" }, + use_texture_alpha = "clip", + walkable = false, + node_box = { + type = "fixed", +-- {left, bottom, front, right, top, back } + fixed = {-1/2, -1/2, 1/2, 1/2, 33/64, 1/2}, + }, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, 1/2, 1/2, 33/64, 1/2}, + }, + groups = { + snappy=3, + flammable=2, + attached_node=1, + not_in_creative_inventory=1 + }, + is_ground_content = false, + drop = "", + sounds = default.node_sound_leaves_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN TRUNK TOP +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:fern_trunk_big_top", { + description = S("Giant Fern Trunk"), + drawtype = "nodebox", + paramtype = "light", + tiles = { + "ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png", + "ferns_fern_trunk_big_top.png^ferns_tree_fern_leave_big_cross.png", + "ferns_fern_trunk_big.png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", +-- {left, bottom, front, right, top, back } + fixed = { + {-1/2, 33/64, -1/2, 1/2, 33/64, 1/2}, + {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + } + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + }, + groups = { + tree=1, + choppy=2, + oddly_breakable_by_hand=2, + flammable=3, + wood=1, + not_in_creative_inventory=1, + leafdecay=3 -- to support vines + }, + is_ground_content = false, + drop = "ferns:fern_trunk_big", + sounds = default.node_sound_wood_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN TRUNK +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:fern_trunk_big", { + description = S("Giant Fern Trunk"), + drawtype = "nodebox", + paramtype = "light", + tiles = { + "ferns_fern_trunk_big_top.png", + "ferns_fern_trunk_big_top.png", + "ferns_fern_trunk_big.png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + }, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + after_destruct = function(pos,oldnode) + local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if node.name == "ferns:fern_trunk_big" or node.name == "ferns:fern_trunk_big_top" then + minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z}) + minetest.add_item(pos,"ferns:fern_trunk_big") + end + end, +}) + +----------------------------------------------------------------------------------------------- +-- GIANT TREE FERN SAPLING +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:sapling_giant_tree_fern", { + description = S("Giant Tree Fern Sapling"), + drawtype = "plantlike", + paramtype = "light", + tiles = {"ferns_sapling_tree_fern_giant.png"}, + inventory_image = "ferns_sapling_tree_fern_giant.png", + walkable = false, + groups = {snappy=3,flammable=2,flora=1,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) + +-- abm +minetest.register_abm({ + nodenames = "ferns:sapling_giant_tree_fern", + interval = 1000, + chance = 4, + action = function(pos, node, _, _) + if abstract_ferns.can_grow_giant_tree_fern(pos) then + abstract_ferns.grow_giant_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + end + end +}) + +----------------------------------------------------------------------------------------------- +-- GENERATE GIANT TREE FERN +----------------------------------------------------------------------------------------------- + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter", "default:sand", "default:desert_sand"}, + sidelen = 16, + fill_ratio = 0.012, + y_min = 1, + y_max = 31000, + spawn_by = "default:jungletree", + num_spawn_by = 1, + decoration = "ferns:sapling_giant_tree_fern", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.012, + y_min = 1, + y_max = 31000, + spawn_by = "default:water_source,default:river_water_source", + num_spawn_by = 1, + decoration = "ferns:sapling_giant_tree_fern", +}) diff --git a/mods/plantlife_modpack/ferns/horsetail.lua b/mods/plantlife_modpack/ferns/horsetail.lua new file mode 100644 index 0000000..90f9e7c --- /dev/null +++ b/mods/plantlife_modpack/ferns/horsetail.lua @@ -0,0 +1,113 @@ +----------------------------------------------------------------------------------------------- +-- Archae Plantae - Horsetail 0.0.5 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: default, flowers, trees +-- Dependencies: biome_lib +-- Supports: dryplants, stoneage, sumpf +----------------------------------------------------------------------------------------------- + +-- support for i18n +local S = minetest.get_translator("ferns") +----------------------------------------------------------------------------------------------- +-- HORSETAIL (EQUISETUM) +----------------------------------------------------------------------------------------------- + +local node_names = {} + +local function create_nodes() + local selection_boxes = { + { -0.15, -1/2, -0.15, 0.15, -1/16, 0.15 }, + { -0.15, -1/2, -0.15, 0.15, 1/16, 0.15 }, + { -0.15, -1/2, -0.15, 0.15, 4/16, 0.15 }, + { -0.15, -1/2, -0.15, 0.15, 7/16, 0.15 }, + } + + for i = 1, 4 do + local node_name = "ferns:horsetail_" .. string.format("%02d", i) + local node_img = "ferns_horsetail_" .. string.format("%02d", i) .. ".png" + local node_desc + local node_on_use = nil + local node_drop = "ferns:horsetail_04" + + if i == 1 then + node_desc = S("Young Horsetail (Equisetum) @1", 1) + node_on_use = minetest.item_eat(1) -- young ones edible https://en.wikipedia.org/wiki/Equisetum + node_drop = node_name + elseif i == 4 then + node_desc = S("Horsetail (Equisetum)") + else + node_desc = S("Horsetail (Equisetum) @1", i) + end + + node_names[i] = node_name + + minetest.register_node(node_name, { + description = node_desc, + drawtype = "plantlike", + paramtype = "light", + tiles = { node_img }, + inventory_image = node_img, + walkable = false, + buildable_to = true, + groups = {snappy=3,flammable=2,attached_node=1,horsetail=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = selection_boxes[i], + }, + on_use = node_on_use, + drop = node_drop, + }) + end +end + +----------------------------------------------------------------------------------------------- +-- Init +----------------------------------------------------------------------------------------------- + +create_nodes() + +----------------------------------------------------------------------------------------------- +-- Generating +----------------------------------------------------------------------------------------------- + +minetest.register_decoration({ -- near trees (woodlands) + decoration = node_names, + deco_type = "simple", + flags = "all_floors", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "sumpf:sumpf" + }, + y_min = 1, -- above sea level + spawn_by = { + "group:water", -- likes water (of course) + "default:gravel", -- near those on gravel + "default:sand", -- some like sand + "default:clay", -- some like clay + "stoneage:grass_with_silex", + "default:mossycobble", + "default:cobble", + "sumpf:sumpf" + }, + num_spawn_by = 1, + fill_ratio = 0.1, +}) + +minetest.register_decoration({ -- near trees (woodlands) + decoration = node_names, + deco_type = "simple", + flags = "all_floors", + place_on = { + "default:gravel", -- roots go deep + "default:mossycobble", + "stoneage:dirt_with_silex", + "stoneage:grass_with_silex", + "stoneage:sand_with_silex", -- roots go deep + }, + y_min = 1, -- above sea level + fill_ratio = 0.1, +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/ferns/init.lua b/mods/plantlife_modpack/ferns/init.lua new file mode 100644 index 0000000..d4101ad --- /dev/null +++ b/mods/plantlife_modpack/ferns/init.lua @@ -0,0 +1,7 @@ +abstract_ferns = {} + +dofile(minetest.get_modpath("ferns").."/fern.lua") +dofile(minetest.get_modpath("ferns").."/horsetail.lua") +dofile(minetest.get_modpath("ferns").."/treefern.lua") +dofile(minetest.get_modpath("ferns").."/gianttreefern.lua") +dofile(minetest.get_modpath("ferns").."/crafting.lua") diff --git a/mods/plantlife_modpack/ferns/locale/ferns.de.tr b/mods/plantlife_modpack/ferns/locale/ferns.de.tr new file mode 100644 index 0000000..ed94945 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.de.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Geigenkopf +Roasted Fiddlehead=Gerösteter Geigenkopf +Fern Tuber=Farnknolle +Roasted Fern Tuber=Geröstete Farnknolle +Lady-fern (Athyrium)=Frauenfarn (Athyrium) +Giant Tree Fern Leaves=Riesige Baumfarnblätter +Giant Tree Fern Leave End=Riesiges Baumfarnblattende +Giant Fern Trunk=Riesiger Baumfarnstamm +Giant Tree Fern Sapling=Riesiger Baumfarnsetzling +Tree Fern Crown (Dicksonia)=Baumfarnkrone (Dicksonia) +Young Horsetail (Equisetum) @1=Junger Schachtelhalm (Equisetum) @1 +Horsetail (Equisetum)=Schachtelhalm (Equisetum) +Horsetail (Equisetum) @1= Schachtelhalm (Equisetum) @1 +Fern Trunk (Dicksonia)=Farnstamm (Dicksonia) +Tree Fern Sapling (Dicksonia)=Baumfarnsetzling (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/ferns.eo.tr b/mods/plantlife_modpack/ferns/locale/ferns.eo.tr new file mode 100644 index 0000000..11d0893 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.eo.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Filika Supro +Roasted Fiddlehead=Rostita Filika Supro +Fern Tuber=Filika Tubero +Roasted Fern Tuber=Rostita Filika Tubero +Lady-fern (Athyrium)=Afiriumo (Athyrium) +Giant Tree Fern Leaves=Folioj de Giganta Arba Filiko +Giant Tree Fern Leave End=Folifino de Giganta Arba Filiko +Giant Fern Trunk=Trunko de Giganta Arba Filiko +Giant Tree Fern Sapling=Arbido de Giganta Arba Filiko +Tree Fern Crown (Dicksonia)=Krono de Arba Filiko +Young Horsetail (Equisetum) @1=Juna Ekvizeto (Equisetum) @1 +Horsetail (Equisetum)=Ekvizeto (Equisetum) +Horsetail (Equisetum) @1=Ekvizeto (Equisetum) @1 +Fern Trunk (Dicksonia)=Trunko de Arba Filiko (Dicksonia) +Tree Fern Sapling (Dicksonia)=Arbido de Arba Filiko (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/ferns.fr.tr b/mods/plantlife_modpack/ferns/locale/ferns.fr.tr new file mode 100644 index 0000000..f7364f5 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/ferns.fr.tr @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead=Crosse de fougère +Roasted Fiddlehead=Crosse de fougère rôtie +Fern Tuber=Tubercule de fougère +Roasted Fern Tuber=Tubercule de fougère rôti +Lady-fern (Athyrium)=Fougère (Athyrium) +Giant Tree Fern Leaves=Feuilles de fougère géante +Giant Tree Fern Leave End=Feuilles de fougère géante (extrémité) +Giant Fern Trunk=Tronc de fougère géante +Giant Tree Fern Sapling=Pousse de fougère géante +Tree Fern Crown (Dicksonia)=Fougère en couronne (Dicksonia) +Young Horsetail (Equisetum) @1=Pousse de prêle (Equisetum) @1 +Horsetail (Equisetum)=Prêle (Equisetum) +Horsetail (Equisetum) @1=Prêle (Equisetum) @1 +Fern Trunk (Dicksonia)=Tronc de fougère en couronne (Dicksonia) +Tree Fern Sapling (Dicksonia)=Pousse de fougère en couronne (Dicksonia) diff --git a/mods/plantlife_modpack/ferns/locale/template.txt b/mods/plantlife_modpack/ferns/locale/template.txt new file mode 100644 index 0000000..8000257 --- /dev/null +++ b/mods/plantlife_modpack/ferns/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: ferns +Fiddlehead= +Roasted Fiddlehead= +Fern Tuber= +Roasted Fern Tuber= +Lady-fern (Athyrium)= +Giant Tree Fern Leaves= +Giant Tree Fern Leave End= +Giant Fern Trunk= +Giant Tree Fern Sapling= +Tree Fern Crown (Dicksonia)= +Young Horsetail (Equisetum) @1= +Horsetail (Equisetum)= +Horsetail (Equisetum) @1= +Fern Trunk (Dicksonia)= +Tree Fern Sapling (Dicksonia)= diff --git a/mods/plantlife_modpack/ferns/mod.conf b/mods/plantlife_modpack/ferns/mod.conf new file mode 100644 index 0000000..2c58df5 --- /dev/null +++ b/mods/plantlife_modpack/ferns/mod.conf @@ -0,0 +1,2 @@ +name = ferns +depends = default diff --git a/mods/plantlife_modpack/ferns/textures/ferns_5.png b/mods/plantlife_modpack/ferns/textures/ferns_5.png new file mode 100644 index 0000000..7e40665 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_5.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_6.png b/mods/plantlife_modpack/ferns/textures/ferns_6.png new file mode 100644 index 0000000..107bbf6 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_6.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_7.png b/mods/plantlife_modpack/ferns/textures/ferns_7.png new file mode 100644 index 0000000..b1ac1f5 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_7.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_8.png b/mods/plantlife_modpack/ferns/textures/ferns_8.png new file mode 100644 index 0000000..db5510b Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_8.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern.png b/mods/plantlife_modpack/ferns/textures/ferns_fern.png new file mode 100644 index 0000000..7884e5a Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_big.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_big.png new file mode 100644 index 0000000..42deb95 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_big.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_mid.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_mid.png new file mode 100644 index 0000000..3213308 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_mid.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree.png new file mode 100644 index 0000000..8daeafd Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png new file mode 100644 index 0000000..bc9cd45 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_giant.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_inv.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_inv.png new file mode 100644 index 0000000..5417669 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_inv.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tl.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tl.png new file mode 100644 index 0000000..16b6e3a Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tl.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tr.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tr.png new file mode 100644 index 0000000..768430f Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_tree_tr.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png new file mode 100644 index 0000000..5465ef8 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big.png new file mode 100644 index 0000000..24ede0a Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big_top.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big_top.png new file mode 100644 index 0000000..3e3c829 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_big_top.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_top.png b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_top.png new file mode 100644 index 0000000..8b259cc Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fern_trunk_top.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_ferntuber.png b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber.png new file mode 100644 index 0000000..2d6785d Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_ferntuber_roasted.png b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber_roasted.png new file mode 100644 index 0000000..f62a88d Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_ferntuber_roasted.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead.png b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead.png new file mode 100644 index 0000000..0925c78 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead_roasted.png b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead_roasted.png new file mode 100644 index 0000000..9f4943c Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_fiddlehead_roasted.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_01.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_01.png new file mode 100644 index 0000000..60d3ca6 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_01.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_02.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_02.png new file mode 100644 index 0000000..3c7edf7 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_02.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_03.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_03.png new file mode 100644 index 0000000..5d28a46 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_03.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_horsetail_04.png b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_04.png new file mode 100644 index 0000000..a8254ed Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_horsetail_04.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern.png b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern.png new file mode 100644 index 0000000..b459d48 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern_giant.png b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern_giant.png new file mode 100644 index 0000000..e556016 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_sapling_tree_fern_giant.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big.png b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big.png new file mode 100644 index 0000000..09cc001 Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_cross.png b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_cross.png new file mode 100644 index 0000000..48f7e2c Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_cross.png differ diff --git a/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_end.png b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_end.png new file mode 100644 index 0000000..d0064fe Binary files /dev/null and b/mods/plantlife_modpack/ferns/textures/ferns_tree_fern_leave_big_end.png differ diff --git a/mods/plantlife_modpack/ferns/treefern.lua b/mods/plantlife_modpack/ferns/treefern.lua new file mode 100644 index 0000000..562eaa1 --- /dev/null +++ b/mods/plantlife_modpack/ferns/treefern.lua @@ -0,0 +1,237 @@ +----------------------------------------------------------------------------------------------- +-- Ferns - Tree Fern 0.1.1 +----------------------------------------------------------------------------------------------- +-- by Mossmanikin +-- Contains code from: biome_lib +-- Looked at code from: default , trees +----------------------------------------------------------------------------------------------- + +-- support for i18n +local S = minetest.get_translator("ferns") + +function abstract_ferns.can_grow_tree_fern(pos) + local node_name = minetest.get_node(pos).name + if node_name ~= "air" and node_name ~= "ferns:sapling_tree_fern" and node_name ~= "default:junglegrass" then + return false + end + + local below_name = minetest.get_node(vector.new(pos.x, pos.y - 1, pos.z)).name + if minetest.get_item_group(below_name, "soil") == 0 and minetest.get_item_group(below_name, "sand") == 0 then + return false + end + + local light = minetest.get_node_light(pos, 0.5) + if light <= 8 then + return false + end + + return true +end + +abstract_ferns.grow_tree_fern = function(pos) + + local pos_aux = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(pos_aux).name + if name ~= "air" and name ~= "ferns:sapling_tree_fern" + and name ~= "default:junglegrass" then + return + end + + local size = math.random(1, 4) + math.random(1, 4) + if (size > 5) then + size = 10 - size + end + size = size + 1 + local crown = ({ "ferns:tree_fern_leaves", "ferns:tree_fern_leaves_02" })[math.random(1, 2)] + + local i = 1 + local brk = false + while (i < size) do + pos_aux.y = pos.y + i + name = minetest.get_node(pos_aux).name + if not (name == "air" or (i == 1 and name == "ferns:sapling_tree_fern")) then + brk = true + break + end + minetest.swap_node({x = pos.x, y = pos.y + i, z = pos.z}, { name = "ferns:fern_trunk" }) + i = i + 1 + end + if not brk then + minetest.swap_node({x = pos.x, y = pos.y + i - 1, z = pos.z}, { name = crown }) + end +end + +----------------------------------------------------------------------------------------------- +-- TREE FERN LEAVES +----------------------------------------------------------------------------------------------- + +-- TODO: Both of these nodes look the same? + +minetest.register_node("ferns:tree_fern_leaves", { + description = S("Tree Fern Crown (Dicksonia)"), + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + paramtype2 = "facedir", + --tiles = {"[combine:32x32:0,0=top_left.png:0,16=bottom_left.png:16,0=top_right.png:16,16=bottom_right.png"}, + tiles = {"ferns_fern_tree.png"}, + inventory_image = "ferns_fern_tree_inv.png", + walkable = false, + groups = {snappy=3,flammable=2,attached_node=1}, + is_ground_content = false, + drop = { + max_items = 2, + items = { + { + -- occasionally, drop a second sapling instead of leaves + -- (extra saplings can also be obtained by replanting and + -- reharvesting leaves) + items = {"ferns:sapling_tree_fern"}, + rarity = 10, + }, + { + items = {"ferns:sapling_tree_fern"}, + }, + { + items = {"ferns:tree_fern_leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +minetest.register_node("ferns:tree_fern_leaves_02", { + drawtype = "plantlike", + visual_scale = math.sqrt(8), + paramtype = "light", + tiles = {"ferns_fern_big.png"}, + walkable = false, + groups = {snappy=3,flammable=2,attached_node=1,not_in_creative_inventory=1}, + is_ground_content = false, + drop = { + max_items = 2, + items = { + { + -- occasionally, drop a second sapling instead of leaves + -- (extra saplings can also be obtained by replanting and + -- reharvesting leaves) + items = {"ferns:sapling_tree_fern"}, + rarity = 10, + }, + { + items = {"ferns:sapling_tree_fern"}, + }, + { + items = {"ferns:tree_fern_leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +----------------------------------------------------------------------------------------------- +-- FERN TRUNK +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:fern_trunk", { + description = S("Fern Trunk (Dicksonia)"), + drawtype = "nodebox", + paramtype = "light", + tiles = { + "ferns_fern_trunk_top.png", + "ferns_fern_trunk_top.png", + "ferns_fern_trunk.png" + }, + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, + }, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + after_destruct = function(pos,oldnode) + local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if node.name == "ferns:fern_trunk" then + minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z}) + minetest.add_item(pos,"ferns:fern_trunk") + end + end, +}) + +----------------------------------------------------------------------------------------------- +-- TREE FERN SAPLING +----------------------------------------------------------------------------------------------- +minetest.register_node("ferns:sapling_tree_fern", { + description = S("Tree Fern Sapling (Dicksonia)"), + drawtype = "plantlike", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"ferns_sapling_tree_fern.png"}, + inventory_image = "ferns_sapling_tree_fern.png", + walkable = false, + groups = {snappy=3,flammable=2,flora=1,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16}, + }, +}) +-- abm +minetest.register_abm({ + nodenames = "ferns:sapling_tree_fern", + interval = 1000, + chance = 4, + action = function(pos, node, _, _) + if abstract_ferns.can_grow_tree_fern(pos) then + abstract_ferns.grow_tree_fern({x = pos.x, y = pos.y-1, z = pos.z}) + end + end +}) + +----------------------------------------------------------------------------------------------- +-- GENERATE TREE FERN +----------------------------------------------------------------------------------------------- + +-- in jungles +minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_rainforest_litter", + "default:sand", + "default:desert_sand", + }, + sidelen = 16, + fill_ratio = 0.002, + biomes = {"rainforest", "rainforest_swamp"}, + y_min = -10, + y_max = 31000, + spawn_by = "default:jungletree", + num_spawn_by = 1, + decoration = "ferns:sapling_tree_fern", + flags = "force_placement", +}) + +-- for oases & tropical beaches +minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 16, + fill_ratio = 0.002, + y_min = 1, + y_max = 31000, + spawn_by = {"default:water_source", "default:river_water_source"}, + num_spawn_by = 1, + decoration = "ferns:sapling_tree_fern", + flags = "force_placement", +}) diff --git a/mods/plantlife_modpack/modpack.conf b/mods/plantlife_modpack/modpack.conf new file mode 100644 index 0000000..7469b3d --- /dev/null +++ b/mods/plantlife_modpack/modpack.conf @@ -0,0 +1 @@ +min_minetest_version = 5.3.0 diff --git a/mods/plantlife_modpack/molehills/init.lua b/mods/plantlife_modpack/molehills/init.lua new file mode 100644 index 0000000..2c35376 --- /dev/null +++ b/mods/plantlife_modpack/molehills/init.lua @@ -0,0 +1,53 @@ +-- Idea by Sokomine +-- Code & textures by Mossmanikin + +-- support for i18n +local S = minetest.get_translator("molehills") + +local molehill_rarity = minetest.settings:get("molehills.molehill_rarity") or 0.002 + +-- Node +local mh_cbox = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.125, 0.5} +} + +minetest.register_node("molehills:molehill",{ + drawtype = "mesh", + mesh = "molehill_molehill.obj", + description = S("Mole Hill"), + inventory_image = "molehills_side.png", + tiles = { "molehills_dirt.png" }, + use_texture_alpha = "clip", + paramtype = "light", + selection_box = mh_cbox, + collision_box = mh_cbox, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults(), +}) + +-- Crafting +minetest.register_craft({ -- molehills --> dirt + output = "default:dirt", + recipe = { + {"molehills:molehill","molehills:molehill"}, + {"molehills:molehill","molehills:molehill"}, + } +}) + +-- Generating +minetest.register_decoration({ + decoration = { + "molehills:molehill" + }, + fill_ratio = molehill_rarity, + y_min = 1, + y_max = 40, + place_on = { + "default:dirt_with_grass" + }, + spawn_by = "air", + num_spawn_by = 3, + deco_type = "simple", + flags = "all_floors", +}) diff --git a/mods/plantlife_modpack/molehills/locale/molehills.de.tr b/mods/plantlife_modpack/molehills/locale/molehills.de.tr new file mode 100644 index 0000000..07d8f7c --- /dev/null +++ b/mods/plantlife_modpack/molehills/locale/molehills.de.tr @@ -0,0 +1,2 @@ +# textdomain: molehills +Mole Hill=Maulwurfshügel diff --git a/mods/plantlife_modpack/molehills/locale/molehills.eo.tr b/mods/plantlife_modpack/molehills/locale/molehills.eo.tr new file mode 100644 index 0000000..ca7a1c6 --- /dev/null +++ b/mods/plantlife_modpack/molehills/locale/molehills.eo.tr @@ -0,0 +1,2 @@ +# textdomain: molehills +Mole Hill=Talpa Monteto diff --git a/mods/plantlife_modpack/molehills/locale/molehills.fr.tr b/mods/plantlife_modpack/molehills/locale/molehills.fr.tr new file mode 100644 index 0000000..b0eaf66 --- /dev/null +++ b/mods/plantlife_modpack/molehills/locale/molehills.fr.tr @@ -0,0 +1,2 @@ +# textdomain: molehills +Mole Hill=Taupinière diff --git a/mods/plantlife_modpack/molehills/locale/template.txt b/mods/plantlife_modpack/molehills/locale/template.txt new file mode 100644 index 0000000..bd7f836 --- /dev/null +++ b/mods/plantlife_modpack/molehills/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: molehills +Mole Hill= diff --git a/mods/plantlife_modpack/molehills/mod.conf b/mods/plantlife_modpack/molehills/mod.conf new file mode 100644 index 0000000..ef391f9 --- /dev/null +++ b/mods/plantlife_modpack/molehills/mod.conf @@ -0,0 +1,2 @@ +name = molehills +depends = default diff --git a/mods/plantlife_modpack/molehills/models/molehill_molehill.obj b/mods/plantlife_modpack/molehills/models/molehill_molehill.obj new file mode 100644 index 0000000..5b9c084 --- /dev/null +++ b/mods/plantlife_modpack/molehills/models/molehill_molehill.obj @@ -0,0 +1,197 @@ +# Blender v2.73 (sub 0) OBJ File: 'anthill.blend' +# www.blender.org +o Cylinder_Cylinder.001 +v 0.099056 -0.499969 -0.498228 +v 0.038417 -0.200463 -0.141682 +v 0.255808 -0.499933 -0.402046 +v 0.095605 -0.174690 -0.147239 +v 0.423075 -0.499913 -0.296918 +v 0.102439 -0.169033 -0.075679 +v 0.444026 -0.499843 -0.095234 +v 0.125298 -0.217477 -0.063343 +v 0.468682 -0.499958 0.074790 +v 0.157655 -0.214352 0.001348 +v 0.396548 -0.500000 0.246048 +v 0.133778 -0.189245 0.108513 +v 0.280708 -0.500000 0.383197 +v 0.070517 -0.218946 0.104754 +v 0.089852 -0.499943 0.434316 +v 0.048523 -0.205247 0.128681 +v -0.093309 -0.499902 0.467111 +v -0.039037 -0.211895 0.149030 +v -0.272965 -0.499875 0.396496 +v -0.108297 -0.175918 0.104100 +v -0.388317 -0.499877 0.239075 +v -0.139068 -0.179051 0.073370 +v -0.437531 -0.499999 0.063918 +v -0.141812 -0.255882 0.005117 +v -0.458429 -0.499805 -0.104397 +v -0.189265 -0.217436 -0.065303 +v -0.385597 -0.499914 -0.288584 +v -0.112692 -0.207830 -0.096879 +v -0.248347 -0.499927 -0.384586 +v -0.083136 -0.202256 -0.170048 +v -0.095346 -0.499958 -0.514449 +v -0.023049 -0.216681 -0.204058 +v 0.071880 -0.343843 -0.343933 +v 0.189128 -0.354687 -0.277980 +v 0.311273 -0.378789 -0.248498 +v 0.296760 -0.346318 -0.056661 +v 0.332231 -0.342427 0.044933 +v 0.259921 -0.360316 0.147910 +v 0.213270 -0.362883 0.253745 +v 0.059007 -0.360067 0.351374 +v -0.068448 -0.357957 0.335642 +v -0.164888 -0.343166 0.232553 +v -0.269761 -0.352370 0.140734 +v -0.367168 -0.370891 0.062326 +v -0.294491 -0.324099 -0.079712 +v -0.276314 -0.352585 -0.236032 +v -0.206169 -0.372829 -0.314307 +v -0.065547 -0.371444 -0.355380 +v 0.000709 -0.156135 -0.047193 +vt 0.572002 0.826281 +vt 0.535907 0.620231 +vt 0.597591 0.625892 +vt 0.604963 0.552988 +vt 0.830215 0.729053 +vt 0.629619 0.540419 +vt 0.814561 0.533613 +vt 0.664520 0.474514 +vt 0.638766 0.365335 +vt 0.774826 0.325198 +vt 0.570532 0.369165 +vt 0.724507 0.217375 +vt 0.546808 0.344788 +vt 0.452364 0.324057 +vt 0.420641 0.133939 +vt 0.377660 0.369831 +vt 0.316619 0.238965 +vt 0.344469 0.401138 +vt 0.203502 0.332509 +vt 0.341509 0.470674 +vt 0.290325 0.542416 +vt 0.176827 0.557096 +vt 0.372919 0.574586 +vt 0.196433 0.716353 +vt 0.404798 0.649130 +vt 0.469609 0.683778 +vt 0.272092 0.796098 +vt 0.770390 0.885486 +vt 0.973405 0.572910 +vt 0.591386 0.033412 +vt 0.226599 0.867698 +vt 0.423770 0.837943 +vt 0.601314 0.983475 +vt 0.078559 0.769893 +vt 0.000000 0.582245 +vt 0.098436 0.412390 +vt 0.075624 0.232320 +vt 0.200045 0.071942 +vt 0.558116 0.117912 +vt 0.922195 0.225217 +vt 0.852821 0.430110 +vt 0.698467 0.759089 +vt 0.495235 0.523967 +vt 0.391629 1.000000 +vt 0.022541 0.410768 +vt 0.797247 0.085491 +vt 0.393825 0.000000 +vt 0.950807 0.778383 +vt 1.000000 0.399692 +g Cylinder_Cylinder.001_None +s 1 +f 33/1 2/2 4/3 +f 4/3 6/4 35/5 +f 35/5 6/4 8/6 +f 36/7 8/6 10/8 +f 10/8 12/9 38/10 +f 12/9 14/11 39/12 +f 39/12 14/11 16/13 +f 16/13 18/14 41/15 +f 18/14 20/16 42/17 +f 20/16 22/18 43/19 +f 43/19 22/18 24/20 +f 24/20 26/21 45/22 +f 26/21 28/23 46/24 +f 46/24 28/23 30/25 +f 32/26 2/2 33/1 +f 47/27 30/25 32/26 +f 3/28 7/29 15/30 +f 29/31 47/27 48/32 +f 48/32 33/1 1/33 +f 27/34 46/24 47/27 +f 25/35 45/22 46/24 +f 44/36 45/22 25/35 +f 21/37 43/19 44/36 +f 42/17 43/19 21/37 +f 41/15 42/17 19/38 +f 15/30 40/39 41/15 +f 39/12 40/39 15/30 +f 11/40 38/10 39/12 +f 37/41 38/10 11/40 +f 7/29 36/7 37/41 +f 35/5 36/7 7/29 +f 3/28 34/42 35/5 +f 33/1 34/42 3/28 +f 4/3 2/2 49/43 +f 2/2 32/26 49/43 +f 32/26 30/25 49/43 +f 30/25 28/23 49/43 +f 28/23 26/21 49/43 +f 26/21 24/20 49/43 +f 24/20 22/18 49/43 +f 22/18 20/16 49/43 +f 20/16 18/14 49/43 +f 18/14 16/13 49/43 +f 16/13 14/11 49/43 +f 14/11 12/9 49/43 +f 12/9 10/8 49/43 +f 10/8 8/6 49/43 +f 8/6 6/4 49/43 +f 6/4 4/3 49/43 +f 34/42 33/1 4/3 +f 34/42 4/3 35/5 +f 36/7 35/5 8/6 +f 37/41 36/7 10/8 +f 37/41 10/8 38/10 +f 38/10 12/9 39/12 +f 40/39 39/12 16/13 +f 40/39 16/13 41/15 +f 41/15 18/14 42/17 +f 42/17 20/16 43/19 +f 44/36 43/19 24/20 +f 44/36 24/20 45/22 +f 45/22 26/21 46/24 +f 47/27 46/24 30/25 +f 48/32 32/26 33/1 +f 48/32 47/27 32/26 +f 29/31 31/44 1/33 +f 23/45 27/34 29/31 +f 27/34 23/45 25/35 +f 15/30 19/38 21/37 +f 11/40 13/46 15/30 +f 15/30 17/47 19/38 +f 3/28 23/45 29/31 +f 29/31 1/33 3/28 +f 3/28 5/48 7/29 +f 7/29 9/49 11/40 +f 23/45 15/30 21/37 +f 15/30 23/45 3/28 +f 15/30 7/29 11/40 +f 31/44 29/31 48/32 +f 31/44 48/32 1/33 +f 29/31 27/34 47/27 +f 27/34 25/35 46/24 +f 23/45 44/36 25/35 +f 23/45 21/37 44/36 +f 19/38 42/17 21/37 +f 17/47 41/15 19/38 +f 17/47 15/30 41/15 +f 13/46 39/12 15/30 +f 13/46 11/40 39/12 +f 9/49 37/41 11/40 +f 9/49 7/29 37/41 +f 5/48 35/5 7/29 +f 5/48 3/28 35/5 +f 1/33 33/1 3/28 diff --git a/mods/plantlife_modpack/molehills/settingtypes.txt b/mods/plantlife_modpack/molehills/settingtypes.txt new file mode 100644 index 0000000..4a95084 --- /dev/null +++ b/mods/plantlife_modpack/molehills/settingtypes.txt @@ -0,0 +1,2 @@ +# Molehill rarity (higher number -> higher probability) +molehills.molehill_rarity (Molehill rarity) float 0.002 0.0001 1 diff --git a/mods/plantlife_modpack/molehills/textures/molehills_dirt.png b/mods/plantlife_modpack/molehills/textures/molehills_dirt.png new file mode 100644 index 0000000..288336e Binary files /dev/null and b/mods/plantlife_modpack/molehills/textures/molehills_dirt.png differ diff --git a/mods/plantlife_modpack/molehills/textures/molehills_side.png b/mods/plantlife_modpack/molehills/textures/molehills_side.png new file mode 100644 index 0000000..554bbec Binary files /dev/null and b/mods/plantlife_modpack/molehills/textures/molehills_side.png differ diff --git a/mods/plantlife_modpack/nature_classic/blossom.lua b/mods/plantlife_modpack/nature_classic/blossom.lua new file mode 100644 index 0000000..9df42c0 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/blossom.lua @@ -0,0 +1,84 @@ +-- support for i18n +local S = minetest.get_translator("nature_classic") +-- Blossoms and such + +local function spawn_apple_under(pos) + local below = { + x = pos.x, + y = pos.y - 1, + z = pos.z, + } + if minetest.get_node(below).name == "air" then + minetest.swap_node(below, { name = "default:apple" }) + end +end + +minetest.register_node(":"..nature.blossom_node, { + description = S("Apple blossoms"), + drawtype = "allfaces_optional", + tiles = nature.blossom_textures, + paramtype = "light", + groups = nature.blossom_groups, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), + waving = 1 +}) + +default.register_leafdecay({ + trunks = { nature.blossom_trunk }, + leaves = { nature.blossom_node, nature.blossom_leaves, nature.blossom_fruit }, + radius = nature.blossom_decay, +}) + +minetest.register_craft({ + type = "fuel", + recipe = nature.blossom_node, + burntime = 2, +}) + +-- these ABMs can get heavy, so just enqueue the nodes + +-- Adding Blossoms +-- Limit mass changes after block has not been loaded for some time: +-- Run ABM with higher frequency, but don't enqueue all blocks +minetest.register_abm({ + nodenames = { nature.blossom_leaves }, + interval = nature.blossom_delay / nature.leaves_blossom_chance, + chance = nature.leaves_blossom_chance, + + action = function(pos, node, active_object_count, active_object_count_wider) + if math.random(nature.leaves_blossom_chance) == 1 then + nature.enqueue_node(pos, node, nature.blossom_node) + end + end +}) + +-- Removing blossoms +-- Limit mass changes after block has not been loaded for some time: +-- Run ABM with higher frequency, but don't enqueue all blocks +minetest.register_abm({ + nodenames = { nature.blossom_node }, + interval = nature.blossom_delay / nature.blossom_leaves_chance, + chance = nature.blossom_leaves_chance, + + action = function(pos, node, active_object_count, active_object_count_wider) + if math.random(nature.blossom_leaves_chance) == 1 then + nature.enqueue_node(pos, node, nature.blossom_leaves) + end + end +}) + +-- Spawning apples +-- Limit mass changes after block has not been loaded for some time: +-- spawn apples with 25% chance, but with 4 times higher frequency +minetest.register_abm({ + nodenames = { nature.blossom_node }, + interval = nature.apple_delay / 4, + chance = nature.apple_chance, + + action = function(pos, node, active_object_count, active_object_count_wider) + if math.random(4) == 1 and nature.dtime < 0.2 and not minetest.find_node_near(pos, nature.apple_spread, { "default:apple" }) then + spawn_apple_under(pos) + end + end +}) diff --git a/mods/plantlife_modpack/nature_classic/config.lua b/mods/plantlife_modpack/nature_classic/config.lua new file mode 100644 index 0000000..8f67b1c --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/config.lua @@ -0,0 +1,6 @@ +-- Set on which distance from water can the tree still grow. +-- Grows anywhere if set to -1. +nature.distance_from_water = 20 + +-- Minimum light level needed to grow. Default is 8, which means daylight. +nature.minimum_growth_light = 8 diff --git a/mods/plantlife_modpack/nature_classic/global_function.lua b/mods/plantlife_modpack/nature_classic/global_function.lua new file mode 100644 index 0000000..ebf5529 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/global_function.lua @@ -0,0 +1,82 @@ +-- helper functions + +local function process_blossom_queue_item() + local pos = nature.blossomqueue[1][1] + -- local node = nature.blossomqueue[1][2] + local replace = nature.blossomqueue[1][3] + if (nature.blossomqueue[1][3] == nature.blossom_node and not nature:is_near_water(pos)) then + table.remove(nature.blossomqueue, 1) -- don't grow if it's not near water, pop from queue. + return + end + nature:grow_node(pos, replace) -- now actually grow it. + table.remove(nature.blossomqueue, 1) +end + +minetest.register_globalstep(function(dtime) + nature.dtime = dtime + if #nature.blossomqueue > 0 and dtime < 0.2 then + local i = 1 + if dtime < 0.1 then + i = i + 4 + end + if dtime < 0.05 then + i = i + 10 + end + while #nature.blossomqueue > 0 and i > 0 do + process_blossom_queue_item() + i = i - 1 + end + end +end) + +function nature.enqueue_node(pos, node, replace) + local idx = #nature.blossomqueue + if idx < nature.blossomqueue_max then + local enqueue_prob + if idx < nature.blossomqueue_max * 0.8 then + enqueue_prob = 1 + else + -- Reduce queue growth as it gets closer to its max. + enqueue_prob = 1 - (idx - nature.blossomqueue_max * 0.8) / (nature.blossomqueue_max * 0.2) + end + if enqueue_prob == 1 or math.random(100) <= 100 * enqueue_prob then + nature.blossomqueue[idx+1] = {} + nature.blossomqueue[idx+1][1] = pos + nature.blossomqueue[idx+1][2] = node + nature.blossomqueue[idx+1][3] = replace + end + end +end + +local function set_young_node(pos) + local meta = minetest.get_meta(pos) + + meta:set_int(nature.meta_blossom_time, minetest.get_gametime()) +end + +local function is_not_young(pos) + local meta = minetest.get_meta(pos) + + local blossom_time = meta:get_int(nature.meta_blossom_time) + return not (blossom_time and minetest.get_gametime() - blossom_time < nature.blossom_duration) +end + +function nature:grow_node(pos, nodename) + if pos ~= nil then + local light_enough = (minetest.get_node_light(pos, nil) or 0) + >= nature.minimum_growth_light + + if is_not_young(pos) and light_enough then + minetest.swap_node(pos, { name = nodename }) + set_young_node(pos) + + minetest.log("info", nodename .. " has grown at " .. pos.x .. "," + .. pos.y .. "," .. pos.z) + end + end +end + +function nature:is_near_water(pos) + return nature.distance_from_water == -1 or minetest.find_node_near(pos, nature.distance_from_water, + { "default:water_source" }) ~= nil +end diff --git a/mods/plantlife_modpack/nature_classic/init.lua b/mods/plantlife_modpack/nature_classic/init.lua new file mode 100644 index 0000000..3f0fc81 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/init.lua @@ -0,0 +1,43 @@ +-- Nature Classic mod +-- Originally by neko259 + +-- Nature is slowly capturing the world! + +local current_mod_name = minetest.get_current_modname() + +nature = {} + +nature.blossomqueue = {} +nature.blossomqueue_max = 1000 + +nature.blossom_decay = 2 +nature.blossom_trunk = "default:tree" +nature.blossom_node = "nature:blossom" +nature.blossom_leaves = "default:leaves" +nature.blossom_fruit = "default:apple" +nature.blossom_textures = { "default_leaves.png^nature_blossom.png" } +nature.blossom_groups = { snappy = 3, leafdecay = 1, leaves = 1, flammable = 2 } + +if minetest.get_modpath("moretrees") then + nature.blossom_decay = moretrees.leafdecay_radius + nature.blossom_trunk = "moretrees:apple_tree_trunk" + nature.blossom_node = "moretrees:apple_blossoms" + nature.blossom_leaves = "moretrees:apple_tree_leaves" + nature.blossom_textures = { "moretrees_apple_tree_leaves.png^nature_blossom.png" } + nature.blossom_groups = { snappy = 3, leafdecay = 1, leaves = 1, flammable = 2, moretrees_leaves = 1 } + minetest.register_alias("nature:blossom", "default:leaves") +end + +nature.leaves_blossom_chance = 15 +nature.blossom_leaves_chance = 5 +nature.blossom_delay = 3600 +nature.apple_delay = 3600 +nature.apple_chance = 10 +nature.apple_spread = 2 + +nature.meta_blossom_time = "blossom_time" +nature.blossom_duration = nature.blossom_delay + +dofile(minetest.get_modpath(current_mod_name) .. "/config.lua") +dofile(minetest.get_modpath(current_mod_name) .. "/global_function.lua") +dofile(minetest.get_modpath(current_mod_name) .. "/blossom.lua") diff --git a/mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr b/mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr new file mode 100644 index 0000000..1f1f4d0 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr @@ -0,0 +1,2 @@ +# textdomain: nature_classic +Apple blossoms=Apfelblüten diff --git a/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr b/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr new file mode 100644 index 0000000..6c60509 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/locale/nature_classic.fr.tr @@ -0,0 +1,2 @@ +# textdomain: nature_classic +Apple blossoms=Fleurs de pommier diff --git a/mods/plantlife_modpack/nature_classic/locale/nature_classic.txt b/mods/plantlife_modpack/nature_classic/locale/nature_classic.txt new file mode 100644 index 0000000..0331d23 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/locale/nature_classic.txt @@ -0,0 +1,10 @@ +# textdomain: nature_classic + +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Jolesh, 2022. +# + +Apple blossoms=Poma Floroj +[Nature Classic] loaded!=[Nature Classic] ŝarĝita! diff --git a/mods/plantlife_modpack/nature_classic/locale/template.txt b/mods/plantlife_modpack/nature_classic/locale/template.txt new file mode 100644 index 0000000..a2c7ee4 --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: nature_classic +Apple blossoms= diff --git a/mods/plantlife_modpack/nature_classic/mod.conf b/mods/plantlife_modpack/nature_classic/mod.conf new file mode 100644 index 0000000..2e6050b --- /dev/null +++ b/mods/plantlife_modpack/nature_classic/mod.conf @@ -0,0 +1,3 @@ +name = nature_classic +depends = default +optional_depends = moretrees diff --git a/mods/plantlife_modpack/nature_classic/textures/nature_blossom.png b/mods/plantlife_modpack/nature_classic/textures/nature_blossom.png new file mode 100644 index 0000000..9d90336 Binary files /dev/null and b/mods/plantlife_modpack/nature_classic/textures/nature_blossom.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/init.lua b/mods/plantlife_modpack/pl_seaweed/init.lua new file mode 100644 index 0000000..b99f19a --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/init.lua @@ -0,0 +1,140 @@ +-- support for i18n +local S = minetest.get_translator("pl_seaweed") + +local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06 + +local function get_ndef(name) + return minetest.registered_nodes[name] or {} +end + +local algae_list = { {nil}, {2}, {3}, {4} } + +for i in ipairs(algae_list) do + local num = "" + local algae_groups = {snappy = 3,flammable=2,flower=1} + + if algae_list[i][1] ~= nil then + num = "_"..algae_list[i][1] + algae_groups = { snappy = 3,flammable=2,flower=1, not_in_creative_inventory=1 } + end + + minetest.register_node(":flowers:seaweed"..num, { + description = S("Seaweed"), + drawtype = "nodebox", + tiles = { + "flowers_seaweed"..num..".png", + "flowers_seaweed"..num..".png^[transformFY" + }, + use_texture_alpha = "clip", + inventory_image = "flowers_seaweed_2.png", + wield_image = "flowers_seaweed_2.png", + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + groups = algae_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = { -0.4, -0.5, -0.4, 0.4, -0.45, 0.4 }, + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.49, -0.5, 0.5, -0.49, 0.5 }, + }, + buildable_to = true, + + liquids_pointable = true, + drop = "flowers:seaweed", + on_place = function(itemstack, placer, pointed_thing) + if not itemstack or not placer or not pointed_thing then + return + end + + local keys = placer:get_player_control() + local pt = pointed_thing + + local place_pos = nil + local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local under_node = minetest.get_node(pt.under) + local above_node = minetest.get_node(pt.above) + local top_node = minetest.get_node(top_pos) + if get_ndef(under_node.name)["buildable_to"] then + if under_node.name ~= "default:water_source" then + place_pos = pt.under + elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then + place_pos = top_pos + else + return + end + elseif get_ndef(above_node.name)["buildable_to"] then + place_pos = pt.above + end + if not place_pos then return end -- something went wrong :P + + local pname = placer:get_player_name() + if not minetest.is_protected(place_pos, pname) then + + local nodename = "default:cobble" -- :D + + if not keys["sneak"] then + --local node = minetest.get_node(pt.under) + local seaweed = math.random(1,4) + if seaweed == 1 then + nodename = "flowers:seaweed" + elseif seaweed == 2 then + nodename = "flowers:seaweed_2" + elseif seaweed == 3 then + nodename = "flowers:seaweed_3" + elseif seaweed == 4 then + nodename = "flowers:seaweed_4" + end + minetest.swap_node(place_pos, {name = nodename, param2 = math.random(0,3) }) + else + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.swap_node(place_pos, {name = "flowers:seaweed", param2 = fdir}) + end + + if not minetest.is_creative_enabled(pname) then + itemstack:take_item() + end + return itemstack + end + end, + }) + + minetest.register_decoration({ + name = "flowers:seaweed"..num, + decoration = {"flowers:seaweed"..num}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = {"default:dirt_with_grass", "default:sand"}, + num_spawn_by = 1, + fill_ratio = seaweed_rarity, + check_offset = -1, + y_min = 1, + y_max = 1, + }) + + minetest.register_decoration({ + name = "flowers:seaweed"..num .."_sand", + decoration = {"flowers:seaweed"..num}, + place_on = {"default:sand"}, + deco_type = "simple", + flags = "all_floors", + spawn_by = "default:water_source", + num_spawn_by = 1, + fill_ratio = seaweed_rarity*1.2, + check_offset = -1, + y_min = 1, + y_max = 1, + }) +end + +minetest.register_alias("flowers:flower_seaweed", "flowers:seaweed") +minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed") +minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed") +minetest.register_alias("along_shore:seaweed_2", "flowers:seaweed_2") +minetest.register_alias("along_shore:seaweed_3", "flowers:seaweed_3") +minetest.register_alias("along_shore:seaweed_4", "flowers:seaweed_4") diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr new file mode 100644 index 0000000..989d7c0 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.de.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Seegras diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr new file mode 100644 index 0000000..39dbbcf --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.fr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algues diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr new file mode 100644 index 0000000..0e11bb1 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seaweed.tr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Deniz yosunu diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr new file mode 100644 index 0000000..f76dfe2 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algo diff --git a/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr new file mode 100644 index 0000000..bcd13a2 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.es.tr @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed=Algas marinas diff --git a/mods/plantlife_modpack/pl_seaweed/locale/template.txt b/mods/plantlife_modpack/pl_seaweed/locale/template.txt new file mode 100644 index 0000000..e2f00f6 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: pl_seaweed +Seaweed= diff --git a/mods/plantlife_modpack/pl_seaweed/mod.conf b/mods/plantlife_modpack/pl_seaweed/mod.conf new file mode 100644 index 0000000..73a791c --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/mod.conf @@ -0,0 +1,2 @@ +name = pl_seaweed +optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_seaweed/settingtypes.txt b/mods/plantlife_modpack/pl_seaweed/settingtypes.txt new file mode 100644 index 0000000..8c073c5 --- /dev/null +++ b/mods/plantlife_modpack/pl_seaweed/settingtypes.txt @@ -0,0 +1,2 @@ +# Seaweed rarity (higher number -> higher probability) +pl_seaweed.seaweed_rarity (Seaweed rarity) float 0.06 0.0001 1 diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed.png new file mode 100644 index 0000000..b5bd99c Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweedLight.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweedLight.png new file mode 100644 index 0000000..7595ebc Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweedLight.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_2.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_2.png new file mode 100644 index 0000000..0b24730 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_2.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_3.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_3.png new file mode 100644 index 0000000..d9b7f43 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_3.png differ diff --git a/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_4.png b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_4.png new file mode 100644 index 0000000..887c183 Binary files /dev/null and b/mods/plantlife_modpack/pl_seaweed/textures/flowers_seaweed_4.png differ diff --git a/mods/plantlife_modpack/pl_sunflowers/init.lua b/mods/plantlife_modpack/pl_sunflowers/init.lua new file mode 100644 index 0000000..738cab6 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/init.lua @@ -0,0 +1,57 @@ +-- support for i18n +local S = minetest.get_translator("pl_sunflowers") + +local sunflower_rarity = minetest.settings:get("pl_sunflowers.sunflower_rarity") or 0.005 + +local box = { + type="fixed", + fixed = { { -0.2, -0.5, -0.2, 0.2, 0.5, 0.2 } }, +} + +local sunflower_drop = "farming:seed_wheat" +if minetest.registered_items["farming:seed_spelt"] then + sunflower_drop = "farming:seed_spelt" +end + +minetest.register_node(":flowers:sunflower", { + description = S("Sunflower"), + drawtype = "mesh", + paramtype = "light", + paramtype2 = "degrotate", + inventory_image = "flowers_sunflower_inv.png", + mesh = "flowers_sunflower.obj", + tiles = { "flowers_sunflower.png" }, + use_texture_alpha = "clip", + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { dig_immediate=3, flora=1, flammable=3, attached_node=1 }, + sounds = default.node_sound_leaves_defaults(), + selection_box = box, + collision_box = box, + drop = { + max_items = 1, + items = { + {items = {sunflower_drop}, rarity = 8}, + {items = {"flowers:sunflower"}}, + } + } +}) + +minetest.register_decoration({ + decoration = { + "flowers:sunflower" + }, + fill_ratio = sunflower_rarity, + y_min = 1, + y_max = 40, + param2 = 0, + param2_max = 239, + place_on = { + "default:dirt_with_grass" + }, + deco_type = "simple", + flags = "all_floors", +}) + +minetest.register_alias("sunflower:sunflower", "flowers:sunflower") diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr new file mode 100644 index 0000000..d82b0c7 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.de.tr @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower=Sonnenblume diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr new file mode 100644 index 0000000..f9203e0 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower=Sunfloro diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr new file mode 100644 index 0000000..2d5edc3 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.es.tr @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower=Girasol diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr new file mode 100644 index 0000000..aea069f --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.fr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower=Tournesol diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr new file mode 100644 index 0000000..13e5a85 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.tr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower=Ayçiçeği diff --git a/mods/plantlife_modpack/pl_sunflowers/locale/template.txt b/mods/plantlife_modpack/pl_sunflowers/locale/template.txt new file mode 100644 index 0000000..96186a8 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: pl_sunflowers +Sunflower= diff --git a/mods/plantlife_modpack/pl_sunflowers/mod.conf b/mods/plantlife_modpack/pl_sunflowers/mod.conf new file mode 100644 index 0000000..238079e --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/mod.conf @@ -0,0 +1,2 @@ +name = pl_sunflowers +optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_sunflowers/models/flowers_sunflower.obj b/mods/plantlife_modpack/pl_sunflowers/models/flowers_sunflower.obj new file mode 100644 index 0000000..35beb8d --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/models/flowers_sunflower.obj @@ -0,0 +1,73 @@ +# Blender v2.70 (sub 0) OBJ File: 'sunflower.blend' +# www.blender.org +mtllib sunflower_sunflower.mtl +o Cube +v -0.015625 -0.500000 0.028125 +v -0.015625 -0.500000 -0.028125 +v 0.028125 -0.500000 -0.028125 +v 0.028125 -0.500000 0.028125 +v -0.015625 0.790890 0.028125 +v -0.015625 0.689140 -0.028125 +v 0.028125 0.689140 -0.028125 +v 0.028125 0.790890 0.028125 +v 0.250000 0.533494 -0.125000 +v -0.250000 0.533494 -0.125000 +v 0.250000 0.966506 0.125000 +v -0.250000 0.966506 0.125000 +v 0.267063 0.373606 -0.088749 +v 0.044375 0.303464 -0.141576 +v 0.239202 0.473737 0.108253 +v -0.008452 0.378817 0.108253 +v 0.017721 0.016639 -0.112053 +v -0.231280 0.110242 -0.115181 +v -0.030356 -0.036246 0.146223 +v -0.252831 0.028885 0.088910 +v 0.062500 0.641747 -0.057917 +v -0.106953 0.097386 -0.113617 +v -0.006318 -0.053008 0.024707 +v 0.118968 0.360674 0.006909 +v 0.116101 0.452031 0.108253 +v 0.017962 0.298392 -0.019504 +v 0.145794 0.358736 -0.115163 +v 0.240237 0.375544 0.033323 +v -0.224509 0.021356 -0.032606 +v -0.131273 0.023638 0.117567 +v -0.102951 0.016109 -0.003950 +vt 0.750000 0.875000 +vt 0.625000 0.875000 +vt 0.625000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.000100 0.500100 +vt 0.499900 0.500100 +vt 0.499900 0.999900 +vt 0.000100 0.999900 +vt 0.250000 0.250000 +vt 0.500000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.250000 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.000000 0.500000 +vt 0.500000 0.000000 +usemtl Sunflower +s off +f 1/1 2/2 3/3 4/4 +f 5/5 8/6 7/2 6/1 +f 1/7 5/8 6/9 2/6 +f 2/7 6/6 7/9 3/8 +f 3/7 7/8 8/9 4/6 +f 5/7 1/8 4/9 8/6 +f 9/10 10/11 12/12 11/13 +f 24/14 26/15 16/8 25/16 +f 31/14 29/17 20/18 30/19 +f 17/8 22/16 31/14 23/15 +f 22/16 18/20 29/17 31/14 +f 27/19 14/21 26/15 24/14 +f 13/18 27/19 24/14 28/17 +f 23/15 31/14 30/19 19/21 +f 28/17 24/14 25/16 15/20 diff --git a/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt b/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt new file mode 100644 index 0000000..0de2098 --- /dev/null +++ b/mods/plantlife_modpack/pl_sunflowers/settingtypes.txt @@ -0,0 +1,2 @@ +# Sunflower rarity (higher number -> higher probability) +pl_sunflowers.sunflower_rarity (Sunflower rarity) float 0.005 0.0001 1 diff --git a/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png new file mode 100644 index 0000000..0455378 Binary files /dev/null and b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower.png differ diff --git a/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png new file mode 100644 index 0000000..3605d77 Binary files /dev/null and b/mods/plantlife_modpack/pl_sunflowers/textures/flowers_sunflower_inv.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/init.lua b/mods/plantlife_modpack/pl_waterlilies/init.lua new file mode 100644 index 0000000..430dcc5 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/init.lua @@ -0,0 +1,185 @@ +-- support for i18n +local S = minetest.get_translator("pl_waterlilies") + +local fill_ratio = minetest.settings:get("pl_waterlilies.waterlily_rarity") or 0.03 + +local function get_ndef(name) + return minetest.registered_nodes[name] or {} +end + +local lilies_list = { + { nil , nil , 1 }, + { "225", "22.5" , 2 }, + { "45" , "45" , 3 }, + { "675", "67.5" , 4 }, + { "s1" , "small_1" , 5 }, + { "s2" , "small_2" , 6 }, + { "s3" , "small_3" , 7 }, + { "s4" , "small_4" , 8 }, +} + +local lilynames_list = {} +for i in ipairs(lilies_list) do + local deg1 = "" + if lilies_list[i][1] ~= nil then + deg1 = "_"..lilies_list[i][1] + end + table.insert(lilynames_list, "flowers:waterlily"..deg1) +end + +for i in ipairs(lilies_list) do + local deg1 = "" + local deg2 = "" + local lily_groups = {snappy = 3,flammable=2,flower=1} + + if lilies_list[i][1] ~= nil then + deg1 = "_"..lilies_list[i][1] + deg2 = "_"..lilies_list[i][2] + lily_groups = { snappy = 3,flammable=2,flower=1, not_in_creative_inventory=1 } + end + + minetest.register_node(":flowers:waterlily"..deg1, { + description = S("Waterlily"), + drawtype = "nodebox", + tiles = { + "flowers_waterlily"..deg2..".png", + "flowers_waterlily"..deg2..".png^[transformFY" + }, + use_texture_alpha = "clip", + inventory_image = "flowers_waterlily.png", + wield_image = "flowers_waterlily.png", + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + groups = lily_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = { -0.4, -0.5, -0.4, 0.4, -0.45, 0.4 }, + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.49, -0.5, 0.5, -0.49, 0.5 }, + }, + buildable_to = true, + node_placement_prediction = "", + + liquids_pointable = true, + drop = "flowers:waterlily", + on_place = function(itemstack, placer, pointed_thing) + if not itemstack or not placer or not pointed_thing then + return + end + + local keys = placer:get_player_control() + local pt = pointed_thing + + local place_pos = nil + local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local under_node = minetest.get_node(pt.under) + local above_node = minetest.get_node(pt.above) + local top_node = minetest.get_node(top_pos) + + if get_ndef(under_node.name)["buildable_to"] then + if under_node.name ~= "default:water_source" then + place_pos = pt.under + elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then + place_pos = top_pos + else + return + end + elseif get_ndef(above_node.name)["buildable_to"] then + place_pos = pt.above + end + + local pname = placer:get_player_name() + if place_pos and not minetest.is_protected(place_pos, pname) then + + local nodename = "default:cobble" -- if this block appears, something went....wrong :-) + + if not keys["sneak"] then + local waterlily = math.random(1,8) + if waterlily == 1 then + nodename = "flowers:waterlily" + elseif waterlily == 2 then + nodename = "flowers:waterlily_225" + elseif waterlily == 3 then + nodename = "flowers:waterlily_45" + elseif waterlily == 4 then + nodename = "flowers:waterlily_675" + elseif waterlily == 5 then + nodename = "flowers:waterlily_s1" + elseif waterlily == 6 then + nodename = "flowers:waterlily_s2" + elseif waterlily == 7 then + nodename = "flowers:waterlily_s3" + elseif waterlily == 8 then + nodename = "flowers:waterlily_s4" + end + minetest.swap_node(place_pos, {name = nodename, param2 = math.random(0,3) }) + else + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.swap_node(place_pos, {name = "flowers:waterlily", param2 = fdir}) + end + + if not minetest.is_creative_enabled(pname) then + itemstack:take_item() + end + return itemstack + end + end, + }) + + minetest.register_decoration({ + name = "flowers:waterlily"..deg1, + decoration = {"flowers:waterlily"..deg1}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = "default:sand", + num_spawn_by = 1, + fill_ratio = fill_ratio, + check_offset = -1, + y_min = 1, + y_max = 1, + }) + + minetest.register_decoration({ + name = "flowers:waterlily"..deg1 .."_relative", + decoration = {"flowers:waterlily"..deg1}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = lilynames_list, + num_spawn_by = 1, + fill_ratio = fill_ratio*1.25, + check_offset = -1, + y_min = 1, + y_max = 1, + }) + + minetest.register_decoration({ + name = "flowers:waterlily"..deg1 .."_relative", + decoration = {"flowers:waterlily"..deg1}, + place_on = {"default:water_source"}, + deco_type = "simple", + flags = "liquid_surface", + spawn_by = lilynames_list, + num_spawn_by = 1, + fill_ratio = fill_ratio*1.5, + check_offset = -1, + y_min = 1, + y_max = 1, + }) +end + +minetest.register_alias( "flowers:flower_waterlily", "flowers:waterlily") +minetest.register_alias( "flowers:flower_waterlily_225", "flowers:waterlily_225") +minetest.register_alias( "flowers:flower_waterlily_45", "flowers:waterlily_45") +minetest.register_alias( "flowers:flower_waterlily_675", "flowers:waterlily_675") +minetest.register_alias( "trunks:lilypad", "flowers:waterlily_s1") +minetest.register_alias( "along_shore:lilypads_1", "flowers:waterlily_s1") +minetest.register_alias( "along_shore:lilypads_2", "flowers:waterlily_s2") +minetest.register_alias( "along_shore:lilypads_3", "flowers:waterlily_s3") +minetest.register_alias( "along_shore:lilypads_4", "flowers:waterlily_s4") diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr new file mode 100644 index 0000000..09558c5 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.de.tr @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily=Seerose diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr new file mode 100644 index 0000000..c2de467 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily=Akvolilio diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr new file mode 100644 index 0000000..55f8874 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.es.tr @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily=Lirio de agua diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr new file mode 100644 index 0000000..0770369 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.fr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily=Nénuphar diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr new file mode 100644 index 0000000..b9f30e4 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.tr.tr @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily=Nilüfer diff --git a/mods/plantlife_modpack/pl_waterlilies/locale/template.txt b/mods/plantlife_modpack/pl_waterlilies/locale/template.txt new file mode 100644 index 0000000..f9399c7 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: pl_waterlilies +Waterlily= diff --git a/mods/plantlife_modpack/pl_waterlilies/mod.conf b/mods/plantlife_modpack/pl_waterlilies/mod.conf new file mode 100644 index 0000000..3e96eb3 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/mod.conf @@ -0,0 +1,2 @@ +name = pl_waterlilies +optional_depends = farming, flowers diff --git a/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt b/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt new file mode 100644 index 0000000..c0e1062 --- /dev/null +++ b/mods/plantlife_modpack/pl_waterlilies/settingtypes.txt @@ -0,0 +1,2 @@ +# Waterlily rarity (higher number -> higher probability) +pl_waterlilies.waterlily_rarity (Waterlily rarity) float 0.03 0.0001 1 diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily.png new file mode 100644 index 0000000..7b58bb2 Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_22.5.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_22.5.png new file mode 100644 index 0000000..73647ac Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_22.5.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_45.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_45.png new file mode 100644 index 0000000..7ca683e Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_45.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_67.5.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_67.5.png new file mode 100644 index 0000000..234da60 Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_67.5.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_1.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_1.png new file mode 100644 index 0000000..a2d88cd Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_1.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_2.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_2.png new file mode 100644 index 0000000..7d2ba86 Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_2.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_3.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_3.png new file mode 100644 index 0000000..bfcab90 Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_3.png differ diff --git a/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_4.png b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_4.png new file mode 100644 index 0000000..8119ea7 Binary files /dev/null and b/mods/plantlife_modpack/pl_waterlilies/textures/flowers_waterlily_small_4.png differ diff --git a/mods/plantlife_modpack/poisonivy/init.lua b/mods/plantlife_modpack/poisonivy/init.lua new file mode 100644 index 0000000..cdc238e --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/init.lua @@ -0,0 +1,138 @@ +-- This file supplies poison ivy for the plantlife modpack + +-- support for i18n +local S = minetest.get_translator("poisonivy") + +local walls_list = { + "default:dirt", + "default:dirt_with_grass", + "default:stone", + "default:cobble", + "default:mossycobble", + "default:brick", + "default:tree", + "default:jungletree", + "default:stone_with_coal", + "default:stone_with_iron" +} +minetest.register_node('poisonivy:seedling', { + description = S("Poison ivy (seedling)"), + drawtype = 'plantlike', + waving = 1, + tiles = { 'poisonivy_seedling.png' }, + inventory_image = 'poisonivy_seedling.png', + wield_image = 'poisonivy_seedling.png', + sunlight_propagates = true, + paramtype = 'light', + walkable = false, + groups = { snappy = 3, poisonivy=1, flora_block=1, attached_node=1 }, + sounds = default.node_sound_leaves_defaults(), + buildable_to = true, +}) + +minetest.register_node('poisonivy:sproutling', { + description = S("Poison ivy (sproutling)"), + drawtype = 'plantlike', + waving = 1, + tiles = { 'poisonivy_sproutling.png' }, + inventory_image = 'poisonivy_sproutling.png', + wield_image = 'poisonivy_sproutling.png', + sunlight_propagates = true, + paramtype = 'light', + walkable = false, + groups = { snappy = 3, poisonivy=1, flora_block=1, attached_node=1 }, + sounds = default.node_sound_leaves_defaults(), + buildable_to = true, +}) + +minetest.register_node('poisonivy:climbing', { + description = S("Poison ivy (climbing plant)"), + drawtype = 'signlike', + tiles = { 'poisonivy_climbing.png' }, + inventory_image = 'poisonivy_climbing.png', + wield_image = 'poisonivy_climbing.png', + sunlight_propagates = true, + paramtype = 'light', + paramtype2 = 'wallmounted', + walkable = false, + groups = { snappy = 3, poisonivy=1, flora_block=1, attached_node=1 }, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "wallmounted", + --wall_side = = + }, + buildable_to = true, +}) + +local function find_adjacent_wall(pos, verticals, randomflag) + local verts = dump(verticals) + + if string.find(verts, minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end + if string.find(verts, minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end + if string.find(verts, minetest.get_node({x=pos.x , y=pos.y, z=pos.z-1}).name) then return 5 end + if string.find(verts, minetest.get_node({x=pos.x , y=pos.y, z=pos.z+1}).name) then return 4 end + + return nil +end + +minetest.register_abm({ + nodenames = {"default:dirt_with_grass"}, + interval = 1000, + chance = 20, + label = "[poisoninvy] spawn plants", + min_y = -16, + max_y = 48, + action = function(pos, node) + local p_top = {x = pos.x, y = pos.y + 1, z = pos.z} + local n_top = minetest.get_node_or_nil(p_top) + if not n_top or n_top.name ~= "air" then return end + + local n_light = minetest.get_node_light(p_top) + if n_light < 7 then + return + end + + if minetest.find_node_near(p_top, 10 + math.random(-1.5,2), {"group:poisonivy", "group:flower"}) then + return -- Nodes to avoid are nearby + end + + local walldir = find_adjacent_wall(p_top, walls_list) + if walldir then + minetest.swap_node(p_top, {name = "poisonivy:climbing", param2 = walldir}) + return + end + + minetest.swap_node(p_top, {name = "poisonivy:seedling", param2 = 0}) + end +}) + +minetest.register_abm({ + nodenames = {"poisonivy:seedling"}, + interval = 1000, + chance = 30, + label = "grow poisonivy", + action = function(pos, node) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local n_top = minetest.get_node(p_top) + + if n_top.name == "air" then + minetest.swap_node(pos, {name = "poisonivy:sproutling"}) + end + end +}) + +minetest.register_abm({ + nodenames = {"poisonivy:climbing"}, + interval = 500, + chance = 60, + label = "grow climbing poisonivy", + action = function(pos, node) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local n_top = minetest.get_node(p_top) + + local walldir = find_adjacent_wall(p_top, walls_list) + if n_top.name == "air" and walldir then + minetest.swap_node(p_top, {name = "poisonivy:climbing", param2 = walldir}) + end + end +}) \ No newline at end of file diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr new file mode 100644 index 0000000..5a678a5 --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.de.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Giftefeu (Sämling) +Poison ivy (sproutling)=Giftefeu (Sprössling) +Poison ivy (climbing plant)=Giftefeu (Kletterpflanze) diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr new file mode 100644 index 0000000..8db7877 --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Venena hedero (plantido) +Poison ivy (sproutling)=Venena hedero (ĝermanta) +Poison ivy (climbing plant)=Venena hedero (grimpplanto) diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr new file mode 100644 index 0000000..58f2f21 --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.es.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Hiedra venenosa (retoño) +Poison ivy (sproutling)=Hiedra venenosa (brotes) +Poison ivy (climbing plant)=Hiedra venenosa (planta trepadora) diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr new file mode 100644 index 0000000..519648e --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.fr.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Sumac vénéneux (semis) +Poison ivy (sproutling)=Sumac vénéneux (pousse) +Poison ivy (climbing plant)=Sumac vénéneux (grimpant) diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr new file mode 100644 index 0000000..9ef066d --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Hera venenosa (plantilha) +Poison ivy (sproutling)=Hera venenosa (brotando) +Poison ivy (climbing plant)=Hera venenosa (planta trepadeira) diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr new file mode 100644 index 0000000..d158d7c --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)= +Poison ivy (sproutling)= +Poison ivy (climbing plant)= diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.template.trt b/mods/plantlife_modpack/poisonivy/locale/poisonivy.template.trt new file mode 100644 index 0000000..512efec --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.template.trt @@ -0,0 +1,12 @@ +# textdomain: poisonivy + +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# + +Poison ivy (seedling)= +Poison ivy (sproutling)= +Poison ivy (climbing plant)= +[Poison Ivy] Loaded.= diff --git a/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr b/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr new file mode 100644 index 0000000..0e12f01 --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/poisonivy.tr.tr @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)=Sarmaşık (Fidan) +Poison ivy (sproutling)=Sarmaşık (Filiz) +Poison ivy (climbing plant)=Sarmaşık (Dolanan) diff --git a/mods/plantlife_modpack/poisonivy/locale/template.txt b/mods/plantlife_modpack/poisonivy/locale/template.txt new file mode 100644 index 0000000..d158d7c --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: poisonivy +Poison ivy (seedling)= +Poison ivy (sproutling)= +Poison ivy (climbing plant)= diff --git a/mods/plantlife_modpack/poisonivy/mod.conf b/mods/plantlife_modpack/poisonivy/mod.conf new file mode 100644 index 0000000..da42df7 --- /dev/null +++ b/mods/plantlife_modpack/poisonivy/mod.conf @@ -0,0 +1,2 @@ +name = poisonivy +depends = default diff --git a/mods/plantlife_modpack/poisonivy/textures/poisonivy_climbing.png b/mods/plantlife_modpack/poisonivy/textures/poisonivy_climbing.png new file mode 100644 index 0000000..f53f7a3 Binary files /dev/null and b/mods/plantlife_modpack/poisonivy/textures/poisonivy_climbing.png differ diff --git a/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png b/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png new file mode 100644 index 0000000..aec2965 Binary files /dev/null and b/mods/plantlife_modpack/poisonivy/textures/poisonivy_seedling.png differ diff --git a/mods/plantlife_modpack/poisonivy/textures/poisonivy_sproutling.png b/mods/plantlife_modpack/poisonivy/textures/poisonivy_sproutling.png new file mode 100644 index 0000000..92d2742 Binary files /dev/null and b/mods/plantlife_modpack/poisonivy/textures/poisonivy_sproutling.png differ diff --git a/mods/plantlife_modpack/trunks/crafting.lua b/mods/plantlife_modpack/trunks/crafting.lua new file mode 100644 index 0000000..63bf7d4 --- /dev/null +++ b/mods/plantlife_modpack/trunks/crafting.lua @@ -0,0 +1,133 @@ +-- Code by Mossmanikin +----------------------------------------------------------------------------------------------- +-- TWiGS +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- *leaves --> twigs + output = "trunks:twig_1 2", + recipe = {{"group:leafdecay"}} +}) +if minetest.get_modpath("moretrees") ~= nil then +minetest.register_craft({ -- moretrees_leaves --> twigs + output = "trunks:twig_1 2", + recipe = {{"group:moretrees_leaves"}} +}) +minetest.register_craft({ -- except moretrees:palm_leaves + output = "moretrees:palm_leaves", + recipe = {{"moretrees:palm_leaves"}} +}) +end +if minetest.get_modpath("bushes") ~= nil then +minetest.register_craft({ -- BushLeaves --> twigs + output = "trunks:twig_1 2", + recipe = {{"bushes:BushLeaves1"}} +}) +minetest.register_craft({ + output = "trunks:twig_1 2", + recipe = {{"bushes:BushLeaves2"}} +}) +minetest.register_craft({ -- bushbranches --> twigs + output = "trunks:twig_1 4", + recipe = {{"bushes:bushbranches1"}} +}) +minetest.register_craft({ + output = "trunks:twig_1 4", + recipe = {{"bushes:bushbranches2"}} +}) +minetest.register_craft({ + output = "trunks:twig_1 4", + recipe = {{"bushes:bushbranches3"}} +}) +minetest.register_craft({ + output = "trunks:twig_1 4", + recipe = {{"bushes:bushbranches4"}} +}) +end +minetest.register_craft({ -- twigs block --> twigs + output = "trunks:twig_1 8", + recipe = {{"trunks:twigs"}} +}) +minetest.register_craft({ -- twigs_slab --> twigs + output = "trunks:twig_1 4", + recipe = {{"trunks:twigs_slab"}} +}) +minetest.register_craft({ -- twigs_roof --> twigs + output = "trunks:twig_1 4", + recipe = {{"trunks:twigs_roof"}} +}) +minetest.register_craft({ -- twigs_roof_corner --> twigs + output = "trunks:twig_1 3", + recipe = {{"trunks:twigs_roof_corner"}} +}) +minetest.register_craft({ -- twigs_roof_corner_2 --> twigs + output = "trunks:twig_1 3", + recipe = {{"trunks:twigs_roof_corner_2"}} +}) +----------------------------------------------------------------------------------------------- +-- STiCK +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- twig --> stick + output = "default:stick", + recipe = {{"trunks:twig_1"}} +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS BLoCK +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- twigs --> twigs block + output = "trunks:twigs", + recipe = { + {"trunks:twig_1","trunks:twig_1","trunks:twig_1"}, + {"trunks:twig_1", "" ,"trunks:twig_1"}, + {"trunks:twig_1","trunks:twig_1","trunks:twig_1"}, + } +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS SLaBS +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- twigs blocks --> twigs_slabs + output = "trunks:twigs_slab 6", + recipe = { + {"trunks:twigs","trunks:twigs","trunks:twigs"}, + } +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS RooFS +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- twigs blocks --> twigs_roofs + output = "trunks:twigs_roof 4", + recipe = { + {"trunks:twigs",""}, + {"","trunks:twigs"}, + } +}) +minetest.register_craft({ + output = "trunks:twigs_roof 4", + recipe = { + {"","trunks:twigs"}, + {"trunks:twigs",""}, + } +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS RooF CoRNeRS +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- twigs blocks --> twigs_roof_corners + output = "trunks:twigs_roof_corner 8", + recipe = { + { "" ,"trunks:twigs", "" }, + {"trunks:twigs", "" ,"trunks:twigs"}, + } +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS RooF CoRNeRS 2 +----------------------------------------------------------------------------------------------- +minetest.register_craft({ -- twigs blocks --> twigs_roof_corner_2's + output = "trunks:twigs_roof_corner_2 8", + recipe = { + {"trunks:twigs", "" ,"trunks:twigs"}, + { "" ,"trunks:twigs", "" }, + } +}) diff --git a/mods/plantlife_modpack/trunks/generating.lua b/mods/plantlife_modpack/trunks/generating.lua new file mode 100644 index 0000000..0171eca --- /dev/null +++ b/mods/plantlife_modpack/trunks/generating.lua @@ -0,0 +1,510 @@ +-- Code by Mossmanikin, Neuromancer, and others + +----------------------------------------------------------------------------------------------- +-- TWiGS +----------------------------------------------------------------------------------------------- + +function check_node_buildable_to(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + if def then + return def.buildable_to + end +end + +abstract_trunks.place_twig = function(pos) + local twig_size = math.random(1,27) + + local right_here = {x=pos.x , y=pos.y+1, z=pos.z } + local north = {x=pos.x , y=pos.y+1, z=pos.z+1} + local north_east = {x=pos.x+1, y=pos.y+1, z=pos.z+1} + local east = {x=pos.x+1, y=pos.y+1, z=pos.z } + local south_east = {x=pos.x+1, y=pos.y+1, z=pos.z-1} + local south = {x=pos.x , y=pos.y+1, z=pos.z-1} + local south_west = {x=pos.x-1, y=pos.y+1, z=pos.z-1} + local west = {x=pos.x-1, y=pos.y+1, z=pos.z } + local north_west = {x=pos.x-1, y=pos.y+1, z=pos.z+1} + +-- small twigs + if twig_size <= 16 then + minetest.swap_node(right_here, {name="trunks:twig_"..math.random(1,4), param2=math.random(0,3)}) + end +-- big twig 1 + if twig_size == 17 then + if not (check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z+1}) + or check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_5"}) + end + if check_node_buildable_to(north_east) then + minetest.swap_node(north_east, {name="trunks:twig_7"}) + end + if check_node_buildable_to(east) then + minetest.swap_node(east, {name="trunks:twig_8"}) + end + end + elseif twig_size == 18 then + if not (check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z-1}) + or check_node_buildable_to({x=pos.x,y=pos.y,z=pos.z-1})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_5", param2=1}) + end + if check_node_buildable_to(south_east) then + minetest.swap_node(south_east, {name="trunks:twig_7", param2=1}) + end + if check_node_buildable_to(south) then + minetest.swap_node(south, {name="trunks:twig_8", param2=1}) + end + end + elseif twig_size == 19 then + if not (check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z-1}) + or check_node_buildable_to({x=pos.x-1,y=pos.y,z=pos.z})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_5", param2=2}) + end + if check_node_buildable_to(south_west) then + minetest.swap_node(south_west, {name="trunks:twig_7", param2=2}) + end + if check_node_buildable_to(west) then + minetest.swap_node(west, {name="trunks:twig_8", param2=2}) + end + end + elseif twig_size == 20 then + if not (check_node_buildable_to({x=pos.x-1,y=pos.y,z=pos.z+1}) + or check_node_buildable_to({x=pos.x,y=pos.y,z=pos.z+1})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_5", param2=3}) + end + if check_node_buildable_to(north_west) then + minetest.swap_node(north_west, {name="trunks:twig_7", param2=3}) + end + if check_node_buildable_to(north) then + minetest.swap_node(north, {name="trunks:twig_8", param2=3}) + end + end +-- big twig 2 + elseif twig_size == 21 then + if not (check_node_buildable_to({x=pos.x,y=pos.y,z=pos.z+1}) + or check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z+1})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_9"}) + end + if check_node_buildable_to(north) then + minetest.swap_node(north, {name="trunks:twig_10"}) + end + if check_node_buildable_to(north_east) then + minetest.swap_node(north_east, {name="trunks:twig_11"}) + end + end + elseif twig_size == 22 then + if not (check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z}) + or check_node_buildable_to({x=pos.x+1,y=pos.y,z=pos.z-1})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_9", param2=1}) + end + if check_node_buildable_to(east) then + minetest.swap_node(east, {name="trunks:twig_10", param2=1}) + end + if check_node_buildable_to(south_east) then + minetest.swap_node(south_east, {name="trunks:twig_11", param2=1}) + end + end + elseif twig_size == 23 then + if not (check_node_buildable_to({x=pos.x,y=pos.y,z=pos.z-1}) + or check_node_buildable_to({x=pos.x-1,y=pos.y,z=pos.z-1})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_9", param2=2}) + end + if check_node_buildable_to(south) then + minetest.swap_node(south, {name="trunks:twig_10", param2=2}) + end + if check_node_buildable_to(south_west) then + minetest.swap_node(south_west, {name="trunks:twig_11", param2=2}) + end + end + elseif twig_size == 24 then + if not (check_node_buildable_to({x=pos.x-1,y=pos.y,z=pos.z}) + or check_node_buildable_to({x=pos.x-1,y=pos.y,z=pos.z+1})) then + + if check_node_buildable_to(right_here) then + minetest.swap_node(right_here, {name="trunks:twig_9", param2=3}) + end + if check_node_buildable_to(west) then + minetest.swap_node(west, {name="trunks:twig_10", param2=3}) + end + if check_node_buildable_to(north_west) then + minetest.swap_node(north_west, {name="trunks:twig_11", param2=3}) + end + end + elseif twig_size <= 25 then + minetest.swap_node(right_here, {name="trunks:twig_"..math.random(12,13), param2=math.random(0,3)}) + end +end + +biome_lib.register_on_generate({ + surface = {"default:dirt_with_grass"}, + max_count = 640, + rarity = 66, + min_elevation = 1, + max_elevation = 40, + near_nodes = {"group:tree","ferns:fern_03","ferns:fern_02","ferns:fern_01"}, + near_nodes_size = 3, + near_nodes_vertical = 1, + near_nodes_count = 1, + plantlife_limit = -0.9, + }, + abstract_trunks.place_twig +) + +biome_lib.register_on_generate({ + surface = {"default:water_source"}, + max_count = 320, + rarity = 33, + min_elevation = 1, + max_elevation = 40, + near_nodes = {"group:tree"}, + near_nodes_size = 3, + near_nodes_vertical = 1, + near_nodes_count = 1, + plantlife_limit = -0.9, + }, + abstract_trunks.place_twig +) + +----------------------------------------------------------------------------------------------- +-- TRuNKS +----------------------------------------------------------------------------------------------- +local TRuNKS = { +-- MoD TRuNK NR + {"default", "tree", 1}, + {"default", "jungletree", 2}, + {"default", "pine_tree", 12}, + + {"trees", "tree_conifer", 3}, + {"trees", "tree_mangrove", 4}, + {"trees", "tree_palm", 5}, + + {"moretrees", "apple_tree_trunk", 6}, + {"moretrees", "beech_trunk", 7}, + {"moretrees", "birch_trunk", 8}, + {"moretrees", "fir_trunk", 9}, + {"moretrees", "oak_trunk", 10}, + {"moretrees", "palm_trunk", 11}, + {"moretrees", "rubber_tree_trunk", 13}, + {"moretrees", "rubber_tree_trunk_empty", 14}, + {"moretrees", "sequoia_trunk", 15}, + {"moretrees", "spruce_trunk", 16}, + {"moretrees", "willow_trunk", 17}, +} + +for i in pairs(TRuNKS) do + local MoD = TRuNKS[i][1] + local TRuNK = TRuNKS[i][2] + local NR = TRuNKS[i][3] + local trunkname = MoD..":"..TRuNK + if minetest.get_modpath(MoD) ~= nil + and NR < 6 -- moretrees trunks allready have facedir + and minetest.registered_nodes[trunkname] then -- the node being called exists. + temptrunk = table.copy(minetest.registered_nodes[trunkname]) + temptrunk.paramtype2 = "facedir" + minetest.register_node(":"..trunkname, temptrunk) + end +end + +abstract_trunks.place_trunk = function(pos) + + local right_here = {x=pos.x, y=pos.y+1, z=pos.z} + local north = {x=pos.x, y=pos.y+1, z=pos.z+1} + local north2 = {x=pos.x, y=pos.y+1, z=pos.z+2} + local south = {x=pos.x, y=pos.y+1, z=pos.z-1} + local south2 = {x=pos.x, y=pos.y+1, z=pos.z-2} + local west = {x=pos.x-1, y=pos.y+1, z=pos.z} + local west2 = {x=pos.x-2, y=pos.y+1, z=pos.z} + local east = {x=pos.x+1, y=pos.y+1, z=pos.z} + local east2 = {x=pos.x+2, y=pos.y+1, z=pos.z} + + if check_node_buildable_to(right_here) then -- instead of check_air = true, + for i in pairs(TRuNKS) do + local MoD = TRuNKS[i][1] + local TRuNK = TRuNKS[i][2] + local NR = TRuNKS[i][3] + local chance = math.random(1, 17) + local length = math.random(3,5) + if chance == NR then + local trunk_type = math.random(1,3) + if trunk_type == 1 then + if minetest.get_modpath(MoD) ~= nil then + minetest.swap_node(right_here, {name=MoD..":"..TRuNK}) + else + minetest.swap_node(right_here, {name="default:tree"}) + end + elseif trunk_type == 2 then + if minetest.get_modpath(MoD) ~= nil then + if check_node_buildable_to(north) then + minetest.swap_node(north, {name=MoD..":"..TRuNK, param2=4}) + end + + if length >= 4 and check_node_buildable_to(north2) then + minetest.swap_node(north2, {name=MoD..":"..TRuNK, param2=4}) + end + + minetest.swap_node(right_here, {name=MoD..":"..TRuNK, param2=4}) + if check_node_buildable_to(south) then + minetest.swap_node(south, {name=MoD..":"..TRuNK, param2=4}) + end + if length == 5 and check_node_buildable_to(south2) then + minetest.swap_node(south2, {name=MoD..":"..TRuNK, param2=4}) + end + else + if check_node_buildable_to(north) then + minetest.swap_node(north, {name="default:tree", param2=4}) + end + if length >= 4 and check_node_buildable_to(north2) then + minetest.swap_node(north2, {name="default:tree", param2=4}) + end + minetest.swap_node(right_here, {name="default:tree", param2=4}) + if check_node_buildable_to(south) then + minetest.swap_node(south, {name="default:tree", param2=4}) + end + if length == 5 and check_node_buildable_to(south2) then + minetest.swap_node(south2, {name="default:tree", param2=4}) + end + end + elseif trunk_type == 3 then + if minetest.get_modpath(MoD) ~= nil then + if check_node_buildable_to(west) then + minetest.swap_node(west, {name=MoD..":"..TRuNK, param2=12}) + end + if length >= 4 and check_node_buildable_to(west2) then + minetest.swap_node(west2, {name=MoD..":"..TRuNK, param2=12}) + end + minetest.swap_node(right_here, {name=MoD..":"..TRuNK, param2=12}) + if check_node_buildable_to(east) then + minetest.swap_node(east, {name=MoD..":"..TRuNK, param2=12}) + end + if length == 5 and check_node_buildable_to(east2) then + minetest.swap_node(east2, {name=MoD..":"..TRuNK, param2=12}) + end + else + if check_node_buildable_to(west) then + minetest.swap_node(west, {name="default:tree", param2=12}) + end + if length >= 4 and check_node_buildable_to(west2) then + minetest.swap_node(west2, {name="default:tree", param2=12}) + end + minetest.swap_node(right_here, {name="default:tree", param2=12}) + if check_node_buildable_to(east) then + minetest.swap_node(east, {name="default:tree", param2=12}) + end + if length == 5 and check_node_buildable_to(east2) then + minetest.swap_node(east2, {name="default:tree", param2=12}) + end + end + end + end + end + end +end + +biome_lib.register_on_generate({ + surface = {"default:dirt_with_grass"}, + max_count = 320, -- 320, + rarity = 99, -- 99, + min_elevation = 1, + max_elevation = 40, + avoid_nodes = {"group:tree"}, + avoid_radius = 1, + near_nodes = {"group:tree","ferns:fern_03","ferns:fern_02","ferns:fern_01"}, + near_nodes_size = 3, + near_nodes_vertical = 1, + near_nodes_count = 1, + plantlife_limit = -0.9, + }, + abstract_trunks.place_trunk +) + +----------------------------------------------------------------------------------------------- +-- MoSS & FuNGuS -- on ground +----------------------------------------------------------------------------------------------- +abstract_trunks.grow_moss_on_ground = function(pos) + local on_ground = {x=pos.x, y=pos.y+1, z=pos.z} + local moss_type = math.random(1,21) + local rot = math.random(0,3) + + if moss_type == 1 then + minetest.swap_node(on_ground, {name="trunks:moss_with_fungus_"..rot, param2=1}) + else + minetest.swap_node(on_ground, {name="trunks:moss_plain_"..rot, param2=1}) + end + +end + +biome_lib.register_on_generate({ + surface = {"default:dirt_with_grass"}, + max_count = 400, + rarity = 79, + min_elevation = 1, + max_elevation = 40, + near_nodes = { + "group:tree", + "ferns:fern_03", + "ferns:fern_02", + "ferns:fern_01" + }, + near_nodes_size = 2, + near_nodes_vertical = 1, + near_nodes_count = 1, + plantlife_limit = -0.9, + }, + abstract_trunks.grow_moss_on_ground +) + +----------------------------------------------------------------------------------------------- +-- MoSS & FuNGuS -- on trunks +----------------------------------------------------------------------------------------------- +abstract_trunks.grow_moss_on_trunk = function(pos) + local on_ground = {x=pos.x, y=pos.y+1, z=pos.z} + local at_side_n = {x=pos.x, y=pos.y, z=pos.z+1} + local at_side_e = {x=pos.x+1, y=pos.y, z=pos.z} + local at_side_s = {x=pos.x, y=pos.y, z=pos.z-1} + local at_side_w = {x=pos.x-1, y=pos.y, z=pos.z} + + --if minetest.get_item_group(node_under.name, "tree") < 1 then + if check_node_buildable_to(on_ground) then + local moss_type = math.random(1,41) + local rot = math.random(0,3) + if moss_type == 1 then + minetest.swap_node(on_ground, {name="trunks:moss_with_fungus_"..rot, param2=1}) + elseif moss_type < 22 then + minetest.swap_node(on_ground, {name="trunks:moss_plain_"..rot, param2=1}) + end + end + if check_node_buildable_to(at_side_n) then + local moss_type = math.random(1,31) -- cliche of more moss at north + local rot = math.random(0,3) + if moss_type == 1 then + minetest.swap_node(at_side_n, {name="trunks:moss_with_fungus_"..rot, param2=5}) + elseif moss_type < 22 then + minetest.swap_node(at_side_n, {name="trunks:moss_plain_"..rot, param2=5}) + end + end + if check_node_buildable_to(at_side_e) then + local moss_type = math.random(1,41) + local rot = math.random(0,3) + if moss_type == 1 then + minetest.swap_node(at_side_e, {name="trunks:moss_with_fungus_"..rot, param2=3}) + elseif moss_type < 22 then + minetest.swap_node(at_side_e, {name="trunks:moss_plain_"..rot, param2=3}) + end + end + if check_node_buildable_to(at_side_s) then + local moss_type = math.random(1,41) + local rot = math.random(0,3) + if moss_type == 1 then + minetest.swap_node(at_side_s, {name="trunks:moss_with_fungus_"..rot, param2=4}) + elseif moss_type < 22 then + minetest.swap_node(at_side_s, {name="trunks:moss_plain_"..rot, param2=4}) + end + end + if check_node_buildable_to(at_side_w) then + local moss_type = math.random(1,41) + local rot = math.random(0,3) + if moss_type == 1 then + minetest.swap_node(at_side_w, {name="trunks:moss_with_fungus_"..rot, param2=2}) + elseif moss_type < 22 then + minetest.swap_node(at_side_w, {name="trunks:moss_plain_"..rot, param2=2}) + end + end + --end +end + +biome_lib.register_on_generate({ + surface = { + "default:tree", + "default:jungletree", + "default:pine_tree", + "trees:tree_conifer", + "trees:tree_mangrove", + --"trees:tree_palm", + "moretrees:apple_tree_trunk", + "moretrees:beech_trunk", + "moretrees:birch_trunk", + "moretrees:fir_trunk", + "moretrees:oak_trunk", + --"moretrees:palm_trunk", + "moretrees:rubber_tree_trunk", + "moretrees:rubber_tree_trunk_empty", + "moretrees:sequoia_trunk", + "moretrees:spruce_trunk", + "moretrees:willow_trunk", + "default:mossycobble" + }, + max_count = 640, + rarity = 24, + min_elevation = 1, + max_elevation = 40, + plantlife_limit = -0.9, + check_air = false, + }, + "abstract_trunks.grow_moss_on_trunk" +) + +----------------------------------------------------------------------------------------------- +-- RooTS +----------------------------------------------------------------------------------------------- +abstract_trunks.grow_roots = function(pos) + local right_here = {x=pos.x , y=pos.y , z=pos.z } + local below = {x=pos.x , y=pos.y-1, z=pos.z } + local north = {x=pos.x , y=pos.y , z=pos.z+1} + local east = {x=pos.x+1, y=pos.y , z=pos.z } + local south = {x=pos.x , y=pos.y , z=pos.z-1} + local west = {x=pos.x-1, y=pos.y , z=pos.z } + + local node_here = minetest.get_node(right_here) + local node_below = minetest.get_node(below) + + for i in pairs(TRuNKS) do + local MoD = TRuNKS[i][1] + local TRuNK = TRuNKS[i][2] + if minetest.get_modpath(MoD) ~= nil + and node_here.name == MoD..":"..TRuNK + and string.find(node_below.name, "dirt") + and node_here.param2 == 0 then + if check_node_buildable_to(north) then + minetest.swap_node(north, {name="trunks:"..TRuNK.."root", param2=2}) + end + if check_node_buildable_to(east) then + minetest.swap_node(east, {name="trunks:"..TRuNK.."root", param2=3}) + end + if check_node_buildable_to(south) then + minetest.swap_node(south, {name="trunks:"..TRuNK.."root", param2=0}) + end + if check_node_buildable_to(west) then + minetest.swap_node(west, {name="trunks:"..TRuNK.."root", param2=1}) + end + end + end +end + +biome_lib.register_on_generate({ + surface = {"group:tree"}, + max_count = 1000, + rarity = 1, + min_elevation = 1, + max_elevation = 40, + near_nodes = {"default:dirt_with_grass"}, + near_nodes_size = 1, + near_nodes_vertical = 1, + near_nodes_count = 1, + plantlife_limit = -1, + check_air = false, + }, + "abstract_trunks.grow_roots" +) diff --git a/mods/plantlife_modpack/trunks/init.lua b/mods/plantlife_modpack/trunks/init.lua new file mode 100644 index 0000000..4e08140 --- /dev/null +++ b/mods/plantlife_modpack/trunks/init.lua @@ -0,0 +1,9 @@ +-- Code by Mossmanikin & Neuromancer + +abstract_trunks = {} + +dofile(minetest.get_modpath("trunks").."/generating.lua") +dofile(minetest.get_modpath("trunks").."/nodes.lua") +dofile(minetest.get_modpath("trunks").."/crafting.lua") + +abstract_trunks.loaded = true diff --git a/mods/plantlife_modpack/trunks/locale/template.txt b/mods/plantlife_modpack/trunks/locale/template.txt new file mode 100644 index 0000000..3657950 --- /dev/null +++ b/mods/plantlife_modpack/trunks/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: trunks +Twig= +Moss= +Moss with Fungus= +Twigs Block= +Twigs Slab= +Twigs Roof= +Twigs Roof Corner 1= +Twigs Roof Corner 2= +@1 Root= diff --git a/mods/plantlife_modpack/trunks/locale/trunks.de.tr b/mods/plantlife_modpack/trunks/locale/trunks.de.tr new file mode 100644 index 0000000..de83a5a --- /dev/null +++ b/mods/plantlife_modpack/trunks/locale/trunks.de.tr @@ -0,0 +1,10 @@ +# textdomain: trunks +Twig=Zweig +Moss=Moos +Moss with Fungus=Moos mit Pilz +Twigs Block=Zweigblock +Twigs Slab=Zweigplatte +Twigs Roof=Zweigdach +Twigs Roof Corner 1=Zweigdachwinkel 1 +Twigs Roof Corner 2=Zweigdachwinkel 2 +@1 Root=Wurzel von @1 diff --git a/mods/plantlife_modpack/trunks/locale/trunks.eo.tr b/mods/plantlife_modpack/trunks/locale/trunks.eo.tr new file mode 100644 index 0000000..2e9255c --- /dev/null +++ b/mods/plantlife_modpack/trunks/locale/trunks.eo.tr @@ -0,0 +1,10 @@ +# textdomain: trunks +Twig=Branĉeto +Moss=Musko +Moss with Fungus=Musko kun Fungo +Twigs Block=Bloko de Branĉetoj +Twigs Slab=Slabo +Twigs Roof=Tegmento +Twigs Roof Corner 1=Tegmentangulo 1 de Branĉetoj +Twigs Roof Corner 2=Tegmentangulo 2 de Branĉetoj +@1 Root=@1 Radiko diff --git a/mods/plantlife_modpack/trunks/locale/trunks.fr.tr b/mods/plantlife_modpack/trunks/locale/trunks.fr.tr new file mode 100644 index 0000000..097c2bb --- /dev/null +++ b/mods/plantlife_modpack/trunks/locale/trunks.fr.tr @@ -0,0 +1,10 @@ +# textdomain: trunks +Twig=Brindille +Moss=Mousse +Moss with Fungus=Mousse et champignons +Twigs Block=Bloc de brindilles +Twigs Slab=Dalle en brindilles +Twigs Roof=Toit de brindilles +Twigs Roof Corner 1=Angle de toit de brindilles 1 +Twigs Roof Corner 2=Angle de toit de brindilles 2 +@1 Root=Racine de @1 diff --git a/mods/plantlife_modpack/trunks/mod.conf b/mods/plantlife_modpack/trunks/mod.conf new file mode 100644 index 0000000..1829758 --- /dev/null +++ b/mods/plantlife_modpack/trunks/mod.conf @@ -0,0 +1,3 @@ +name = trunks +depends = default, biome_lib +optional_depends = bushes, ferns, moretrees, trees diff --git a/mods/plantlife_modpack/trunks/nodes.lua b/mods/plantlife_modpack/trunks/nodes.lua new file mode 100644 index 0000000..b983a98 --- /dev/null +++ b/mods/plantlife_modpack/trunks/nodes.lua @@ -0,0 +1,430 @@ +-- Code by Mossmanikin & Neuromancer +-- support for i18n +local S = minetest.get_translator("trunks") +----------------------------------------------------------------------------------------------- +-- TWiGS +----------------------------------------------------------------------------------------------- +-- For compatibility with older stuff +minetest.register_alias("trunks:twig", "trunks:twig_1") + +local flat_stick = {-1/2, -1/2, -1/2, 1/2, -7/16, 1/2} +local NoDe = { {1}, {2}, {3}, {4}, {5}, --[[{6},]] {7}, {8}, {9}, {10}, {11}, {12}, {13} } + + +for i in pairs(NoDe) do + local NR = NoDe[i][1] + local iNV = NR - 1 + minetest.register_node("trunks:twig_"..NR, { + description = S("Twig"), + inventory_image = "trunks_twig_"..NR..".png", + wield_image = "trunks_twig_"..NR..".png", + drawtype = "nodebox", + tiles = { + "trunks_twig_"..NR..".png", + "trunks_twig_"..NR..".png^[transformFY", -- mirror + "trunks_twig_6.png" -- empty + }, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + buildable_to = true, + node_box = {type = "fixed", fixed = flat_stick}, + groups = { + choppy=2, + oddly_breakable_by_hand=2, + flammable=3, + attached_node=1, + not_in_creative_inventory=iNV + }, + is_ground_content = false, + drop = "trunks:twig_1", + sounds = default.node_sound_leaves_defaults(), + liquids_pointable = true, + on_place = function(itemstack, placer, pointed_thing) + local pt = pointed_thing + + if not placer then return end + local playername = placer:get_player_name() + if minetest.is_protected(pt.above, playername) then + minetest.record_protection_violation(pt.above, playername) + return + end + + local direction = minetest.dir_to_facedir(placer:get_look_dir()) + if minetest.get_node(pt.above).name=="air" then + minetest.swap_node(pt.above, {name="trunks:twig_"..math.random(1,4), param2=direction}) + if not minetest.is_creative_enabled(playername) then + itemstack:take_item() + end + return itemstack + end + end, + }) +end + +----------------------------------------------------------------------------------------------- +-- MoSS +----------------------------------------------------------------------------------------------- + +-- wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, +-- wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, +-- wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + +-- was local flat_moss = {-1/2, -1/2, -1/2, 1/2, -15/32, 1/2} + + +local cbox = { + type = "wallmounted", + wall_top = {-1/2, 1/2, -1/2, 1/2, 15/32, 1/2}, + wall_bottom = {-1/2, -1/2, -1/2, 1/2, -15/32, 1/2}, + wall_side = {-1/2, -1/2, -1/2, -15/32, 1/2, 1/2} +} + +for r = 0, 3 do + local xform = "" + if r > 0 then xform = "^[transformR"..r*90 end + + minetest.register_node("trunks:moss_plain_"..r, { + description = S("Moss"), + drawtype = "nodebox", + tiles = {"trunks_moss.png"..xform}, + use_texture_alpha = "clip", + inventory_image = "trunks_moss.png", + wield_image = "trunks_moss.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + node_box = cbox, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r}, + sounds = default.node_sound_leaves_defaults(), + drop = "trunks:moss_plain_0", + }) + + ----------------------------------------------------------------------------------------------- + -- MoSS & FuNGuS + ----------------------------------------------------------------------------------------------- + minetest.register_node("trunks:moss_with_fungus_"..r, { + description = S("Moss with Fungus"), + drawtype = "nodebox", + tiles = {"trunks_moss_fungus.png"..xform}, + inventory_image = "trunks_moss_fungus.png", + wield_image = "trunks_moss_fungus.png", + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + node_box = cbox, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r}, + sounds = default.node_sound_leaves_defaults(), + drop = "trunks:moss_with_fungus_0", + }) +end + +minetest.register_alias("trunks:moss", "trunks:moss_plain_0") +minetest.register_alias("trunks:moss_fungus", "trunks:moss_with_fungus_0") + +----------------------------------------------------------------------------------------------- +-- TWiGS BLoCK +----------------------------------------------------------------------------------------------- +minetest.register_alias("woodstuff:twigs", "trunks:twigs") + +minetest.register_node("trunks:twigs", { + description = S("Twigs Block"), + paramtype2 = "facedir", + tiles = {"trunks_twigs.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS SLaB +----------------------------------------------------------------------------------------------- +minetest.register_alias("woodstuff:twigs_slab", "trunks:twigs_slab") + +minetest.register_node("trunks:twigs_slab", { + description = S("Twigs Slab"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"trunks_twigs.png"}, + node_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS RooF +----------------------------------------------------------------------------------------------- +minetest.register_alias("woodstuff:twigs_roof", "trunks:twigs_roof") + +minetest.register_node("trunks:twigs_roof", { + description = S("Twigs Roof"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"trunks_twigs.png"}, + node_box = { + type = "fixed", +-- { left, bottom, front, right, top, back } + fixed = { + {-1/2, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, -1/2, -1/2, 1/2, 0, 0}, + } + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS RooF CoRNeR +----------------------------------------------------------------------------------------------- +minetest.register_alias("woodstuff:twigs_roof_corner", "trunks:twigs_roof_corner") + +minetest.register_node("trunks:twigs_roof_corner", { + description = S("Twigs Roof Corner 1"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = { + "trunks_twigs_corner.png", + "trunks_twigs_corner.png", + "trunks_twigs.png" + }, + node_box = { + type = "fixed", +-- { left, bottom, front, right, top, back } + fixed = { + {-1/2, 0, 0, 0, 1/2, 1/2}, + {0, -1/2, 0, 1/2, 0, 1/2}, + {-1/2, -1/2, -1/2, 0, 0, 0}, + } + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +----------------------------------------------------------------------------------------------- +-- TWiGS RooF CoRNeR 2 +----------------------------------------------------------------------------------------------- +minetest.register_alias("woodstuff:twigs_roof_corner_2", "trunks:twigs_roof_corner_2") + +minetest.register_node("trunks:twigs_roof_corner_2", { + description = S("Twigs Roof Corner 2"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = { + "trunks_twigs_corner.png", + "trunks_twigs_corner.png", + "trunks_twigs.png" + }, + node_box = { + type = "fixed", +-- { left, bottom, front, right, top, back } + fixed = { + {-1/2, -1/2, 0, 0, 0, 1/2}, + {0, 0, 0, 1/2, 1/2, 1/2}, + {-1/2, 0, -1/2, 0, 1/2, 0}, + } + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +local roof = "trunks:twigs_roof" +local corner = "trunks:twigs_roof_corner" +local corner_2 = "trunks:twigs_roof_corner_2" + +minetest.register_abm({ + nodenames = {roof}, + interval = 1, + chance = 1, + action = function(pos) + + local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }) + local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }) + local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) + local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) + -- corner 1 + if ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner, param2=0}) + end + + if ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner, param2=1}) + end + + if ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner, param2=2}) + end + + if ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner, param2=3}) + end + -- corner 2 + if ((node_west.name == roof and node_west.param2 == 2) + or (node_west.name == corner_2 and node_west.param2 == 1)) + and ((node_north.name == roof and node_north.param2 == 1) + or (node_north.name == corner_2 and node_north.param2 == 3)) + then + minetest.swap_node(pos, {name=corner_2, param2=0}) + end + + if ((node_north.name == roof and node_north.param2 == 3) + or (node_north.name == corner_2 and node_north.param2 == 2)) + and ((node_east.name == roof and node_east.param2 == 2) + or (node_east.name == corner_2 and node_east.param2 == 0)) + then + minetest.swap_node(pos, {name=corner_2, param2=1}) + end + + if ((node_east.name == roof and node_east.param2 == 0) + or (node_east.name == corner_2 and node_east.param2 == 3)) + and ((node_south.name == roof and node_south.param2 == 3) + or (node_south.name == corner_2 and node_south.param2 == 1)) + then + minetest.swap_node(pos, {name=corner_2, param2=2}) + end + + if ((node_south.name == roof and node_south.param2 == 1) + or (node_south.name == corner_2 and node_south.param2 == 0)) + and ((node_west.name == roof and node_west.param2 == 0) + or (node_west.name == corner_2 and node_west.param2 == 2)) + then + minetest.swap_node(pos, {name=corner_2, param2=3}) + end + + end, +}) + +-- MM: The following stuff is just for testing purposes for now; no generating of roots. +-- I'm not satisfied with this; they should be either bigger or a different drawtype. +----------------------------------------------------------------------------------------------- +-- RooTS +----------------------------------------------------------------------------------------------- +local roots_cube = {-2/16, -1/2, -3/16, 2/16, 1/16, 1/2} + +local roots_sheet = {0, -1/2, -1/2, 0, 1/16, 1/2} + +local TRuNKS = { +-- MoD TRuNK + {"default", "tree" }, + {"default", "jungletree" }, + {"default", "pine_tree" }, + + {"trees", "tree_conifer" }, + {"trees", "tree_mangrove" }, + {"trees", "tree_palm" }, + + {"moretrees", "apple_tree_trunk" }, + {"moretrees", "beech_trunk" }, + {"moretrees", "birch_trunk" }, + {"moretrees", "fir_trunk" }, + {"moretrees", "oak_trunk" }, + {"moretrees", "palm_trunk" }, + {"moretrees", "rubber_tree_trunk" }, + {"moretrees", "rubber_tree_trunk_empty" }, + {"moretrees", "sequoia_trunk" }, + {"moretrees", "spruce_trunk" }, + {"moretrees", "willow_trunk" }, +} + +for i in pairs(TRuNKS) do + local MoD = TRuNKS[i][1] + local TRuNK = TRuNKS[i][2] + if minetest.get_modpath(MoD) ~= nil then + + local node = minetest.registered_nodes[MoD..":"..TRuNK] + if node then + local des = node.description + + minetest.register_node("trunks:"..TRuNK.."root", { + description = S("@1 Root", des), + paramtype = "light", + paramtype2 = "facedir", + tiles = { +--[[top]] MoD.."_"..TRuNK..".png", +--[[bottom]] MoD.."_"..TRuNK..".png", +--[[right]] MoD.."_"..TRuNK..".png^trunks_root_mask.png^[makealpha:0,0,0", +--[[left]] MoD.."_"..TRuNK..".png^trunks_root_mask.png^[transformFX^[makealpha:0,0,0", +--[[back]] MoD.."_"..TRuNK..".png", +--[[front]] MoD.."_"..TRuNK..".png" + }, + use_texture_alpha = "clip", + drawtype = "nodebox", + selection_box = {type = "fixed", fixed = roots_cube}, + node_box = {type = "fixed", fixed = roots_sheet}, + groups = { + tree=1, + snappy=1, + choppy=2, + oddly_breakable_by_hand=1, + flammable=2, + attached_node = 1 + --not_in_creative_inventory=1 -- atm in inv for testing + }, + is_ground_content = false, + --drop = "trunks:twig_1", -- not sure about this yet + sounds = default.node_sound_wood_defaults(), + }) + + else + minetest.log("error", string.format("[Trunks] warning: tree type '%s:%s' not found", MoD, TRuNK)) + end + end +end + +minetest.register_alias("trunks:pine_trunkroot", "trunks:pine_treeroot") + +-- convert moss to wallmounted mode so that attached_node works properly. + +local fdirtowall = { + [0] = 1, + [1] = 5, + [2] = 4, + [3] = 3, + [4] = 2, +} + +minetest.register_lbm({ + name = "trunks:convert_moss_wallmounted", + label = "Convert moss to wallmounted mode", + run_at_every_load = true, + nodenames = {"trunks:moss", "trunks:moss_fungus"}, + action = function(pos, node) + local basedir = math.floor(node.param2 / 4) + local rot = node.param2 % 4 + local newname = node.name == "trunks:moss_fungus" and "trunks:moss_with_fungus" or "trunks:moss_plain" + minetest.set_node(pos, {name = newname.."_"..rot, param2 = fdirtowall[basedir] }) + end +}) diff --git a/mods/plantlife_modpack/trunks/textures/credit_textures.txt b/mods/plantlife_modpack/trunks/textures/credit_textures.txt new file mode 100644 index 0000000..b3893d5 --- /dev/null +++ b/mods/plantlife_modpack/trunks/textures/credit_textures.txt @@ -0,0 +1,34 @@ +------------------------------------------------------------- +Credit for textures of "trunks" +------------------------------------------------------------- +(If more than one author is listed the names are in alphabetical order) +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +FOLDER TEXTURE AUTHORS +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +../trunks/textures trunks_moss.png Neuromancer + trunks_moss_fungus.png Neuromancer + trunks_twig_1.png Mossmanikin + trunks_twig_2.png Mossmanikin, Neuromancer + trunks_twig_3.png Mossmanikin, Neuromancer + trunks_twig_4.png Mossmanikin, Neuromancer + trunks_twig_5.png Mossmanikin, Neuromancer + (trunks_twig_6.png) (Mossmanikin) + trunks_twig_7.png Mossmanikin, Neuromancer + trunks_twig_8.png Mossmanikin, Neuromancer + trunks_twig_9.png Mossmanikin, Neuromancer + trunks_twig_10.png Mossmanikin, Neuromancer + trunks_twig_11.png Mossmanikin, Neuromancer + trunks_twigs.png Mossmanikin + trunks_twigs_corner.png Mossmanikin + trunks_twigs_top.png Mossmanikin +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +../trunks/textures/old & unused comboSticks.png Mossmanikin, Neuromancer + comboSticks_2.png Mossmanikin, Neuromancer + trunks_twig_1e.png Mossmanikin, Neuromancer + trunks_twig_1n.png Mossmanikin, Neuromancer + trunks_twig_2n.png Mossmanikin, Neuromancer + trunks_twig_3n.png Mossmanikin, Neuromancer + trunks_twig_4n.png Mossmanikin, Neuromancer + trunks_twig_5-8.png Mossmanikin, Neuromancer + trunks_twig_9-12.png Mossmanikin, Neuromancer +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/mods/plantlife_modpack/trunks/textures/trunks_moss.png b/mods/plantlife_modpack/trunks/textures/trunks_moss.png new file mode 100644 index 0000000..5ffe58f Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_moss.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_moss_fungus.png b/mods/plantlife_modpack/trunks/textures/trunks_moss_fungus.png new file mode 100644 index 0000000..fcd4ae2 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_moss_fungus.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_root_mask.png b/mods/plantlife_modpack/trunks/textures/trunks_root_mask.png new file mode 100644 index 0000000..5bfdac6 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_root_mask.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_1.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_1.png new file mode 100644 index 0000000..066bbfa Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_1.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_10.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_10.png new file mode 100644 index 0000000..062d8f6 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_10.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_11.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_11.png new file mode 100644 index 0000000..d9f41f8 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_11.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_12.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_12.png new file mode 100644 index 0000000..b8cf458 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_12.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_13.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_13.png new file mode 100644 index 0000000..64b08eb Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_13.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_2.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_2.png new file mode 100644 index 0000000..826253c Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_2.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_3.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_3.png new file mode 100644 index 0000000..4038e03 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_3.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_4.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_4.png new file mode 100644 index 0000000..971d649 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_4.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_5.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_5.png new file mode 100644 index 0000000..5f74334 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_5.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_6.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_6.png new file mode 100644 index 0000000..2f6464b Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_6.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_7.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_7.png new file mode 100644 index 0000000..8b5e4e1 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_7.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_8.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_8.png new file mode 100644 index 0000000..a9441e9 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_8.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twig_9.png b/mods/plantlife_modpack/trunks/textures/trunks_twig_9.png new file mode 100644 index 0000000..3e7a3f3 Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twig_9.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twigs.png b/mods/plantlife_modpack/trunks/textures/trunks_twigs.png new file mode 100644 index 0000000..23ff51e Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twigs.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twigs_corner.png b/mods/plantlife_modpack/trunks/textures/trunks_twigs_corner.png new file mode 100644 index 0000000..60871bf Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twigs_corner.png differ diff --git a/mods/plantlife_modpack/trunks/textures/trunks_twigs_top.png b/mods/plantlife_modpack/trunks/textures/trunks_twigs_top.png new file mode 100644 index 0000000..baf797c Binary files /dev/null and b/mods/plantlife_modpack/trunks/textures/trunks_twigs_top.png differ diff --git a/mods/plantlife_modpack/vines/README.md b/mods/plantlife_modpack/vines/README.md new file mode 100644 index 0000000..085b590 --- /dev/null +++ b/mods/plantlife_modpack/vines/README.md @@ -0,0 +1,52 @@ +# Vines Mod by Bas80 (Edited by TenPlus1) + +### License: MIT for code, CC0 for textures + +## Features +- Rope block for spawning rope that slowly drops into the deep. +- Vines are climbable and slowly grow downward. +- Shears that allow the faster collecting of vines. +- Spawns vines on jungletree leaves. +- Roots on the bottom of dirt and dirt with grass nodes. +- Spawns vines on trees located in swampy area. +- Jungle vines that spawn on the side of jungletrees + +## API +The API is very minimal. It allows the registering of vines and the spawning of +existing vines on nodes of your own. + +If you want vines to spawn on a certain node then you can choose which vine by +adding to the node groups the unique group of that vine. This is determined by +the name of the vine ( see vines.lua ) appended with '_vines'. +An example would be. + +"willow_vines" or "jungle_vines" + +There are two types of vines. One that spawns at the bottom of nodes and uses the +plantlike drawtype, and vines that spawn on the side that use signlike +drawtype. The type is determined by the spawn_on_side property in the biome +table. + +### Example +*taken from mod* + +```lua + + vines.register_vine( name, definitions, biome ) + + --e.g. + + vines.register_vine( 'vine', { + description = "Vines", + average_length = 9 + }, biome ) + +``` + +### definitions +|key| type| description| +|---| ---| ---| +|description| string|The vine's tooltip description| +|average_length|int| The average length of vines| + +For biome definitions please see the [plants_lib API documentation](https://github.com/VanessaE/plantlife_modpack/blob/master/API.txt) diff --git a/mods/plantlife_modpack/vines/init.lua b/mods/plantlife_modpack/vines/init.lua new file mode 100644 index 0000000..290f461 --- /dev/null +++ b/mods/plantlife_modpack/vines/init.lua @@ -0,0 +1,523 @@ +vines = { + name = 'vines', + recipes = {} +} + +local enable_vines = minetest.settings:get_bool("vines_enable_vines", true) +local enable_rope = minetest.settings:get_bool("vines_enable_rope", true) +local enable_roots = minetest.settings:get_bool("vines_enable_roots", true) +local enable_standard = minetest.settings:get_bool("vines_enable_standard", true) +local enable_side = minetest.settings:get_bool("vines_enable_side", true) +local enable_jungle = minetest.settings:get_bool("vines_enable_jungle", true) +local enable_willow = minetest.settings:get_bool("vines_enable_willow", true) + +local rarity_roots = tonumber(minetest.settings:get("vines_rarity_roots")) or 0.5 +local default_rarity = 0.2 +local rarity_standard = tonumber(minetest.settings:get("vines_rarity_standard")) or default_rarity +local rarity_side = tonumber(minetest.settings:get("vines_rarity_side")) or default_rarity +local rarity_jungle = tonumber(minetest.settings:get("vines_rarity_jungle")) or default_rarity +local rarity_willow = tonumber(minetest.settings:get("vines_rarity_willow")) or default_rarity + +local growth_min = tonumber(minetest.settings:get("vines_growth_min")) or 180 +local growth_max = tonumber(minetest.settings:get("vines_growth_max")) or 360 + +-- support for i18n +local S = minetest.get_translator("vines") + +local dids = {} +local spawn_funcs = {} + +local function find_open_side(pos) -- copied from biome_lib + if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2} + end + if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5} + end + return nil +end + +-- ITEMS + +if enable_vines ~= false then + minetest.register_craftitem("vines:vines", { + description = S("Vines"), + inventory_image = "vines_item.png", + groups = {vines = 1, flammable = 2} + }) +end + +-- FUNCTIONS + +local function on_dig(pos, node, player) + if not player or minetest.is_protected(pos, player:get_player_name()) then + return + end + local vine_name_end = node.name:gsub("_middle", "_end") + local drop_item = "vines:vines" + if enable_vines == false then + drop_item = vine_name_end + end + + local wielded_item = minetest.is_player(player) and player:get_wielded_item() + if wielded_item then + local node_def = minetest.registered_nodes[node.name] + local dig_params = minetest.get_dig_params( + node_def.groups, + wielded_item:get_tool_capabilities(), + wielded_item:get_wear() + ) + if dig_params.wear then + wielded_item:add_wear(dig_params.wear) + player:set_wielded_item(wielded_item) + end + + if wielded_item:get_name() == 'vines:shears' then + drop_item = vine_name_end + end + end + + local break_pos = {x = pos.x, y = pos.y, z = pos.z} + while minetest.get_item_group(minetest.get_node(break_pos).name, "vines") > 0 do + minetest.remove_node(break_pos) + minetest.handle_node_drops(break_pos, {drop_item}, player) + break_pos.y = break_pos.y - 1 + end +end + +local function ensure_vine_end(pos, oldnode) + local np = {x = pos.x, y = pos.y + 1, z = pos.z} + local nn = minetest.get_node(np) + + local vine_name_end = oldnode.name:gsub("_middle", "_end") + + if minetest.get_item_group(nn.name, "vines") > 0 then + minetest.swap_node(np, { name = vine_name_end, param2 = oldnode.param2 }) + minetest.registered_items[vine_name_end].on_construct(np, minetest.get_node(np)) + end +end + + +vines.register_vine = function( name, defs, def ) + + local groups = {vines = 1, snappy = 3, flammable = 2} + local vine_name_end = 'vines:' .. name .. '_end' + local vine_name_middle = 'vines:' .. name .. '_middle' + local vine_image_end = "vines_" .. name .. "_end.png" + local vine_image_middle = "vines_" .. name .. "_middle.png" + + local spawn_plants = function(pos) + local param2 = 0 + + if def.spawn_on_bottom then -- spawn under e.g. leaves + local newpos = vector.new(pos.x, pos.y - 1, pos.z) + if minetest.get_node(pos).name ~= "air" and minetest.get_node(newpos).name == "air" then + -- (1) prevent floating vines; (2) is there even space? + pos = newpos + else + return + end + elseif def.spawn_on_side then + local onside = find_open_side(pos) + if onside then + pos = onside.newpos + param2 = onside.facedir + else + return + end + end + + local max_length = math.random(defs.average_length) + local current_length = 1 + -- print("Generate " .. name .. " at " .. minetest.pos_to_string(pos)) + if minetest.get_node({ x=pos.x, y=pos.y - 1, z=pos.z }).name == 'air' then + while minetest.get_node({ x=pos.x, y=pos.y - 1, z=pos.z }).name == 'air' and current_length < max_length do + minetest.set_node(pos, { name = vine_name_middle, param2 = param2 }) + pos.y = pos.y - 1 + current_length = current_length + 1 + end + minetest.set_node(pos, { name = vine_name_end, param2 = param2 }) + end + end + + local selection_box = {type = "wallmounted",} + local drawtype = 'signlike' + + -- different properties for bottom and side vines. + if not def.spawn_on_side then + + selection_box = { + type = "fixed", fixed = { -0.4, -1/2, -0.4, 0.4, 1/2, 0.4 } + } + + drawtype = 'plantlike' + end + + minetest.register_node(vine_name_end, { + description = defs.description, + walkable = false, + climbable = true, + wield_image = vine_image_end, + drop = {}, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "wallmounted", + buildable_to = false, + tiles = {vine_image_end .. (drawtype == "plantlike" and "^[transformR180" or "")}, + drawtype = drawtype, + inventory_image = vine_image_end, + groups = groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = selection_box, + + on_construct = function(pos) + + local timer = minetest.get_node_timer(pos) + timer:start(math.random(growth_min, growth_max)) + end, + + on_timer = function(pos) + + local node = minetest.get_node(pos) + local bottom = {x = pos.x, y = pos.y - 1, z = pos.z} + local bottom_node = minetest.get_node( bottom ) + if bottom_node.name == "air" then + + if math.random(defs.average_length) ~= 1 then + + minetest.swap_node(pos, { + name = vine_name_middle, param2 = node.param2}) + + minetest.set_node(bottom, { + name = node.name, param2 = node.param2}) + + local timer = minetest.get_node_timer(bottom) + + timer:start(math.random(growth_min, growth_max)) + end + end + end, + + on_dig = on_dig, + + after_destruct = function(pos, oldnode) + ensure_vine_end(pos, oldnode) + end, + }) + + minetest.register_node( vine_name_middle, { + description = S("Matured") .. " " .. defs.description, + walkable = false, + climbable = true, + drop = {}, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "wallmounted", + buildable_to = false, + tiles = {vine_image_middle}, + wield_image = vine_image_middle, + drawtype = drawtype, + inventory_image = vine_image_middle, + groups = groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = selection_box, + + on_dig = on_dig, + + after_destruct = function(pos, oldnode) + ensure_vine_end(pos, oldnode) + end, + }) + + minetest.register_decoration({ + name = "vines:" .. name, + decoration = {"air"}, + fill_ratio = def.rarity, + y_min = -16, + y_max = 48, + place_on = def.place_on, + deco_type = "simple", + flags = "all_floors, all_ceilings" + }) + dids[#dids + 1] = {name = name, spawn_func = spawn_plants} +end + +minetest.register_on_mods_loaded(function() + for idx, def in ipairs(dids) do + local did = minetest.get_decoration_id("vines:" .. def.name) + dids[idx] = did + spawn_funcs[did] = def.spawn_func + end + + minetest.set_gen_notify("decoration", dids) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + + for _, did in ipairs(dids) do + local deco_locations = g["decoration#" .. did] + + if deco_locations then + local func = spawn_funcs[did] + for _, pos in pairs(deco_locations) do + func(pos) + end + end + end +end) + +-- ALIASES + +-- used to remove the old vine nodes and give room for the new. +minetest.register_alias( 'vines:root', 'air' ) +minetest.register_alias( 'vines:root_rotten', 'air' ) +minetest.register_alias( 'vines:vine', 'air' ) +minetest.register_alias( 'vines:vine_rotten', 'air' ) +minetest.register_alias( 'vines:side', 'air' ) +minetest.register_alias( 'vines:side_rotten', 'air' ) +minetest.register_alias( 'vines:jungle', 'air' ) +minetest.register_alias( 'vines:jungle_rotten', 'air' ) +minetest.register_alias( 'vines:willow', 'air' ) +minetest.register_alias( 'vines:willow_rotten', 'air' ) + + +-- ROPE +if enable_rope ~= false then + minetest.register_craft({ + output = 'vines:rope_block', + recipe = { + {'group:vines', 'group:vines', 'group:vines'}, + {'group:vines', 'group:wood', 'group:vines'}, + {'group:vines', 'group:vines', 'group:vines'}, + } + }) + + if minetest.get_modpath("moreblocks") then + minetest.register_craft({ + output = 'vines:rope_block', + recipe = { + {'moreblocks:rope', 'moreblocks:rope', 'moreblocks:rope'}, + {'moreblocks:rope', 'group:wood', 'moreblocks:rope'}, + {'moreblocks:rope', 'moreblocks:rope', 'moreblocks:rope'}, + } + }) + end + + minetest.register_node("vines:rope_block", { + description = S("Rope"), + sunlight_propagates = true, + paramtype = "light", + tiles = { + "default_wood.png^vines_rope.png", + "default_wood.png^vines_rope.png", + "default_wood.png", + "default_wood.png", + "default_wood.png^vines_rope.png", + "default_wood.png^vines_rope.png", + }, + groups = {flammable = 2, choppy = 2, oddly_breakable_by_hand = 1}, + + after_place_node = function(pos) + + local p = {x = pos.x, y = pos.y - 1, z = pos.z} + local n = minetest.get_node(p) + + if n.name == "air" then + minetest.add_node(p, {name = "vines:rope_end"}) + end + end, + + after_dig_node = function(pos, node, digger) + + local p = {x = pos.x, y = pos.y - 1, z = pos.z} + local n = minetest.get_node(p) + + while n.name == 'vines:rope' or n.name == 'vines:rope_end' do + + minetest.remove_node(p) + + p = {x = p.x, y = p.y - 1, z = p.z} + n = minetest.get_node(p) + end + end + }) + + minetest.register_node("vines:rope", { + description = S("Rope"), + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + drop = {}, + tiles = {"vines_rope.png"}, + drawtype = "plantlike", + groups = {flammable = 2, not_in_creative_inventory = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + }) + + minetest.register_node("vines:rope_end", { + description = S("Rope"), + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + drop = {}, + tiles = {"vines_rope_end.png"}, + drawtype = "plantlike", + groups = {flammable = 2, not_in_creative_inventory = 1}, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos) + + local yesh = {x = pos.x, y = pos.y - 1, z = pos.z} + + minetest.add_node(yesh, {name = "vines:rope"}) + end, + + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + + on_construct = function(pos) + + local timer = minetest.get_node_timer(pos) + + timer:start(1) + end, + + on_timer = function( pos, elapsed ) + + local p = {x = pos.x, y = pos.y - 1, z = pos.z} + local n = minetest.get_node(p) + + if n.name == "air" then + + minetest.set_node(pos, {name = "vines:rope"}) + minetest.add_node(p, {name = "vines:rope_end"}) + else + + local timer = minetest.get_node_timer(pos) + + timer:start(1) + end + end + }) +end + +-- SHEARS +minetest.register_tool("vines:shears", { + description = S("Shears"), + inventory_image = "vines_shears.png", + wield_image = "vines_shears.png", + stack_max = 1, + max_drop_level = 3, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 1, + groupcaps = { + snappy = {times = {[3] = 0.2}, uses = 60, maxlevel = 3}, + } + }, +}) + +minetest.register_craft({ + output = 'vines:shears', + recipe = { + {'', 'default:steel_ingot', ''}, + {'group:stick', 'group:wood', 'default:steel_ingot'}, + {'', '', 'group:stick'} + } +}) + +-- ROOT VINES +if enable_roots ~= false then + vines.register_vine('root', + {description = S("Roots"), average_length = 9}, { + place_on = { + "default:dirt_with_grass", + "default:dirt" + }, + spawn_on_bottom = true, + rarity = rarity_roots, + }) +else + minetest.register_alias('vines:root_middle', 'air') + minetest.register_alias('vines:root_end', 'air') +end + +-- STANDARD VINES +if enable_standard ~= false then + vines.register_vine('vine', + {description = S("Vines"), average_length = 5}, { + place_on = { + "default:jungleleaves", + "moretrees:jungletree_leaves_red", + "moretrees:jungletree_leaves_yellow", + "moretrees:jungletree_leaves_green" + }, + spawn_on_bottom = true, + rarity = rarity_standard, + }) +else + minetest.register_alias('vines:vine_middle', 'air') + minetest.register_alias('vines:vine_end', 'air') +end + +-- SIDE VINES +if enable_side ~= false then + vines.register_vine('side', + {description = S("Vines"), average_length = 6}, { + place_on = { + "default:jungleleaves", + "moretrees:jungletree_leaves_red", + "moretrees:jungletree_leaves_yellow", + "moretrees:jungletree_leaves_green" + }, + spawn_on_side = true, + rarity = rarity_side, + }) +else + minetest.register_alias('vines:side_middle', 'air') + minetest.register_alias('vines:side_end', 'air') +end + +-- JUNGLE VINES +if enable_jungle ~= false then + vines.register_vine("jungle", + {description = S("Jungle Vines"), average_length = 7}, { + place_on = { + "default:jungletree", + "moretrees:jungletree_trunk" + }, + spawn_on_side = true, + rarity = rarity_jungle, + }) +else + minetest.register_alias('vines:jungle_middle', 'air') + minetest.register_alias('vines:jungle_end', 'air') +end + +-- WILLOW VINES (Note from 2024-06: Broken for years now, integration w/ new moretrees spawn mechanic needed) +if enable_willow ~= false then + vines.register_vine("willow", + {description = S("Willow Vines"), average_length = 9}, { + spawn_on_side = true, + place_on = {"moretrees:willow_leaves"}, + rarity = rarity_willow, + }) +else + minetest.register_alias('vines:willow_middle', 'air') + minetest.register_alias('vines:willow_end', 'air') +end diff --git a/mods/plantlife_modpack/vines/locale/template.txt b/mods/plantlife_modpack/vines/locale/template.txt new file mode 100644 index 0000000..43ba2d9 --- /dev/null +++ b/mods/plantlife_modpack/vines/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: vines +Vines= +Matured= +Rope= +Shears= +Roots= +Jungle Vines= +Willow Vines= diff --git a/mods/plantlife_modpack/vines/locale/vines.de.tr b/mods/plantlife_modpack/vines/locale/vines.de.tr new file mode 100644 index 0000000..81c6cda --- /dev/null +++ b/mods/plantlife_modpack/vines/locale/vines.de.tr @@ -0,0 +1,8 @@ +# textdomain: vines +Vines=Ranken +Matured=Gereifte +Rope=Seil +Shears=Schere +Roots=Wurzeln +Jungle Vines=Dschungelranken +Willow Vines=Weidenranken diff --git a/mods/plantlife_modpack/vines/locale/vines.eo.tr b/mods/plantlife_modpack/vines/locale/vines.eo.tr new file mode 100644 index 0000000..12018c2 --- /dev/null +++ b/mods/plantlife_modpack/vines/locale/vines.eo.tr @@ -0,0 +1,8 @@ +# textdomain: vines +Vines=Vitoj +Matured=Maturita +Rope=Ŝnuro +Shears=Tondiloj +Roots=Radikoj +Jungle Vines=Ĝangalaj Vitoj +Willow Vines=Salikaj Vitoj diff --git a/mods/plantlife_modpack/vines/locale/vines.fr.tr b/mods/plantlife_modpack/vines/locale/vines.fr.tr new file mode 100644 index 0000000..70c7dc1 --- /dev/null +++ b/mods/plantlife_modpack/vines/locale/vines.fr.tr @@ -0,0 +1,8 @@ +# textdomain: vines +Vines=Plantes grimpantes +Matured=Extrémité de +Rope=Corde +Shears=Cisailles +Roots=Racines +Jungle Vines=Lianes +Willow Vines=Lianes de saule diff --git a/mods/plantlife_modpack/vines/mapgen.lua b/mods/plantlife_modpack/vines/mapgen.lua new file mode 100644 index 0000000..e69de29 diff --git a/mods/plantlife_modpack/vines/mod.conf b/mods/plantlife_modpack/vines/mod.conf new file mode 100644 index 0000000..8f23380 --- /dev/null +++ b/mods/plantlife_modpack/vines/mod.conf @@ -0,0 +1,4 @@ +name = vines +description = Adds climbable vines that are spawned on trees. +depends = default +optional_depends = moretrees, ebiomes diff --git a/mods/plantlife_modpack/vines/screenshot.png b/mods/plantlife_modpack/vines/screenshot.png new file mode 100644 index 0000000..7ce1565 Binary files /dev/null and b/mods/plantlife_modpack/vines/screenshot.png differ diff --git a/mods/plantlife_modpack/vines/settingtypes.txt b/mods/plantlife_modpack/vines/settingtypes.txt new file mode 100644 index 0000000..6e3b34a --- /dev/null +++ b/mods/plantlife_modpack/vines/settingtypes.txt @@ -0,0 +1,41 @@ +#Enable the vines item +vines_enable_vines (Enable vines item) bool true + +#Enables ropes made of vine. +vines_enable_rope (Enable vine ropes) bool true + +#Enables root vines. +vines_enable_roots (Enable root vines) bool true + +#Rarity of root vines, from 1 to 10, lower numbers are rarer. +vines_rarity_roots (Rarity of roots vines) float 0.5 1 0 + +#Enables the standard type of vines. +vines_enable_standard (Enable standard vines) bool true + +#Rarity of standard vines, from 1 to 10, lower numbers are rarer. +vines_rarity_standard (Rarity of standard vines) float 0.2 1 0 + +#Enables the type of vines that grow on the sides of leaf blocks. +vines_enable_side (Enable side vines) bool true + +#Rarity of side vines, from 1 to 10, lower numbers are rarer. +vines_rarity_side (Rarity of side vines) float 0.2 1 0 + +#Enables jungle style vines. +vines_enable_jungle (Enable jungle vines) bool true + +#Rarity of jungle vines, from 1 to 10, lower numbers are rarer. +vines_rarity_jungle (Rarity of jungle vines) float 0.2 1 0 + +#Enables willow vines. +vines_enable_willow (Enable willow vines) bool true + +#Rarity of willow vines, from 1 to 10, lower numbers are rarer. +vines_rarity_willow (Rarity of willow vines) float 0.2 1 0 + +#Vine growth speed, minimum number of seconds between each growth. +vines_growth_min (Minimum number of seconds between growth) int 180 1 3600 + +#Vine growth speed, maximum number of seconds between each growth. +vines_growth_max (Maximum number of seconds between growth) int 360 1 3600 diff --git a/mods/plantlife_modpack/vines/textures/vines_item.png b/mods/plantlife_modpack/vines/textures/vines_item.png new file mode 100644 index 0000000..637b09a Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_item.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_jungle_end.png b/mods/plantlife_modpack/vines/textures/vines_jungle_end.png new file mode 100644 index 0000000..5ccf34e Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_jungle_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png b/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png new file mode 100644 index 0000000..64a96f7 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_jungle_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_root_end.png b/mods/plantlife_modpack/vines/textures/vines_root_end.png new file mode 100644 index 0000000..755d08d Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_root_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_root_middle.png b/mods/plantlife_modpack/vines/textures/vines_root_middle.png new file mode 100644 index 0000000..72e126f Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_root_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_rope.png b/mods/plantlife_modpack/vines/textures/vines_rope.png new file mode 100644 index 0000000..41cf1a7 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_rope.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_rope_end.png b/mods/plantlife_modpack/vines/textures/vines_rope_end.png new file mode 100644 index 0000000..29a3eb9 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_rope_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_shears.png b/mods/plantlife_modpack/vines/textures/vines_shears.png new file mode 100644 index 0000000..b464bbb Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_shears.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_side_end.png b/mods/plantlife_modpack/vines/textures/vines_side_end.png new file mode 100644 index 0000000..e87780a Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_side_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_side_middle.png b/mods/plantlife_modpack/vines/textures/vines_side_middle.png new file mode 100644 index 0000000..2d2c5cd Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_side_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_vine_end.png b/mods/plantlife_modpack/vines/textures/vines_vine_end.png new file mode 100644 index 0000000..f87a290 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_vine_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_vine_middle.png b/mods/plantlife_modpack/vines/textures/vines_vine_middle.png new file mode 100644 index 0000000..fff2acc Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_vine_middle.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_willow_end.png b/mods/plantlife_modpack/vines/textures/vines_willow_end.png new file mode 100644 index 0000000..2f62cb5 Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_willow_end.png differ diff --git a/mods/plantlife_modpack/vines/textures/vines_willow_middle.png b/mods/plantlife_modpack/vines/textures/vines_willow_middle.png new file mode 100644 index 0000000..aa7623a Binary files /dev/null and b/mods/plantlife_modpack/vines/textures/vines_willow_middle.png differ diff --git a/mods/plantlife_modpack/woodsoils/generating.lua b/mods/plantlife_modpack/woodsoils/generating.lua new file mode 100644 index 0000000..c250f2a --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/generating.lua @@ -0,0 +1,151 @@ +-- generating of forest soils + +local RaDiuS = { +-- WE1 NS1 WE2 NS2 WE3 NS3 + {-1,-2, -2,-2, -2,-3}, + { 0,-2, -3,-1, -3,-2}, + { 1,-2, -3, 0, -4,-1}, + {-2,-1, -3, 1, -4, 0}, + {-1,-1, -2, 2, -4, 1}, + { 0,-1, -1, 3, -3, 2}, + { 1,-1, 0, 3, -2, 3}, + { 2,-1, 1, 3, -1, 4}, + {-2, 0, 2, 2, 0, 4}, + {-1, 0, 3, 1, 1, 4}, + { 0, 0, 3, 0, 2, 3}, + { 1, 0, 3,-1, 3, 2}, + { 2, 0, 2,-2, 4, 1}, + {-2, 1, 1,-3, 4, 0}, + {-1, 1, 0,-3, 4,-1}, + { 0, 1, -1,-3, 3,-2}, + { 1, 1, 0, 0, 2,-3}, + { 2, 1, 0, 0, 1,-4}, + {-1, 2, 0, 0, 0,-4}, + { 0, 2, 0, 0, -1,-4}, + { 1, 2, 0, 0, 0, 0}, +} +-- e = + , n = + +abstract_woodsoils.place_soil = function(pos) + + if minetest.get_item_group(minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name, "soil") > 0 + or minetest.get_item_group(minetest.get_node({x=pos.x,y=pos.y-2,z=pos.z}).name, "soil") > 0 then + for i in pairs(RaDiuS) do + local WE1 = RaDiuS[i][1] + local NS1 = RaDiuS[i][2] + local WE2 = RaDiuS[i][3] + local NS2 = RaDiuS[i][4] + local WE3 = RaDiuS[i][5] + local NS3 = RaDiuS[i][6] + local radius_1a = {x=pos.x+WE1,y=pos.y-1,z=pos.z+NS1} + local radius_1b = {x=pos.x+WE1,y=pos.y-2,z=pos.z+NS1} + local radius_2a = {x=pos.x+WE2,y=pos.y-1,z=pos.z+NS2} + local radius_2b = {x=pos.x+WE2,y=pos.y-2,z=pos.z+NS2} + local radius_3a = {x=pos.x+WE3,y=pos.y-1,z=pos.z+NS3} + local radius_3b = {x=pos.x+WE3,y=pos.y-2,z=pos.z+NS3} + --local node_1a = minetest.get_node(radius_1a) + --local node_1b = minetest.get_node(radius_1b) + local node_2a = minetest.get_node(radius_2a) + local node_2b = minetest.get_node(radius_2b) + local node_3a = minetest.get_node(radius_3a) + local node_3b = minetest.get_node(radius_3b) + -- Dirt with Leaves 1 + if minetest.get_item_group(minetest.get_node(radius_1a).name, "soil") > 0 then + minetest.swap_node(radius_1a, {name="woodsoils:dirt_with_leaves_1"}) + end + if minetest.get_item_group(minetest.get_node(radius_1b).name, "soil") > 0 then + minetest.swap_node(radius_1b, {name="woodsoils:dirt_with_leaves_1"}) + end + -- Grass with Leaves 2 + if string.find(node_2a.name, "dirt_with_grass") then + minetest.swap_node(radius_2a, {name="woodsoils:grass_with_leaves_2"}) + end + if string.find(node_2b.name, "dirt_with_grass") then + minetest.swap_node(radius_2b, {name="woodsoils:grass_with_leaves_2"}) + end + -- Grass with Leaves 1 + if string.find(node_3a.name, "dirt_with_grass") then + minetest.swap_node(radius_3a, {name="woodsoils:grass_with_leaves_1"}) + end + if string.find(node_3b.name, "dirt_with_grass") then + minetest.swap_node(radius_3b, {name="woodsoils:grass_with_leaves_1"}) + end + end + end +end + +biome_lib.register_on_generate({ + surface = { + "group:tree", + "ferns:fern_03", + "ferns:fern_02", + "ferns:fern_01" + }, + max_count = 1000, + rarity = 1, + min_elevation = 1, + max_elevation = 40, + near_nodes = {"group:tree","ferns:fern_03","ferns:fern_02","ferns:fern_01"}, + near_nodes_size = 5, + near_nodes_vertical = 1, + near_nodes_count = 4, + plantlife_limit = -1, + check_air = false, + }, + "abstract_woodsoils.place_soil" +) + +biome_lib.register_on_generate({ + surface = { + "moretrees:apple_tree_sapling_ongen", + "moretrees:beech_sapling_ongen", + "moretrees:birch_sapling_ongen", + "moretrees:fir_sapling_ongen", + "moretrees:jungletree_sapling_ongen", + "moretrees:oak_sapling_ongen", + "moretrees:palm_sapling_ongen", + "moretrees:rubber_tree_sapling_ongen", + "moretrees:sequoia_sapling_ongen", + "moretrees:spruce_sapling_ongen", + "moretrees:willow_sapling_ongen" + }, + max_count = 1000, + rarity = 2, + min_elevation = 1, + max_elevation = 40, + plantlife_limit = -0.9, + check_air = false, + }, + "abstract_woodsoils.place_soil" +) + +minetest.register_abm({ + nodenames = {"default:papyrus"}, + neighbors = { + "woodsoils:dirt_with_leaves_1", + "woodsoils:dirt_with_leaves_2", + "woodsoils:grass_with_leaves_1", + "woodsoils:grass_with_leaves_2" + }, + interval = 50, + chance = 20, + action = function(pos, node) + pos.y = pos.y-1 + local name = minetest.get_node(pos).name + if string.find(name, "_with_leaves_") then + if minetest.find_node_near(pos, 3, {"group:water"}) == nil then + return + end + pos.y = pos.y+1 + local height = 0 + while minetest.get_node(pos).name == "default:papyrus" and height < 4 do + height = height+1 + pos.y = pos.y+1 + end + if height < 4 then + if minetest.get_node(pos).name == "air" then + minetest.swap_node(pos, {name="default:papyrus"}) + end + end + end + end, +}) diff --git a/mods/plantlife_modpack/woodsoils/init.lua b/mods/plantlife_modpack/woodsoils/init.lua new file mode 100644 index 0000000..456ec30 --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/init.lua @@ -0,0 +1,4 @@ +abstract_woodsoils = {} + +dofile(minetest.get_modpath("woodsoils").."/nodes.lua") +dofile(minetest.get_modpath("woodsoils").."/generating.lua") diff --git a/mods/plantlife_modpack/woodsoils/locale/template.txt b/mods/plantlife_modpack/woodsoils/locale/template.txt new file mode 100644 index 0000000..e1ce367 --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: woodsoils +Forest Soil 1= +Forest Soil 2= +Forest Soil 3= +Forest Soil 4= diff --git a/mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr b/mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr new file mode 100644 index 0000000..c87d1b5 --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr @@ -0,0 +1,5 @@ +# textdomain: woodsoils +Forest Soil 1=Waldboden 1 +Forest Soil 2=Waldboden 2 +Forest Soil 3=Waldboden 3 +Forest Soil 4=Waldboden 4 diff --git a/mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr b/mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr new file mode 100644 index 0000000..8905184 --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr @@ -0,0 +1,5 @@ +# textdomain: woodsoils +Forest Soil 1=Arbara Grundo 1 +Forest Soil 2=Arbara Grundo 2 +Forest Soil 3=Arbara Grundo 3 +Forest Soil 4=Arbara Grundo 4 diff --git a/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr b/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr new file mode 100644 index 0000000..a9e756e --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/locale/woodsoils.fr.tr @@ -0,0 +1,5 @@ +# textdomain: woodsoils +Forest Soil 1=Humus forestier 1 +Forest Soil 2=Humus forestier 2 +Forest Soil 3=Humus forestier 3 +Forest Soil 4=Humus forestier 4 diff --git a/mods/plantlife_modpack/woodsoils/mod.conf b/mods/plantlife_modpack/woodsoils/mod.conf new file mode 100644 index 0000000..9338a16 --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/mod.conf @@ -0,0 +1,3 @@ +name = woodsoils +depends = default, biome_lib +optional_depends = bushes, ferns, moretrees, trees, trunks diff --git a/mods/plantlife_modpack/woodsoils/nodes.lua b/mods/plantlife_modpack/woodsoils/nodes.lua new file mode 100644 index 0000000..94dd254 --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/nodes.lua @@ -0,0 +1,102 @@ +-- support for i18n +local S = minetest.get_translator("woodsoils") + +-- nodes + +minetest.register_node("woodsoils:dirt_with_leaves_1", { + description = S("Forest Soil 1"), + tiles = { + "default_dirt.png^woodsoils_ground_cover.png", + "default_dirt.png", + "default_dirt.png^woodsoils_ground_cover_side.png"}, + is_ground_content = true, + groups = { + crumbly=3, + soil=1--, + --not_in_creative_inventory=1 + }, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), + soil = { + base = "woodsoils:dirt_with_leaves_1", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("woodsoils:dirt_with_leaves_2", { + description = S("Forest Soil 2"), + tiles = { + "woodsoils_ground.png", + "default_dirt.png", + "default_dirt.png^woodsoils_ground_side.png"}, + is_ground_content = true, + groups = { + crumbly=3, + soil=1--, + --not_in_creative_inventory=1 + }, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), + soil = { + base = "woodsoils:dirt_with_leaves_2", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("woodsoils:grass_with_leaves_1", { + description = S("Forest Soil 3"), + tiles = { + "default_grass.png^woodsoils_ground_cover2.png", + "default_dirt.png", + "default_dirt.png^default_grass_side.png^woodsoils_ground_cover_side2.png"}, + is_ground_content = true, + groups = { + crumbly=3, + soil=1--, + --not_in_creative_inventory=1 + }, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), + soil = { + base = "woodsoils:grass_with_leaves_1", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("woodsoils:grass_with_leaves_2", { + description = S("Forest Soil 4"), + tiles = { + "default_grass.png^woodsoils_ground_cover.png", + "default_dirt.png", + "default_dirt.png^default_grass_side.png^woodsoils_ground_cover_side.png"}, + is_ground_content = true, + groups = { + crumbly=3, + soil=1--, + --not_in_creative_inventory=1 + }, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), + soil = { + base = "woodsoils:grass_with_leaves_2", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +-- For compatibility with older stuff +minetest.register_alias("forestsoils:dirt_with_leaves_1", "woodsoils:dirt_with_leaves_1") +minetest.register_alias("forestsoils:dirt_with_leaves_2", "woodsoils:dirt_with_leaves_2") +minetest.register_alias("forestsoils:grass_with_leaves_1", "woodsoils:grass_with_leaves_1") +minetest.register_alias("forestsoils:grass_with_leaves_2", "woodsoils:grass_with_leaves_2") diff --git a/mods/plantlife_modpack/woodsoils/textures/credit_textures.txt b/mods/plantlife_modpack/woodsoils/textures/credit_textures.txt new file mode 100644 index 0000000..45d582d --- /dev/null +++ b/mods/plantlife_modpack/woodsoils/textures/credit_textures.txt @@ -0,0 +1,16 @@ +------------------------------------------------------------- +Credit for textures of "woodsoils" +------------------------------------------------------------- +(If more than one author is listed the names are in alphabetical order) +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +FOLDER TEXTURE AUTHORS +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +../woodsoils/textures woodsoils_ground.png Mossmanikin + woodsoils_ground_cover.png Mossmanikin + woodsoils_ground_cover_side.png Mossmanikin + woodsoils_ground_cover_side2.png Mossmanikin + woodsoils_ground_cover2.png Mossmanikin + woodsoils_ground_side.png Mossmanikin +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +../woodsoils/textures/not in use woodsoils.png Mossmanikin +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground.png new file mode 100644 index 0000000..907b345 Binary files /dev/null and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground.png differ diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover.png new file mode 100644 index 0000000..103f103 Binary files /dev/null and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover.png differ diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover2.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover2.png new file mode 100644 index 0000000..ec18dd6 Binary files /dev/null and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover2.png differ diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png new file mode 100644 index 0000000..615c2dd Binary files /dev/null and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side.png differ diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side2.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side2.png new file mode 100644 index 0000000..f4e4ce6 Binary files /dev/null and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_cover_side2.png differ diff --git a/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_side.png b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_side.png new file mode 100644 index 0000000..08fb4be Binary files /dev/null and b/mods/plantlife_modpack/woodsoils/textures/woodsoils_ground_side.png differ diff --git a/mods/plantlife_modpack/youngtrees/init.lua b/mods/plantlife_modpack/youngtrees/init.lua new file mode 100644 index 0000000..1530140 --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/init.lua @@ -0,0 +1,149 @@ +-- support for i18n +local S = minetest.get_translator("youngtrees") + +local youngtree_rarity = minetest.settings:get("youngtrees.youngtree_rarity") or 0.0005 + +minetest.register_node("youngtrees:bamboo", { + description = S("Young Bamboo Tree"), + drawtype="nodebox", + tiles = {"bamboo.png"}, + paramtype = "light", + walkable = false, + is_ground_content = false, + node_box = { + type = "fixed", + fixed = { + {-0.058251,-0.500000,-0.413681,0.066749,0.500000,-0.282500}, --NodeBox 1 + {-0.058251,-0.500000,-0.103123,0.066749,0.500000,0.038672}, --NodeBox 2 + {-0.058251,-0.500000,0.181227,0.066749,0.500000,0.342500}, --NodeBox 3 + } + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + drop = 'trunks:twig_1' +}) + + +minetest.register_alias("youngtrees:youngtree2_middle", "default:bush_stem") + +minetest.register_node("youngtrees:youngtree_top", { + description = S("Young Tree (top)"), + drawtype = "plantlike", + tiles = {"youngtree16xa.png"}, + inventory_image = "youngtree16xa.png", + wield_image = "youngtree16xa.png", + paramtype = "light", + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + drop = 'trunks:twig_1' +}) + +minetest.register_node("youngtrees:youngtree_middle", { + description = S("Young Tree (middle)"), + drawtype = "plantlike", + tiles = {"youngtree16xb.png"}, + inventory_image = "youngtree16xb.png", + wield_image = "youngtree16xb.png", + paramtype = "light", + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + drop = 'trunks:twig_1' +}) + +minetest.register_node("youngtrees:youngtree_bottom", { + description = S("Young Tree (bottom)"), + drawtype = "plantlike", + tiles = {"youngtree16xc.png"}, + inventory_image = "youngtree16xc.png", + wield_image = "youngtree16xc.png", + paramtype = "light", + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + on_timer = function(pos, elapsed) + local function validateNode(node) + if not minetest.registered_nodes[node.name] or minetest.registered_nodes[node.name].drawtype ~= "airlike" then + return false + end + return true + end + + local onePos, twoPos = vector.new(pos.x, pos.y+1, pos.z), vector.new(pos.x, pos.y+2, pos.z) + local oneAbove, twoAbove = minetest.get_node_or_nil(onePos), minetest.get_node_or_nil(twoPos) + if not oneAbove or not twoAbove or not validateNode(oneAbove) or not validateNode(twoAbove) then + minetest.swap_node(pos, {name="air"}) + return + end + + if math.random() > 0.5 then + minetest.set_node(onePos, {name="youngtrees:youngtree_top"}) + else + minetest.set_node(onePos, {name="youngtrees:youngtree_middle"}) + minetest.set_node(twoPos, {name="youngtrees:youngtree_top"}) + end + end, + groups = {snappy=3,flammable=2,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + drop = 'trunks:twig_1' +}) + +minetest.register_decoration({ + name = "youngtrees:youngtree", + decoration = { + "youngtrees:youngtree_bottom" + }, + fill_ratio = youngtree_rarity, + y_min = 1, + y_max = 40, + param2 = 0, + param2_max = 3, + place_on = { + "default:dirt_with_grass", + "stoneage:grass_with_silex", + "sumpf:peat", + "sumpf:sumpf" + }, + deco_type = "simple", + flags = "all_floors", +}) + +--[[ + this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids + if other mods clear the registered decorations +]] +local did +minetest.register_on_mods_loaded(function() + did = minetest.get_decoration_id("youngtrees:youngtree") + minetest.set_gen_notify("decoration", {did}) +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + local g = minetest.get_mapgen_object("gennotify") + local locations = {} + + local deco_locations = g["decoration#" .. did] or {} + for _, pos in pairs(deco_locations) do + locations[#locations+1] = pos + end + + if #locations == 0 then return end + for _, pos in ipairs(locations) do + local timer = minetest.get_node_timer({x=pos.x, y=pos.y+1, z=pos.z}) + timer:start(0) + end +end) diff --git a/mods/plantlife_modpack/youngtrees/locale/template.txt b/mods/plantlife_modpack/youngtrees/locale/template.txt new file mode 100644 index 0000000..a7ebcaa --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: youngtrees +Young Bamboo Tree= +Young Tree (top)= +Young Tree (middle)= +Young Tree (bottom)= diff --git a/mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr b/mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr new file mode 100644 index 0000000..8ada50a --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr @@ -0,0 +1,5 @@ +# textdomain: youngtrees +Young Bamboo Tree=Junger Bambus +Young Tree (top)=Strauch (Spitze) +Young Tree (middle)=Strauch (Mitte) +Young Tree (bottom)=Strauch (Ansatz) diff --git a/mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr b/mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr new file mode 100644 index 0000000..365f0c7 --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr @@ -0,0 +1,5 @@ +# textdomain: youngtrees +Young Bamboo Tree=Juna Bambuarbo +Young Tree (top)=Juna Arbo (supro) +Young Tree (middle)=Juna Arbo (mezo) +Young Tree (bottom)=Juna Arbo (malsupro) diff --git a/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr b/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr new file mode 100644 index 0000000..1c9f437 --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/locale/youngtrees.fr.tr @@ -0,0 +1,5 @@ +# textdomain: youngtrees +Young Bamboo Tree=Bambou jeune +Young Tree (top)=Arbuste (haut) +Young Tree (middle)=Arbuste (milieu) +Young Tree (bottom)=Arbuste (bas) diff --git a/mods/plantlife_modpack/youngtrees/mod.conf b/mods/plantlife_modpack/youngtrees/mod.conf new file mode 100644 index 0000000..5a8e9fb --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/mod.conf @@ -0,0 +1,3 @@ +name = youngtrees +depends = default +optional_depends = ebiomes diff --git a/mods/plantlife_modpack/youngtrees/settingtypes.txt b/mods/plantlife_modpack/youngtrees/settingtypes.txt new file mode 100644 index 0000000..de07b5b --- /dev/null +++ b/mods/plantlife_modpack/youngtrees/settingtypes.txt @@ -0,0 +1,2 @@ +# Youngtree rarity (higher number -> higher probability) +youngtrees.youngtree_rarity (Youngtree rarity) float 0.0005 0.0001 1 diff --git a/mods/plantlife_modpack/youngtrees/textures/bamboo.png b/mods/plantlife_modpack/youngtrees/textures/bamboo.png new file mode 100644 index 0000000..018d42e Binary files /dev/null and b/mods/plantlife_modpack/youngtrees/textures/bamboo.png differ diff --git a/mods/plantlife_modpack/youngtrees/textures/youngtree16xa.png b/mods/plantlife_modpack/youngtrees/textures/youngtree16xa.png new file mode 100644 index 0000000..9bba623 Binary files /dev/null and b/mods/plantlife_modpack/youngtrees/textures/youngtree16xa.png differ diff --git a/mods/plantlife_modpack/youngtrees/textures/youngtree16xb.png b/mods/plantlife_modpack/youngtrees/textures/youngtree16xb.png new file mode 100644 index 0000000..d83b7a3 Binary files /dev/null and b/mods/plantlife_modpack/youngtrees/textures/youngtree16xb.png differ diff --git a/mods/plantlife_modpack/youngtrees/textures/youngtree16xc.png b/mods/plantlife_modpack/youngtrees/textures/youngtree16xc.png new file mode 100644 index 0000000..cfe3cf1 Binary files /dev/null and b/mods/plantlife_modpack/youngtrees/textures/youngtree16xc.png differ diff --git a/mods/plantlife_modpack/youngtrees/textures/youngtree2branch.png b/mods/plantlife_modpack/youngtrees/textures/youngtree2branch.png new file mode 100644 index 0000000..89b2f23 Binary files /dev/null and b/mods/plantlife_modpack/youngtrees/textures/youngtree2branch.png differ diff --git a/mods/renewable_desert_stone/.gitattributes b/mods/renewable_desert_stone/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/mods/renewable_desert_stone/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/mods/renewable_desert_stone/LICENSE b/mods/renewable_desert_stone/LICENSE new file mode 100644 index 0000000..c06237e --- /dev/null +++ b/mods/renewable_desert_stone/LICENSE @@ -0,0 +1,9 @@ + + +Copyright 2025 Emandac + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mods/renewable_desert_stone/README b/mods/renewable_desert_stone/README new file mode 100644 index 0000000..ea666d5 --- /dev/null +++ b/mods/renewable_desert_stone/README @@ -0,0 +1 @@ +A crafting recipe to craft desert stone. \ No newline at end of file diff --git a/mods/renewable_desert_stone/init.lua b/mods/renewable_desert_stone/init.lua new file mode 100644 index 0000000..285ffdb --- /dev/null +++ b/mods/renewable_desert_stone/init.lua @@ -0,0 +1,7 @@ + +minetest.register_craft({ + output="default:desert_stone", + recipe={{ + "default:stone","group:sand" + }} +}) \ No newline at end of file diff --git a/mods/renewable_desert_stone/mod.conf b/mods/renewable_desert_stone/mod.conf new file mode 100644 index 0000000..74fe91e --- /dev/null +++ b/mods/renewable_desert_stone/mod.conf @@ -0,0 +1,5 @@ +name = renewable_desert_stone + +description = A crafting recipe to craft desert stone. + +depends = default diff --git a/mods/renewable_desert_stone/screenshot.png b/mods/renewable_desert_stone/screenshot.png new file mode 100644 index 0000000..d2fbd04 Binary files /dev/null and b/mods/renewable_desert_stone/screenshot.png differ diff --git a/mods/technic_plus/.gitattributes b/mods/technic_plus/.gitattributes new file mode 100644 index 0000000..0bd0d32 --- /dev/null +++ b/mods/technic_plus/.gitattributes @@ -0,0 +1,29 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain + +# Release export attributes +technic/spec/** export-ignore +.github/** export-ignore +.luacheckrc export-ignore +.mailmap export-ignore +integration-test.sh export-ignore diff --git a/mods/technic_plus/.gitignore b/mods/technic_plus/.gitignore new file mode 100644 index 0000000..227a256 --- /dev/null +++ b/mods/technic_plus/.gitignore @@ -0,0 +1,166 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store + +#gedit backup files +*~ + diff --git a/mods/technic_plus/.gitmodules b/mods/technic_plus/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/mods/technic_plus/README.md b/mods/technic_plus/README.md new file mode 100644 index 0000000..651aeed --- /dev/null +++ b/mods/technic_plus/README.md @@ -0,0 +1,168 @@ +Technic +----------------- + +A mod for [minetest](http://www.minetest.net) + +![integration-test](https://github.com/mt-mods/technic/workflows/integration-test/badge.svg) +![luacheck](https://github.com/mt-mods/technic/workflows/luacheck/badge.svg) +![mineunit](https://github.com/mt-mods/technic/workflows/mineunit/badge.svg) +![](https://byob.yarr.is/mt-mods/technic/coverage) + +[![License](https://img.shields.io/badge/license-LGPLv2.0%2B-purple.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.en.html) +[![ContentDB](https://content.minetest.net/packages/mt-mods/technic_plus/shields/downloads/)](https://content.minetest.net/packages/mt-mods/technic_plus/) + + +# Overview + + + +The technic modpack extends the Minetest game with many new elements, +mainly constructable machines and tools. It is a large modpack, and +tends to dominate gameplay when it is used. This manual describes how +to use the technic modpack, mainly from a player's perspective. + +The technic modpack depends on some other modpacks: + +* the basic Minetest game +* mesecons, which supports the construction of logic systems based on + signalling elements +* pipeworks, which supports the automation of item transport +* moreores, which provides some additional ore types +* basic_materials, which provides some basic craft items + +This manual doesn't explain how to use these other modpacks, which have +their own manuals: + +* [Minetest Game Documentation](https://wiki.minetest.net/Main_Page) +* [Mesecons Documentation](http://mesecons.net/items.html) +* [Pipeworks Documentation](https://gitlab.com/VanessaE/pipeworks/-/wikis/home) +* [Moreores Forum Post](https://forum.minetest.net/viewtopic.php?t=549) +* [Basic materials Repository](https://gitlab.com/VanessaE/basic_materials) + +Recipes for constructable items in technic are generally not guessable, +and are also not specifically documented here. You should use a +craft guide mod to look up the recipes in-game. For the best possible +guidance, use the unified\_inventory mod, with which technic registers +its specialised recipe types. + +# Documentation + +Ingame: + +* [Resources](./technic/doc/resources.md) +* [Substances](./technic/doc/substances.md) +* [Processes](./technic/doc/processes.md) +* [Chests](./technic/doc/chests.md) +* [Radioactivity](./technic/doc/radioactivity.md) +* [Electrical power](./technic/doc/power.md) +* [Powered machines](./technic/doc/machines.md) +* [Generators](./technic/doc/generators.md) +* [Forceload anchor](./technic/doc/anchor.md) +* [Digilines](./technic/doc/digilines.md) +* [Mesecons](./technic/doc/mesecons.md) +* [Tools](./technic/doc/tools.md) + +Mod development: + +* [Api](./technic/doc/api.md) + +subjects missing from this manual: + +* frames +* templates + +## FAQ + +1. My technic circuit doesn't work. No power is distributed. + * A: Make sure you have a switching station connected. + +# Notes + +This is a maintained fork of https://github.com/minetest-mods/technic with various enhancements. +Suitable for multiplayer environments. + +* Chainsaw and HV Quarry re-implementation (@OgelGames) +* Switching station lag/polyfuse and globalstep execution (@BuckarooBanzay) +* No forceload hacks +* Additional HV machines (@h-v-smacker) +* LV, MV, and HV digiline cables (@S-S-X and @SwissalpS) +* various others... + +## Compatibility + +This mod is meant as a **drop-in replacement** for the upstream `technic` mod. +It also provides some additional machines and items, notably: + +* HV Grinder, Furnace, and Compressor +* LV Lamp +* LV, MV, and HV Digiline cables + +# Recommended mods + +Dependencies: + +* https://github.com/minetest-mods/mesecons +* https://github.com/minetest-mods/moreores +* https://gitlab.com/VanessaE/pipeworks +* https://gitlab.com/VanessaE/basic_materials + +Recommended optional Dependencies: + +* https://github.com/minetest-mods/digilines + +Recommended mods that build on the `technic mod`: + +* https://github.com/mt-mods/jumpdrive +* https://github.com/OgelGames/powerbanks + +# Settings (worldpath/technic.conf) + +| Configuration key | Description +|----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------| +| enable_mining_drill | | +| enable_mining_laser | | +| enable_flashlight | | +| enable_wind_mill | | +| enable_frames | | +| enable_corium_griefing | | +| enable_radiation_protection | | +| enable_radiation_throttling | enable lag- and per-second-trottling of radiation damage | +| enable_entity_radiation_damage | | +| enable_longterm_radiation_damage | | +| enable_nuclear_reactor_digiline_selfdestruct | | +| admin_priv | Privileges required to use administrative chat commands like cache flushing and enabling/disabling machines globally. | +| quarry_max_depth | max depth of the quarry. | +| quarry_time_limit | max cpu time in μs allowed per quarry step. | +| quarry_dig_above_nodes | begin digging this many nodes above quarry node. | +| network_overload_reset_time | After network conflict wait this many seconds before attempting to activate conflicting networks again. | +| switch_max_range | max cable length. | +| switch_off_delay_seconds | switching station off delay. | + +See defaults for settings here: [technic/config.lua](https://github.com/mt-mods/technic/blob/master/technic/config.lua) + +# Chat commands + +* **/technic_flush_switch_cache** clears the switching station cache (stops all unloaded switches) +* **/powerctrl [on|off]** enable/disable technic power distribution globally + +# Contributors + +* kpoppel +* Nekogloop +* Nore/Ekdohibs +* ShadowNinja +* VanessaE +* BuckarooBanzay +* OgelGames +* int-ua +* S-S-X +* H-V-Smacker +* groxxda +* SwissalpS +* And many others... + +# License + +Unless otherwise stated, all components of this modpack are licensed under the +LGPL, V2 or later. See also the individual mod folders for their +secondary/alternate licenses, if any. diff --git a/mods/technic_plus/concrete/depends.txt b/mods/technic_plus/concrete/depends.txt new file mode 100644 index 0000000..5ca909c --- /dev/null +++ b/mods/technic_plus/concrete/depends.txt @@ -0,0 +1,4 @@ +default +basic_materials +intllib? +moreblocks? diff --git a/mods/technic_plus/concrete/init.lua b/mods/technic_plus/concrete/init.lua new file mode 100644 index 0000000..82b4098 --- /dev/null +++ b/mods/technic_plus/concrete/init.lua @@ -0,0 +1,133 @@ +--Minetest 0.4.7 mod: concrete +--(c) 2013 by RealBadAngel + +local technic = rawget(_G, "technic") or {} +technic.concrete_posts = {} + +-- Boilerplate to support localized strings if intllib mod is installed. +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +for i = 0, 31 do + minetest.register_alias("technic:concrete_post"..i, + "technic:concrete_post") +end +for i = 32, 63 do + minetest.register_alias("technic:concrete_post"..i, + "technic:concrete_post_with_platform") +end + +minetest.register_craft({ + output = 'technic:concrete_post_platform 6', + recipe = { + {'technic:concrete','technic:concrete_post','technic:concrete'}, + } +}) + +minetest.register_craft({ + output = 'technic:concrete_post 12', + recipe = { + {'default:stone','basic_materials:steel_bar','default:stone'}, + {'default:stone','basic_materials:steel_bar','default:stone'}, + {'default:stone','basic_materials:steel_bar','default:stone'}, + } +}) + +minetest.register_craft({ + output = 'technic:blast_resistant_concrete 5', + recipe = { + {'technic:concrete','technic:composite_plate','technic:concrete'}, + {'technic:composite_plate','technic:concrete','technic:composite_plate'}, + {'technic:concrete','technic:composite_plate','technic:concrete'}, + } +}) + +minetest.register_node(":technic:blast_resistant_concrete", { + description = S("Blast-resistant Concrete Block"), + tiles = {"technic_blast_resistant_concrete_block.png",}, + groups = {cracky=1, level=3, concrete=1}, + sounds = default.node_sound_stone_defaults(), + on_blast = function(pos, intensity) + if intensity > 9 then + minetest.remove_node(pos) + return {"technic:blast_resistant_concrete"} + end + end, +}) + +if minetest.get_modpath("moreblocks") then + stairsplus:register_all("technic","blast_resistant_concrete","technic:blast_resistant_concrete",{ + description = "Blast-resistant Concrete", + tiles = {"technic_blast_resistant_concrete_block.png",}, + groups = {cracky=1, level=3, concrete=1}, + sounds = default.node_sound_stone_defaults(), + on_blast = function(pos, intensity) + if intensity > 1 then + minetest.remove_node(pos) + minetest.add_item(pos, "technic:blast_resistant_concrete") + end + end, + }) +end + +local box_platform = {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5} +local box_post = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15} +local box_front = {-0.1, -0.3, -0.5, 0.1, 0.3, 0} +local box_back = {-0.1, -0.3, 0, 0.1, 0.3, 0.5} +local box_left = {-0.5, -0.3, -0.1, 0, 0.3, 0.1} +local box_right = {0, -0.3, -0.1, 0.5, 0.3, 0.1} + +minetest.register_node(":technic:concrete_post_platform", { + description = S("Concrete Post Platform"), + tiles = {"basic_materials_concrete_block.png",}, + groups={cracky=1, level=2}, + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {box_platform} + }, + on_place = function (itemstack, placer, pointed_thing) + local node = minetest.get_node(pointed_thing.under) + if node.name ~= "technic:concrete_post" then + return minetest.item_place_node(itemstack, placer, pointed_thing) + end + minetest.set_node(pointed_thing.under, {name="technic:concrete_post_with_platform"}) + itemstack:take_item() + placer:set_wielded_item(itemstack) + return itemstack + end, +}) + +for platform = 0, 1 do + local after_dig_node = nil + if platform == 1 then + after_dig_node = function(pos, old_node) + old_node.name = "technic:concrete_post" + minetest.set_node(pos, old_node) + end + end + + minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), { + description = S("Concrete Post"), + tiles = {"basic_materials_concrete_block.png"}, + groups = {cracky=1, level=2, concrete_post=1, not_in_creative_inventory=platform}, + sounds = default.node_sound_stone_defaults(), + drop = (platform == 1 and "technic:concrete_post_platform" or + "technic:concrete_post"), + paramtype = "light", + sunlight_propagates = true, + drawtype = "nodebox", + connects_to = {"group:concrete", "group:concrete_post"}, + node_box = { + type = "connected", + fixed = {box_post, (platform == 1 and box_platform or nil)}, + connect_front = box_front, + connect_back = box_back, + connect_left = box_left, + connect_right = box_right, + }, + after_dig_node = after_dig_node, + }) +end + diff --git a/mods/technic_plus/concrete/locale/de.txt b/mods/technic_plus/concrete/locale/de.txt new file mode 100644 index 0000000..83fdc19 --- /dev/null +++ b/mods/technic_plus/concrete/locale/de.txt @@ -0,0 +1,10 @@ +# German Translation for technic_concrete +# Deutsche Übersetzung von technic_concrete +# by Xanthin + +Rebar = Bewehrungsstab +Concrete Block = Betonblock +Blast-resistant Concrete Block = Explosionsbestaendiger Betonblock +Concrete Post Platform = Betonpfostenplattform +Concrete Post = Betonpfosten + diff --git a/mods/technic_plus/concrete/locale/es.txt b/mods/technic_plus/concrete/locale/es.txt new file mode 100644 index 0000000..b7ea30a --- /dev/null +++ b/mods/technic_plus/concrete/locale/es.txt @@ -0,0 +1,8 @@ +# technic_concrete traducido por Carlos Barraza + +Rebar = Barra de refuerzo +Concrete Block = Bloque de concreto +Blast-resistant Concrete Block = Bloque de concreto resistente a explosiones +Concrete Post Platform = Plataforma de concreto +Concrete Post = Postes de concreto + diff --git a/mods/technic_plus/concrete/locale/fr.txt b/mods/technic_plus/concrete/locale/fr.txt new file mode 100644 index 0000000..4af4530 --- /dev/null +++ b/mods/technic_plus/concrete/locale/fr.txt @@ -0,0 +1,7 @@ +# technic_concrete translation template + +Rebar = Armature +Concrete Block = Bloc de béton +Blast-resistant Concrete Block = Bloc de béton anti explosions +Concrete Post Platform = Plateforme en béton +Concrete Post = Pilier en béton diff --git a/mods/technic_plus/concrete/locale/pl.txt b/mods/technic_plus/concrete/locale/pl.txt new file mode 100644 index 0000000..3b2e6f5 --- /dev/null +++ b/mods/technic_plus/concrete/locale/pl.txt @@ -0,0 +1,10 @@ +# Polish Translation for technic_concrete +# Polskie tłumaczenie technic_concrete +# by mat9117 + +Rebar = Pręt zbrojeniowy +Concrete Block = Blok betonu +Blast-resistant Concrete Block = Przeciwwybuchowy blok betonu +Concrete Post Platform = Betonowa platforma +Concrete Post = Betonowy słup + diff --git a/mods/technic_plus/concrete/locale/pt_BR.txt b/mods/technic_plus/concrete/locale/pt_BR.txt new file mode 100644 index 0000000..057ace5 --- /dev/null +++ b/mods/technic_plus/concrete/locale/pt_BR.txt @@ -0,0 +1,10 @@ +# Braziliam portuguese translation for technic_concrete +# Tradução portuguesa brasileira para technic_concrete +# By Sires + +Rebar = Vergalhão +Concrete Block = Bloco de Concreto +Blast-resistant Concrete Block = Bloco de Concreto resistente-a-explosões +Concrete Post Platform = Plataforma para Poste de Concreto +Concrete Post = Poste de Concreto + diff --git a/mods/technic_plus/concrete/locale/template.txt b/mods/technic_plus/concrete/locale/template.txt new file mode 100644 index 0000000..451adaf --- /dev/null +++ b/mods/technic_plus/concrete/locale/template.txt @@ -0,0 +1,8 @@ +# technic_concrete translation template + +Rebar = +Concrete Block = +Blast-resistant Concrete Block = +Concrete Post Platform = +Concrete Post = + diff --git a/mods/technic_plus/concrete/locale/tr.txt b/mods/technic_plus/concrete/locale/tr.txt new file mode 100644 index 0000000..179d29b --- /dev/null +++ b/mods/technic_plus/concrete/locale/tr.txt @@ -0,0 +1,7 @@ +# turkish translation by mahmutelmas06 + +Rebar = Beton demiri +Concrete Block = Beton blok +Blast-resistant Concrete Block = Patlamaya dayanıklı beton blok +Concrete Post Platform = Beton direk platformu +Concrete Post = Beton direk diff --git a/mods/technic_plus/concrete/locale/zh_CN.txt b/mods/technic_plus/concrete/locale/zh_CN.txt new file mode 100644 index 0000000..2158762 --- /dev/null +++ b/mods/technic_plus/concrete/locale/zh_CN.txt @@ -0,0 +1,5 @@ +Rebar =¸ֽî +Concrete Block =»ìÄýÍÁ¿é +Blast-resistant Concrete Block =¿¹±¬»ìÄýÍÁ¿é +Concrete Post Platform =»ìÄýÍÁÖùƽ̨ +Concrete Post =»ìÄýÍÁÖù diff --git a/mods/technic_plus/concrete/mod.conf b/mods/technic_plus/concrete/mod.conf new file mode 100644 index 0000000..506f906 --- /dev/null +++ b/mods/technic_plus/concrete/mod.conf @@ -0,0 +1,3 @@ +name = concrete +depends = default +optional_depends = basic_materials, intllib, moreblocks diff --git a/mods/technic_plus/concrete/textures/technic_blast_resistant_concrete_block.png b/mods/technic_plus/concrete/textures/technic_blast_resistant_concrete_block.png new file mode 100644 index 0000000..4136c7f Binary files /dev/null and b/mods/technic_plus/concrete/textures/technic_blast_resistant_concrete_block.png differ diff --git a/mods/technic_plus/concrete/textures/x32/technic_concrete_block.png b/mods/technic_plus/concrete/textures/x32/technic_concrete_block.png new file mode 100644 index 0000000..71914c9 Binary files /dev/null and b/mods/technic_plus/concrete/textures/x32/technic_concrete_block.png differ diff --git a/mods/technic_plus/concrete/textures/x32/technic_rebar.png b/mods/technic_plus/concrete/textures/x32/technic_rebar.png new file mode 100644 index 0000000..fc0b963 Binary files /dev/null and b/mods/technic_plus/concrete/textures/x32/technic_rebar.png differ diff --git a/mods/technic_plus/extranodes/depends.txt b/mods/technic_plus/extranodes/depends.txt new file mode 100644 index 0000000..0279a18 --- /dev/null +++ b/mods/technic_plus/extranodes/depends.txt @@ -0,0 +1,9 @@ +default +technic_worldgen +basic_materials +concrete +unifieddyes? +intllib? +moreblocks? +steel? +streetsmod? diff --git a/mods/technic_plus/extranodes/init.lua b/mods/technic_plus/extranodes/init.lua new file mode 100644 index 0000000..929f7f8 --- /dev/null +++ b/mods/technic_plus/extranodes/init.lua @@ -0,0 +1,331 @@ +-- Minetest 0.4.6 mod: extranodes +-- namespace: technic +-- Boilerplate to support localized strings if intllib mod is installed. +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +if minetest.get_modpath("moreblocks") then + + -- register stairsplus/circular_saw nodes + -- we skip blast resistant concrete and uranium intentionally + -- chrome seems to be too hard of a metal to be actually sawable + + stairsplus:register_all("technic", "marble", "technic:marble", { + description=S("Marble"), + groups={cracky=3, not_in_creative_inventory=1}, + tiles={"technic_marble.png"}, + }) + + stairsplus:register_all("technic", "marble_bricks", "technic:marble_bricks", { + description=S("Marble Bricks"), + groups={cracky=3, not_in_creative_inventory=1}, + tiles={"technic_marble_bricks.png"}, + }) + + stairsplus:register_all("technic", "granite", "technic:granite", { + description=S("Granite"), + groups={cracky=1, not_in_creative_inventory=1}, + tiles={"technic_granite.png"}, + }) + + stairsplus:register_all("technic", "concrete", "technic:concrete", { + description=S("Concrete"), + groups={cracky=3, not_in_creative_inventory=1}, + tiles={"basic_materials_concrete_block.png"}, + }) + + stairsplus:register_all("technic", "zinc_block", "technic:zinc_block", { + description=S("Zinc Block"), + groups={cracky=1, not_in_creative_inventory=1}, + tiles={"technic_zinc_block.png"}, + }) + + stairsplus:register_all("technic", "cast_iron_block", "technic:cast_iron_block", { + description=S("Cast Iron Block"), + groups={cracky=1, not_in_creative_inventory=1}, + tiles={"technic_cast_iron_block.png"}, + }) + + stairsplus:register_all("technic", "carbon_steel_block", "technic:carbon_steel_block", { + description=S("Carbon Steel Block"), + groups={cracky=1, not_in_creative_inventory=1}, + tiles={"technic_carbon_steel_block.png"}, + }) + + stairsplus:register_all("technic", "stainless_steel_block", "technic:stainless_steel_block", { + description=S("Stainless Steel Block"), + groups={cracky=1, not_in_creative_inventory=1}, + tiles={"technic_stainless_steel_block.png"}, + }) + + -- FIXME: Clean this function up somehow + local function register_technic_stairs_alias(modname, origname, newmod, newname) + minetest.register_alias(modname .. ":slab_" .. origname, newmod..":slab_" .. newname) + minetest.register_alias(modname .. ":slab_" .. origname .. + "_inverted", newmod..":slab_" .. newname .. "_inverted") + minetest.register_alias(modname .. ":slab_" .. origname .. "_wall", newmod..":slab_" .. newname .. "_wall") + minetest.register_alias(modname .. ":slab_" .. origname .. + "_quarter", newmod..":slab_" .. newname .. "_quarter") + minetest.register_alias(modname .. ":slab_" .. origname .. + "_quarter_inverted", newmod..":slab_" .. newname .. "_quarter_inverted") + minetest.register_alias(modname .. ":slab_" .. origname .. + "_quarter_wall", newmod..":slab_" .. newname .. "_quarter_wall") + minetest.register_alias(modname .. ":slab_" .. origname .. + "_three_quarter", newmod..":slab_" .. newname .. "_three_quarter") + minetest.register_alias(modname .. ":slab_" .. origname .. + "_three_quarter_inverted", newmod..":slab_" .. newname .. "_three_quarter_inverted") + minetest.register_alias(modname .. ":slab_" .. origname .. + "_three_quarter_wall", newmod..":slab_" .. newname .. "_three_quarter_wall") + minetest.register_alias(modname .. ":stair_" .. origname, newmod..":stair_" .. newname) + minetest.register_alias(modname .. ":stair_" .. origname .. + "_inverted", newmod..":stair_" .. newname .. "_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_wall", newmod..":stair_" .. newname .. "_wall") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_wall_half", newmod..":stair_" .. newname .. "_wall_half") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_half", newmod..":stair_" .. newname .. "_half") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_half_inverted", newmod..":stair_" .. newname .. "_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_right_half", newmod..":stair_" .. newname .. "_right_half") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_right_half_inverted", newmod..":stair_" .. newname .. "_right_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_wall_half", newmod..":stair_" .. newname .. "_wall_half") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_inner", newmod..":stair_" .. newname .. "_inner") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_inner_inverted", newmod..":stair_" .. newname .. "_inner_inverted") + minetest.register_alias(modname .. ":stair_" .. origname .. "_outer", newmod..":stair_" .. newname .. "_outer") + minetest.register_alias(modname .. ":stair_" .. origname .. + "_outer_inverted", newmod..":stair_" .. newname .. "_outer_inverted") + minetest.register_alias(modname .. ":panel_" .. origname .. + "_bottom", newmod..":panel_" .. newname .. "_bottom") + minetest.register_alias(modname .. ":panel_" .. origname .. "_top", newmod..":panel_" .. newname .. "_top") + minetest.register_alias(modname .. ":panel_" .. origname .. + "_vertical", newmod..":panel_" .. newname .. "_vertical") + minetest.register_alias(modname .. ":micro_" .. origname .. + "_bottom", newmod..":micro_" .. newname .. "_bottom") + minetest.register_alias(modname .. ":micro_" .. origname .. "_top", newmod..":micro_" .. newname .. "_top") + end + + register_technic_stairs_alias("stairsplus", "concrete", "technic", "concrete") + register_technic_stairs_alias("stairsplus", "marble", "technic", "marble") + register_technic_stairs_alias("stairsplus", "granite", "technic", "granite") + register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks") + +end + +local iclip_def = { + description = S("Insulator/cable clip"), + drawtype = "mesh", + mesh = "technic_insulator_clip.obj", + tiles = {"technic_insulator_clip.png"}, + paramtype = "light", + is_ground_content = false, + groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1 }, + sounds = default.node_sound_stone_defaults(), +} + +local iclipfence_def = { + description = S("Insulator/cable clip"), + tiles = {"technic_insulator_clip.png"}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = { + { -0.25, 0.75, -0.25, 0.25, 1.25, 0.25 }, -- the clip on top + { -0.125, 0.6875, -0.125, 0.125, 0.75, 0.125 }, + { -0.1875, 0.625, -0.1875, 0.1875, 0.6875, 0.1875 }, + { -0.125, 0.5625, -0.125, 0.125, 0.625, 0.125 }, + { -0.1875, 0.5, -0.1875, 0.1875, 0.5625, 0.1875 }, + { -0.125, 0.4375, -0.125, 0.125, 0.5, 0.125 }, + { -0.1875, 0.375, -0.1875, 0.1875, 0.4375, 0.1875 }, + { -0.125, -0.5, -0.125, 0.125, 0.375, 0.125 }, -- the post, slightly short + }, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8}, + {-1/16,-5/16,-1/2,1/16,-3/16,-1/8}}, + connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16}, + {-1/2,-5/16,-1/16,-1/8,-3/16,1/16}}, + connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2}, + {-1/16,-5/16,1/8,1/16,-3/16,1/2}}, + connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, + {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, + }, + connects_to = {"group:fence", "group:wood", "group:tree"}, + groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1 }, + sounds = default.node_sound_stone_defaults(), +} + +local sclip_tex = { + "technic_insulator_clip.png", + { name = "strut.png^technic_steel_strut_overlay.png", color = "white" }, + { name = "strut.png", color = "white" } +} + +local streetsmod = minetest.get_modpath("streets") or minetest.get_modpath ("steelsupport") +-- cheapie's fork breaks it into several individual mods, with differernt names for the same content. + +if streetsmod then + sclip_tex = { + "technic_insulator_clip.png", + { name = "streets_support.png^technic_steel_strut_overlay.png", color = "white" }, + { name = "streets_support.png", color = "white" } + } +end + +local sclip_def = { + description = S("Steel strut with insulator/cable clip"), + drawtype = "mesh", + mesh = "technic_steel_strut_with_insulator_clip.obj", + tiles = sclip_tex, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = { choppy=1, cracky=1 }, + backface_culling = false +} + +if minetest.get_modpath("unifieddyes") then + iclip_def.paramtype2 = "colorwallmounted" + iclip_def.palette = "unifieddyes_palette_colorwallmounted.png" + iclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) + end + iclip_def.groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1} + iclip_def.on_dig = unifieddyes.on_dig + + iclipfence_def.paramtype2 = "color" + iclipfence_def.palette = "unifieddyes_palette_extended.png" + iclipfence_def.on_construct = unifieddyes.on_construct + iclipfence_def.groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1} + iclipfence_def.on_dig = unifieddyes.on_dig + + sclip_def.paramtype2 = "colorwallmounted" + sclip_def.palette = "unifieddyes_palette_colorwallmounted.png" + sclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) + end + sclip_def.on_dig = unifieddyes.on_dig + sclip_def.groups = {choppy=1, cracky=1, ud_param2_colorable = 1} +end + +minetest.register_node(":technic:insulator_clip", iclip_def) +minetest.register_node(":technic:insulator_clip_fencepost", iclipfence_def) + +minetest.register_craft({ + output = "technic:insulator_clip", + recipe = { + { "", "dye:white", ""}, + { "", "technic:raw_latex", ""}, + { "technic:raw_latex", "default:stone", "technic:raw_latex"}, + } +}) + +minetest.register_craft({ + output = "technic:insulator_clip_fencepost 2", + recipe = { + { "", "dye:white", ""}, + { "", "technic:raw_latex", ""}, + { "technic:raw_latex", "default:fence_wood", "technic:raw_latex"}, + } +}) + +local steelmod = minetest.get_modpath("steel") + +if streetsmod or steelmod then + minetest.register_node(":technic:steel_strut_with_insulator_clip", sclip_def) + + if steelmod then + minetest.register_craft({ + output = "technic:steel_strut_with_insulator_clip", + recipe = { + {"technic:insulator_clip_fencepost"}, + {"steel:strut_mount"} + } + }) + + minetest.register_craft({ + output = "technic:steel_strut_with_insulator_clip", + recipe = { + {"technic:insulator_clip_fencepost", "" }, + {"steel:strut", "default:steel_ingot" }, + } + }) + + elseif streetsmod then + minetest.register_craft({ + output = "technic:steel_strut_with_insulator_clip", + recipe = { + {"technic:insulator_clip_fencepost", "" }, + {"streets:steel_support", "default:steel_ingot" }, + } + }) + end +end + +if minetest.get_modpath("unifieddyes") then + + unifieddyes.register_color_craft({ + output = "technic:insulator_clip_fencepost", + palette = "extended", + type = "shapeless", + neutral_node = "technic:insulator_clip_fencepost", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE" + } + }) + + unifieddyes.register_color_craft({ + output = "technic:insulator_clip", + palette = "wallmounted", + type = "shapeless", + neutral_node = "technic:insulator_clip", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE" + } + }) + + unifieddyes.register_color_craft({ + output = "technic:steel_strut_with_insulator_clip", + palette = "wallmounted", + type = "shapeless", + neutral_node = "", + recipe = { + "technic:steel_strut_with_insulator_clip", + "MAIN_DYE" + } + }) + + if steelmod then + unifieddyes.register_color_craft({ + output = "technic:steel_strut_with_insulator_clip", + palette = "wallmounted", + neutral_node = "", + recipe = { + { "technic:insulator_clip_fencepost", "MAIN_DYE" }, + { "steel:strut_mount", "" }, + } + }) + end + + if streetsmod then + unifieddyes.register_color_craft({ + output = "technic:steel_strut_with_insulator_clip", + palette = "wallmounted", + neutral_node = "technic:steel_strut_with_insulator_clip", + recipe = { + { "technic:insulator_clip_fencepost", "MAIN_DYE" }, + { "streets:steel_support", "default:steel_ingot" }, + } + }) + end +end diff --git a/mods/technic_plus/extranodes/locale/de.txt b/mods/technic_plus/extranodes/locale/de.txt new file mode 100644 index 0000000..f3c017e --- /dev/null +++ b/mods/technic_plus/extranodes/locale/de.txt @@ -0,0 +1,9 @@ +# German Translation for technic_extranodes +# Deutsche Übersetzung von technic_extranodes +# by Xanthin + +Marble = Marmor +Marble Bricks = Marmorziegel +Granite = Granit +Concrete = Beton + diff --git a/mods/technic_plus/extranodes/locale/es.txt b/mods/technic_plus/extranodes/locale/es.txt new file mode 100644 index 0000000..8b28218 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/es.txt @@ -0,0 +1,7 @@ +# technic_extranodes traducido por Carlos Barraza + +Marble = Mármol +Marble Bricks = Ladrillos de mármol +Granite = Granito +Concrete = Concreto + diff --git a/mods/technic_plus/extranodes/locale/fr.txt b/mods/technic_plus/extranodes/locale/fr.txt new file mode 100644 index 0000000..0eb8a63 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/fr.txt @@ -0,0 +1,7 @@ +# technic_extranodes translation template + +Marble = Marbre +Marble Bricks = Briques en marbre +Granite = Granite +Concrete = Béton + diff --git a/mods/technic_plus/extranodes/locale/pl.txt b/mods/technic_plus/extranodes/locale/pl.txt new file mode 100644 index 0000000..f15bcf5 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/pl.txt @@ -0,0 +1,9 @@ +# Polish Translation for technic_extranodes +# Polskie tłumaczenie technic_extranodes +# by mat9117 + +Marble = Marmur +Marble Bricks = Marmurowe cegły +Granite = Granit +Concrete = Beton + diff --git a/mods/technic_plus/extranodes/locale/pt_BR.txt b/mods/technic_plus/extranodes/locale/pt_BR.txt new file mode 100644 index 0000000..e19d9f2 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/pt_BR.txt @@ -0,0 +1,9 @@ +# Braziliam portuguese translation for technic_extranodes +# Tradução portuguesa brasileira para technic_extranodes +# By Sires + +Marble = Mármore +Marble Bricks = Tijolos de Mármore +Granite = Granito +Concrete = Concreto + diff --git a/mods/technic_plus/extranodes/locale/template.txt b/mods/technic_plus/extranodes/locale/template.txt new file mode 100644 index 0000000..2ffe498 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/template.txt @@ -0,0 +1,7 @@ +# technic_extranodes translation template + +Marble = +Marble Bricks = +Granite = +Concrete = + diff --git a/mods/technic_plus/extranodes/locale/tr.txt b/mods/technic_plus/extranodes/locale/tr.txt new file mode 100644 index 0000000..90d8154 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/tr.txt @@ -0,0 +1,6 @@ +# turkish translation by mahmutelmas06 + +Marble = Mermer +Marble Bricks = Mermer tuğla +Granite = Granit +Concrete = Beton diff --git a/mods/technic_plus/extranodes/locale/zh_CN.txt b/mods/technic_plus/extranodes/locale/zh_CN.txt new file mode 100644 index 0000000..281ebe9 --- /dev/null +++ b/mods/technic_plus/extranodes/locale/zh_CN.txt @@ -0,0 +1,4 @@ +Marble =´óÀíʯ +Marble Bricks =´óÀíʯש +Granite =»¨¸ÚÑÒ +Concrete =»ìÄýÍÁ diff --git a/mods/technic_plus/extranodes/mod.conf b/mods/technic_plus/extranodes/mod.conf new file mode 100644 index 0000000..6f02b1c --- /dev/null +++ b/mods/technic_plus/extranodes/mod.conf @@ -0,0 +1,3 @@ +name = extranodes +depends = default, technic_worldgen, basic_materials, concrete +optional_depends = unifieddyes, intllib, moreblocks, steel, streetsmod diff --git a/mods/technic_plus/extranodes/models/technic_insulator_clip.obj b/mods/technic_plus/extranodes/models/technic_insulator_clip.obj new file mode 100644 index 0000000..1da5e88 --- /dev/null +++ b/mods/technic_plus/extranodes/models/technic_insulator_clip.obj @@ -0,0 +1,173 @@ +# Blender v2.72 (sub 0) OBJ File: '' +# www.blender.org +o Cube +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.249997 0.500000 0.249997 +v -0.249997 0.500000 -0.249997 +v 0.249997 0.500000 -0.249997 +v 0.249997 0.500000 0.249997 +v -0.187500 0.500000 0.187500 +v -0.187500 0.500000 -0.187500 +v 0.187500 0.500000 -0.187500 +v 0.187500 0.500000 0.187500 +v -0.187500 0.750000 0.187500 +v -0.187500 0.750000 -0.187500 +v 0.187500 0.750000 -0.187500 +v 0.187500 0.750000 0.187500 +v -0.250000 0.750000 0.250000 +v -0.250000 0.750000 -0.250000 +v 0.250000 0.750000 -0.250000 +v 0.250000 0.750000 0.250000 +v -0.250000 1.250000 0.250000 +v -0.250000 1.250000 -0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.250000 0.250000 +v -0.500000 0.312500 0.500000 +v -0.500000 0.312500 -0.500000 +v 0.500000 0.312500 -0.500000 +v 0.500000 0.312500 0.500000 +v 0.187500 0.625000 0.187500 +v 0.187500 0.625000 -0.187500 +v -0.187500 0.625000 -0.187500 +v -0.187500 0.625000 0.187500 +v 0.187500 0.562500 0.187500 +v 0.187500 0.687500 -0.187500 +v -0.187500 0.687500 -0.187500 +v -0.187500 0.562500 0.187500 +v 0.187500 0.687500 0.187500 +v 0.187500 0.562500 -0.187500 +v -0.187500 0.562500 -0.187500 +v -0.187500 0.687500 0.187500 +v 0.168668 0.531250 0.168668 +v 0.168668 0.718750 -0.168668 +v -0.168668 0.718750 -0.168668 +v -0.168668 0.531250 0.168668 +v 0.168668 0.656250 0.168668 +v 0.168668 0.593750 -0.168668 +v -0.168668 0.593750 -0.168668 +v -0.168668 0.656250 0.168668 +v 0.168668 0.593750 0.168668 +v 0.168668 0.656250 -0.168668 +v -0.168668 0.656250 -0.168668 +v -0.168668 0.593750 0.168668 +v 0.168668 0.718750 0.168668 +v 0.168668 0.531250 -0.168668 +v -0.168668 0.531250 -0.168668 +v -0.168668 0.718750 0.168668 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.749997 0.749997 +vt 0.749997 0.250003 +vt 0.250003 0.250003 +vt 0.250003 0.749997 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 0.312500 0.312500 +vt 0.312500 0.687500 +vt 0.687500 0.312500 +vt 0.687500 0.687500 +vt 0.331332 1.218750 +vt 0.668668 1.218750 +vt 0.687500 1.250000 +vt 0.312500 1.250000 +vt 0.750000 1.250000 +vt 0.750000 1.750000 +vt 0.250000 1.750000 +vt 0.250000 1.250000 +vt 0.331332 1.093750 +vt 0.668668 1.093750 +vt 0.687500 1.125000 +vt 0.312500 1.125000 +vt 0.331332 1.093750 +vt 0.668668 1.093750 +vt 0.331332 1.156250 +vt 0.668668 1.156250 +vt 0.687500 1.187500 +vt 0.312500 1.187500 +vt 0.331332 1.156250 +vt 0.668668 1.156250 +vt 0.331332 1.031250 +vt 0.668668 1.031250 +vt 0.687500 1.062500 +vt 0.312500 1.062500 +vt 0.312500 1.000000 +vt 0.687500 1.000000 +vn 0.000000 -1.000000 -0.000000 +vn -0.600000 0.800000 -0.000000 +vn 0.000000 0.800000 -0.600000 +vn 0.600000 0.800000 0.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.856500 -0.516200 0.000000 +vn 0.000000 -0.516200 -0.856500 +vn -0.000000 -0.516200 0.856500 +vn -0.856500 -0.516200 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn 0.000000 -0.000000 -1.000000 +vn 1.000000 -0.000000 0.000000 +vn -0.000000 0.800000 0.600000 +vn 0.856500 0.516200 0.000000 +vn 0.000000 0.516200 -0.856500 +vn -0.000000 0.516200 0.856500 +vn -0.856500 0.516200 -0.000000 +g Cube_Cube_Material +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 25/2/2 5/5/2 6/6/2 26/1/2 +f 26/1/3 6/6/3 7/7/3 27/4/3 +f 27/4/4 7/7/4 8/8/4 28/3/4 +f 25/9/5 1/4/5 4/1/5 28/10/5 +f 8/8/6 7/7/6 11/11/6 12/12/6 +f 7/7/6 6/6/6 10/13/6 11/11/6 +f 5/5/6 8/8/6 12/12/6 9/14/6 +f 6/6/6 5/5/6 9/14/6 10/13/6 +f 53/15/7 42/16/7 15/17/7 16/18/7 +f 42/15/8 43/16/8 14/17/8 15/18/8 +f 56/15/9 53/16/9 16/17/9 13/18/9 +f 43/15/10 56/16/10 13/17/10 14/18/10 +f 14/4/1 18/4/1 19/4/1 15/4/1 +f 17/19/11 21/20/11 22/21/11 18/22/11 +f 18/19/12 22/20/12 23/21/12 19/22/12 +f 19/19/13 23/20/13 24/21/13 20/22/13 +f 21/21/5 17/22/5 20/19/5 24/20/5 +f 21/5/6 24/8/6 23/7/6 22/6/6 +f 15/4/1 19/4/1 20/4/1 16/4/1 +f 16/4/1 20/4/1 17/4/1 13/4/1 +f 13/4/1 17/4/1 18/4/1 14/4/1 +f 1/1/11 25/10/11 26/9/11 2/4/11 +f 2/1/12 26/10/12 27/9/12 3/4/12 +f 3/1/13 27/10/13 28/9/13 4/4/13 +f 5/5/14 25/2/14 28/3/14 8/8/14 +f 49/23/7 46/24/7 30/25/7 29/26/7 +f 46/27/8 47/28/8 31/25/8 30/26/8 +f 52/23/9 49/24/9 29/25/9 32/26/9 +f 47/23/10 52/24/10 32/25/10 31/26/10 +f 45/29/7 50/30/7 34/31/7 37/32/7 +f 50/33/8 51/34/8 35/31/8 34/32/8 +f 48/33/9 45/34/9 37/31/9 40/32/9 +f 51/29/10 48/30/10 40/31/10 35/32/10 +f 41/35/7 54/36/7 38/37/7 33/38/7 +f 54/35/8 55/36/8 39/37/8 38/38/8 +f 44/35/9 41/36/9 33/37/9 36/38/9 +f 55/35/10 44/36/10 36/37/10 39/38/10 +f 37/32/15 34/31/15 42/16/15 53/15/15 +f 34/32/16 35/31/16 43/16/16 42/15/16 +f 40/32/17 37/31/17 53/16/17 56/15/17 +f 35/32/18 40/31/18 56/16/18 43/15/18 +f 33/38/15 38/37/15 46/24/15 49/23/15 +f 38/38/16 39/37/16 47/28/16 46/27/16 +f 36/38/17 33/37/17 49/24/17 52/23/17 +f 39/38/18 36/37/18 52/24/18 47/23/18 +f 29/26/15 30/25/15 50/30/15 45/29/15 +f 30/26/16 31/25/16 51/34/16 50/33/16 +f 32/26/17 29/25/17 45/34/17 48/33/17 +f 31/26/18 32/25/18 48/30/18 51/29/18 +f 12/39/15 11/40/15 54/36/15 41/35/15 +f 11/39/16 10/40/16 55/36/16 54/35/16 +f 9/39/17 12/40/17 41/36/17 44/35/17 +f 10/39/18 9/40/18 44/36/18 55/35/18 diff --git a/mods/technic_plus/extranodes/models/technic_steel_strut_with_insulator_clip.obj b/mods/technic_plus/extranodes/models/technic_steel_strut_with_insulator_clip.obj new file mode 100644 index 0000000..7226d1e --- /dev/null +++ b/mods/technic_plus/extranodes/models/technic_steel_strut_with_insulator_clip.obj @@ -0,0 +1,246 @@ +# Blender v2.79 (sub 0) OBJ File: 'technic steel strut with insulator clip.blend' +# www.blender.org +o Cube_Cube_Material.001 +v -0.375000 0.500532 -0.250000 +v -0.249997 0.562500 -0.249997 +v 0.249997 0.562500 -0.249997 +v 0.375000 0.500532 -0.250000 +v 0.249997 0.562500 0.249997 +v 0.375000 0.500532 0.250000 +v -0.249997 0.562500 0.249997 +v -0.375000 0.500532 0.250000 +v 0.187500 0.562500 -0.187500 +v -0.168668 0.718750 0.168668 +v 0.168668 0.718750 0.168668 +v 0.187500 0.750000 0.187500 +v -0.187500 0.750000 0.187500 +v 0.168668 0.718750 -0.168668 +v 0.187500 0.750000 -0.187500 +v -0.168668 0.718750 -0.168668 +v -0.187500 0.750000 -0.187500 +v 0.250000 0.750000 -0.250000 +v 0.250000 0.750000 0.250000 +v -0.250000 0.750000 -0.250000 +v -0.250000 1.250000 -0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.250000 0.250000 +v -0.250000 1.250000 0.250000 +v -0.250000 0.750000 0.250000 +v -0.168668 0.593750 0.168668 +v 0.168668 0.593750 0.168668 +v 0.187500 0.625000 0.187500 +v -0.187500 0.625000 0.187500 +v 0.168668 0.593750 -0.168668 +v 0.187500 0.625000 -0.187500 +v -0.168668 0.593750 -0.168668 +v -0.187500 0.625000 -0.187500 +v -0.168668 0.656250 0.168668 +v 0.168668 0.656250 0.168668 +v 0.187500 0.687500 0.187500 +v -0.187500 0.687500 0.187500 +v 0.168668 0.656250 -0.168668 +v 0.187500 0.687500 -0.187500 +v -0.168668 0.656250 -0.168668 +v -0.187500 0.687500 -0.187500 +v 0.187500 0.562500 0.187500 +v -0.187500 0.562500 0.187500 +v -0.187500 0.562500 -0.187500 +v -0.499468 -0.499468 -0.499468 +v -0.499468 0.500000 -0.499468 +v 0.499468 -0.499468 -0.499468 +v -0.499468 -0.499468 0.499468 +v -0.499468 0.500000 0.499468 +v 0.499468 -0.499468 0.499468 +v 0.499468 0.500000 -0.499468 +v 0.499468 0.500000 0.499468 +vt 1.000000 0.875000 +vt 0.937500 0.750000 +vt 0.937500 0.250000 +vt 1.000000 0.125000 +vt 0.250000 0.875000 +vt 0.250000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.875000 +vt 0.000000 0.125000 +vt 0.062500 0.250000 +vt 0.062500 0.750000 +vt 0.000000 0.875000 +vt 0.750000 0.250000 +vt 0.687500 0.687500 +vt 0.687500 0.312500 +vt 0.312500 0.687500 +vt 0.250000 0.250000 +vt 0.312500 0.312500 +vt 0.331332 1.218750 +vt 0.668668 1.218750 +vt 0.687500 1.250000 +vt 0.312500 1.250000 +vt 0.531250 0.666667 +vt 0.531250 0.333333 +vt 0.500000 0.312500 +vt 0.500000 0.687500 +vt 0.531250 0.333333 +vt 0.531250 0.666667 +vt 0.500000 0.687500 +vt 0.500000 0.312500 +vt 0.331332 1.218750 +vt 0.668668 1.218750 +vt 0.687500 1.250000 +vt 0.312500 1.250000 +vt 0.687500 0.312500 +vt 0.750000 0.250000 +vt 0.750000 0.750000 +vt 0.687500 0.687500 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.250000 +vt 0.500000 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.750000 +vt 0.500000 0.750000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.250000 +vt 0.000000 0.250000 +vt 0.500000 0.750000 +vt 0.250000 0.250000 +vt 0.750000 0.250000 +vt 0.750000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 0.750000 +vt 0.312500 0.687500 +vt 0.250000 0.250000 +vt 0.312500 0.312500 +vt 0.250000 0.125000 +vt 0.750000 0.125000 +vt 0.331332 1.093750 +vt 0.668668 1.093750 +vt 0.687500 1.125000 +vt 0.312500 1.125000 +vt 0.656250 0.666667 +vt 0.656250 0.333333 +vt 0.625000 0.312500 +vt 0.625000 0.687500 +vt 0.656250 0.333333 +vt 0.656250 0.666667 +vt 0.625000 0.687500 +vt 0.625000 0.312500 +vt 0.331332 1.093750 +vt 0.668668 1.093750 +vt 0.687500 1.125000 +vt 0.312500 1.125000 +vt 0.331332 1.156250 +vt 0.668668 1.156250 +vt 0.687500 1.187500 +vt 0.312500 1.187500 +vt 0.593750 0.666667 +vt 0.593750 0.333333 +vt 0.562500 0.312500 +vt 0.562500 0.687500 +vt 0.593750 0.333333 +vt 0.593750 0.666667 +vt 0.562500 0.687500 +vt 0.562500 0.312500 +vt 0.331332 1.156250 +vt 0.668668 1.156250 +vt 0.687500 1.187500 +vt 0.312500 1.187500 +vt 0.312500 1.062500 +vt 0.687500 1.062500 +vt 0.687500 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.687500 +vt 0.312500 1.062500 +vt 0.687500 1.062500 +vt 0.000000 0.750000 +vt 0.000000 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt -0.000000 0.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.4442 0.8960 -0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 -0.5161 0.8565 +vn 0.8565 -0.5161 0.0000 +vn -0.8565 -0.5161 0.0000 +vn 0.0000 -0.5161 -0.8565 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.4442 0.8960 -0.0000 +vn -0.0000 0.5161 0.8565 +vn 0.8565 0.5161 -0.0000 +vn -0.8565 0.5161 -0.0000 +vn 0.0000 0.5161 -0.8565 +g Cube_Cube_Material.001_Cube_Cube_Material.001_clip +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/5/2 3/6/2 5/7/2 6/8/2 +f 6/9/3 5/10/3 7/11/3 8/12/3 +f 7/13/4 5/7/4 42/14/4 43/15/4 +f 5/7/4 3/6/4 9/16/4 42/14/4 +f 2/17/4 7/13/4 43/15/4 44/18/4 +f 3/6/4 2/17/4 44/18/4 9/16/4 +f 10/19/5 11/20/5 12/21/5 13/22/5 +f 11/23/6 14/24/6 15/25/6 12/26/6 +f 16/27/7 10/28/7 13/29/7 17/30/7 +f 14/31/8 16/32/8 17/33/8 15/34/8 +f 15/35/9 18/36/9 19/37/9 12/38/9 +f 20/39/1 21/40/1 22/41/1 18/42/1 +f 18/43/10 22/44/10 23/45/10 19/46/10 +f 19/47/3 23/48/3 24/49/3 25/50/3 +f 21/51/11 20/39/11 25/52/11 24/49/11 +f 21/53/4 24/54/4 23/55/4 22/56/4 +f 12/38/9 19/37/9 25/57/9 13/58/9 +f 13/58/9 25/57/9 20/59/9 17/60/9 +f 17/60/9 20/59/9 18/36/9 15/35/9 +f 2/17/12 1/61/12 8/62/12 7/13/12 +f 26/63/5 27/64/5 28/65/5 29/66/5 +f 27/67/6 30/68/6 31/69/6 28/70/6 +f 32/71/7 26/72/7 29/73/7 33/74/7 +f 30/75/8 32/76/8 33/77/8 31/78/8 +f 34/79/5 35/80/5 36/81/5 37/82/5 +f 35/83/6 38/84/6 39/85/6 36/86/6 +f 40/87/7 34/88/7 37/89/7 41/90/7 +f 38/91/8 40/92/8 41/93/8 39/94/8 +f 37/82/13 36/81/13 11/20/13 10/19/13 +f 36/86/14 39/85/14 14/24/14 11/23/14 +f 41/90/15 37/89/15 10/28/15 16/27/15 +f 39/94/16 41/93/16 16/32/16 14/31/16 +f 43/95/13 42/96/13 27/64/13 26/63/13 +f 42/14/14 9/97/14 30/68/14 27/67/14 +f 44/98/15 43/99/15 26/72/15 32/71/15 +f 9/100/16 44/101/16 32/76/16 30/75/16 +f 29/66/13 28/65/13 35/80/13 34/79/13 +f 28/70/14 31/69/14 38/84/14 35/83/14 +f 33/74/15 29/73/15 34/88/15 40/87/15 +f 31/78/16 33/77/16 40/92/16 38/91/16 +f 8/102/9 1/103/9 4/104/9 6/105/9 +g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_with_band +s off +f 47/106/10 51/107/10 52/108/10 50/109/10 +f 48/110/11 49/111/11 46/112/11 45/113/11 +f 47/114/9 50/115/9 48/116/9 45/117/9 +f 51/118/4 46/112/4 49/111/4 52/119/4 +g Cube_Cube_Material.001_Cube_Cube_Material.001_sides_without_band +f 45/113/1 46/120/1 51/107/1 47/121/1 +f 50/109/3 52/119/3 49/111/3 48/122/3 diff --git a/mods/technic_plus/extranodes/textures/technic_insulator_clip.png b/mods/technic_plus/extranodes/textures/technic_insulator_clip.png new file mode 100644 index 0000000..a897408 Binary files /dev/null and b/mods/technic_plus/extranodes/textures/technic_insulator_clip.png differ diff --git a/mods/technic_plus/extranodes/textures/technic_steel_strut_overlay.png b/mods/technic_plus/extranodes/textures/technic_steel_strut_overlay.png new file mode 100644 index 0000000..b1dcb62 Binary files /dev/null and b/mods/technic_plus/extranodes/textures/technic_steel_strut_overlay.png differ diff --git a/mods/technic_plus/modpack.conf b/mods/technic_plus/modpack.conf new file mode 100644 index 0000000..6655ea8 --- /dev/null +++ b/mods/technic_plus/modpack.conf @@ -0,0 +1,3 @@ +name = technic +description = The technic modpack extends the Minetest game with many new elements, mainly constructable machines and tools. It is a large modpack, and tends to dominate gameplay when it is used. +min_minetest_version = 5.0 diff --git a/mods/technic_plus/technic/README.md b/mods/technic_plus/technic/README.md new file mode 100644 index 0000000..835b442 --- /dev/null +++ b/mods/technic_plus/technic/README.md @@ -0,0 +1,38 @@ +Technic +======= + +License +------- + +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +Technic chests code is licensed under the GNU LGPLv2+. + +Texture licenses: + +BlockMen modified by Zefram (CC BY-SA 3.0): + * technic_chernobylite_block.png + * technic_corium_flowing_animated.png + * technic_corium_source_animated.png + +celeron55 (Perttu Ahola) modified by Zefram (CC BY-SA 3.0): + * technic_bucket_corium.png + +sdzen (Elise Staudter) (CC BY-SA 3.0): + * most of the older 16x16 textures + +leftshift (CC BY-SA 3.0): + * technic_river_water_can.png + +RealBadAngel: (WTFPL) + * Everything else. + +CC BY-SA 3.0: + +Sound licenses: + +veikk0 (Veikko Mäkelä) (CC BY-SA 4.0): + * technic_hv_nuclear_reactor_siren_danger_loop.ogg + * Derived from "Nuclear alarm.wav" by Freesound.org user rene___ from . Originally licensed under CC0 1.0 + +CC BY-SA 4.0: diff --git a/mods/technic_plus/technic/config.lua b/mods/technic_plus/technic/config.lua new file mode 100644 index 0000000..645412e --- /dev/null +++ b/mods/technic_plus/technic/config.lua @@ -0,0 +1,32 @@ +technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf") + +local conf_table = technic.config:to_table() + +local defaults = { + enable_mining_drill = "true", + enable_mining_laser = "false", + enable_flashlight = "false", + enable_wind_mill = "false", + enable_frames = "false", + enable_corium_griefing = "true", + enable_radiation_protection = "true", + enable_radiation_throttling = "false", + enable_entity_radiation_damage = "true", + enable_longterm_radiation_damage = "true", + enable_nuclear_reactor_digiline_selfdestruct = "false", + switch_max_range = "256", + switch_off_delay_seconds = "1800", + network_overload_reset_time = "20", + admin_priv = "basic_privs", + quarry_dig_above_nodes = "3", + quarry_max_depth = "100", + quarry_time_limit = "5000", + max_lag_reduction_multiplier = "0.99", + --constant_digit_count = nil, +} + +for k, v in pairs(defaults) do + if conf_table[k] == nil then + technic.config:set(k, v) + end +end diff --git a/mods/technic_plus/technic/crafts.lua b/mods/technic_plus/technic/crafts.lua new file mode 100644 index 0000000..d43ab34 --- /dev/null +++ b/mods/technic_plus/technic/crafts.lua @@ -0,0 +1,188 @@ +-- check if we have the necessary dependencies to allow actually using these materials in the crafts +local mesecons_materials = minetest.get_modpath("mesecons_materials") + +-- Remove some recipes +-- Bronze +minetest.clear_craft({ + type = "shapeless", + output = "default:bronze_ingot" +}) +-- Restore recipe for bronze block to ingots +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:bronzeblock"} + } +}) + +-- Accelerator tube +if pipeworks.enable_accelerator_tube then + minetest.clear_craft({ + output = "pipeworks:accelerator_tube_1", + }) + + minetest.register_craft({ + output = 'pipeworks:accelerator_tube_1', + recipe = { + {'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'}, + } + }) +end + +-- Teleport tube +if pipeworks.enable_teleport_tube then + minetest.clear_craft({ + output = "pipeworks:teleport_tube_1", + }) + + minetest.register_craft({ + output = 'pipeworks:teleport_tube_1', + recipe = { + {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, + {'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'}, + {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'}, + } + }) +end + +-- basic materials' brass ingot + +minetest.clear_craft({ + output = "basic_materials:brass_ingot", +}) + +minetest.register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 9", + recipe = { "basic_materials:brass_block" }, +}) + +-- tubes crafting recipes + +minetest.register_craft({ + output = 'technic:diamond_drill_head', + recipe = { + {'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'}, + {'default:diamond', '', 'default:diamond'}, + {'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:green_energy_crystal', + recipe = { + {'default:gold_ingot', 'technic:battery', 'dye:green'}, + {'technic:battery', 'technic:red_energy_crystal', 'technic:battery'}, + {'dye:green', 'technic:battery', 'default:gold_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:blue_energy_crystal', + recipe = { + {'moreores:mithril_ingot', 'technic:battery', 'dye:blue'}, + {'technic:battery', 'technic:green_energy_crystal', 'technic:battery'}, + {'dye:blue', 'technic:battery', 'moreores:mithril_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:red_energy_crystal', + recipe = { + {'moreores:silver_ingot', 'technic:battery', 'dye:red'}, + {'technic:battery', 'basic_materials:energy_crystal_simple', 'technic:battery'}, + {'dye:red', 'technic:battery', 'moreores:silver_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:copper_coil 1', + recipe = { + {'basic_materials:copper_wire', 'technic:wrought_iron_ingot', 'basic_materials:copper_wire'}, + {'technic:wrought_iron_ingot', '', 'technic:wrought_iron_ingot'}, + {'basic_materials:copper_wire', 'technic:wrought_iron_ingot', 'basic_materials:copper_wire'}, + }, + replacements = { + {"basic_materials:copper_wire", "basic_materials:empty_spool"}, + {"basic_materials:copper_wire", "basic_materials:empty_spool"}, + {"basic_materials:copper_wire", "basic_materials:empty_spool"}, + {"basic_materials:copper_wire", "basic_materials:empty_spool"} + }, +}) + +local isolation = mesecons_materials and "mesecons_materials:fiber" or "technic:rubber" + +minetest.register_craft({ + output = 'technic:lv_transformer', + recipe = { + {isolation, 'technic:wrought_iron_ingot', isolation}, + {'technic:copper_coil', 'technic:wrought_iron_ingot', 'technic:copper_coil'}, + {'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:mv_transformer', + recipe = { + {isolation, 'technic:carbon_steel_ingot', isolation}, + {'technic:copper_coil', 'technic:carbon_steel_ingot', 'technic:copper_coil'}, + {'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:hv_transformer', + recipe = { + {isolation, 'technic:stainless_steel_ingot', isolation}, + {'technic:copper_coil', 'technic:stainless_steel_ingot', 'technic:copper_coil'}, + {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:control_logic_unit', + recipe = { + {'', 'basic_materials:gold_wire', ''}, + {'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'}, + {'', 'technic:chromium_ingot', ''}, + }, + replacements = { {"basic_materials:gold_wire", "basic_materials:empty_spool"}, }, +}) + +minetest.register_craft({ + output = 'technic:mixed_metal_ingot 9', + recipe = { + {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'}, + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:tin_ingot', 'default:tin_ingot', 'default:tin_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:carbon_cloth', + recipe = { + {'technic:graphite', 'technic:graphite', 'technic:graphite'} + } +}) + +minetest.register_craft({ + output = "technic:machine_casing", + recipe = { + { "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" }, + { "technic:cast_iron_ingot", "basic_materials:brass_ingot", "technic:cast_iron_ingot" }, + { "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" }, + }, +}) + + +minetest.register_craft({ + output = "default:dirt 2", + type = "shapeless", + replacements = {{"bucket:bucket_water","bucket:bucket_empty"}}, + recipe = { + "technic:stone_dust", + "group:leaves", + "bucket:bucket_water", + "group:sand", + }, +}) diff --git a/mods/technic_plus/technic/depends.txt b/mods/technic_plus/technic/depends.txt new file mode 100644 index 0000000..c605980 --- /dev/null +++ b/mods/technic_plus/technic/depends.txt @@ -0,0 +1,15 @@ +default +pipeworks +technic_worldgen +basic_materials +bucket? +screwdriver? +mesecons? +mesecons_mvps? +digilines? +digiline_remote? +digistuff? +intllib? +unified_inventory? +vector_extras? +dye? diff --git a/mods/technic_plus/technic/doc/anchor.md b/mods/technic_plus/technic/doc/anchor.md new file mode 100644 index 0000000..5474b99 --- /dev/null +++ b/mods/technic_plus/technic/doc/anchor.md @@ -0,0 +1,57 @@ + + +administrative world anchor +--------------------------- + +A world anchor is an object in the Minetest world that causes the server +to keep surrounding parts of the world running even when no players +are nearby. It is mainly used to allow machines to run unattended: +normally machines are suspended when not near a player. The technic +mod supplies a form of world anchor, as a placable block, but it is not +straightforwardly available to players. There is no recipe for it, so it +is only available if explicitly spawned into existence by someone with +administrative privileges. In a single-player world, the single player +normally has administrative privileges, and can obtain a world anchor +by entering the chat command "/give singleplayer technic:admin\_anchor". + +The world anchor tries to force a cubical area, centered upon the anchor, +to stay loaded. The distance from the anchor to the most distant map +nodes that it will keep loaded is referred to as the "radius", and can be +set in the world anchor's interaction form. The radius can be set as low +as 0, meaning that the anchor only tries to keep itself loaded, or as high +as 255, meaning that it will operate on a 511×511×511 cube. +Larger radii are forbidden, to avoid typos causing the server excessive +work; to keep a larger area loaded, use multiple anchors. Also use +multiple anchors if the area to be kept loaded is not well approximated +by a cube. + +The world is always kept loaded in units of 16×16×16 cubes, +confusingly known as "map blocks". The anchor's configured radius takes +no account of map block boundaries, but the anchor's effect is actually to +keep loaded each map block that contains any part of the configured cube. +The anchor's interaction form includes a status note showing how many map +blocks this is, and how many of those it is successfully keeping loaded. +When the anchor is disabled, as it is upon placement, it will always +show that it is keeping no map blocks loaded; this does not indicate +any kind of failure. + +The world anchor can optionally be locked. When it is locked, only +the anchor's owner, the player who placed it, can reconfigure it or +remove it. Only the owner can lock it. Locking an anchor is useful +if the use of anchors is being tightly controlled by administrators: +an administrator can set up a locked anchor and be sure that it will +not be set by ordinary players to an unapproved configuration. + +The server limits the ability of world anchors to keep parts of the world +loaded, to avoid overloading the server. The total number of map blocks +that can be kept loaded in this way is set by the server configuration +item "max\_forceloaded\_blocks" (in minetest.conf), which defaults to +only 16. For comparison, each player normally keeps 125 map blocks loaded +(a radius of 32). If an enabled world anchor shows that it is failing to +keep all the map blocks loaded that it would like to, this can be fixed +by increasing max\_forceloaded\_blocks by the amount of the shortfall. + +The tight limit on force-loading is the reason why the world anchor is +not directly available to players. With the limit so low both by default +and in common practice, the only feasible way to determine where world +anchors should be used is for administrators to decide it directly. diff --git a/mods/technic_plus/technic/doc/api.md b/mods/technic_plus/technic/doc/api.md new file mode 100644 index 0000000..973e453 --- /dev/null +++ b/mods/technic_plus/technic/doc/api.md @@ -0,0 +1,144 @@ +This file is fairly incomplete. Help is welcome. + +Tiers +----- +The tier is a string, currently `"LV"`, `"MV"` and `"HV"` are supported. + +Network +------- +The network is the cable with the connected machine nodes. Currently the +switching station handles the network activity. + +Helper functions +---------------- +* `technic.EU_string(num)` + * Converts num to a human-readable string (see pretty_num) + and adds the `EU` unit + * Use this function when showing players energy values +* `technic.pretty_num(num)` + * Converts the number `num` to a human-readable string with SI prefixes +* `technic.swap_node(pos, nodename)` + * Same as `mintest.swap_node` but it only changes the nodename. + * It uses `minetest.get_node` before swapping to ensure the new nodename + is not the same as the current one. +* `technic.get_or_load_node(pos)` + * If the mapblock is loaded, it returns the node at pos, + else it loads the chunk and returns `nil`. +* `technic.set_RE_wear(itemstack, item_load, max_charge)` + * If the `wear_represents` field in the item's nodedef is + `"technic_RE_charge"`, this function does nothing. +* `technic.refill_RE_charge(itemstack)` + * This function fully recharges an RE chargeable item. + * If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this + function does nothing, else that value is the maximum charge. + * The itemstack metadata is changed to contain the charge. +* `technic.is_tier_cable(nodename, tier)` + * Tells whether the node `nodename` is the cable of the tier `tier`. +* `technic.get_cable_tier(nodename)` + * Returns the tier of the cable `nodename` or `nil`. +* `technic.trace_node_ray(pos, dir, range)` + * Returns an iteration function (usable in the for loop) to iterate over the + node positions along the specified ray. + * The returned positions will not include the starting position `pos`. +* `technic.trace_node_ray_fat(pos, dir, range)` + * Like `technic.trace_node_ray` but includes extra positions near the ray. + * The node ray functions are used for mining lasers. +* `technic.config:get(name)` + * Some configuration function +* `technic.tube_inject_item(pos, start_pos, velocity, item)` + * Same as `pipeworks.tube_inject_item` +* `technic.get_charge(itemstack)` (alias `technic.get_RE_charge`) + * Returns current charge level of tool. +* `technic.set_charge(itemstack, charge)` (alias `technic.set_RE_charge`) + * Sets tool charge level. +* `technic.use_charge(itemstack, charge)` (alias `technic.use_RE_charge`) + * Attempt to use charge and return `true`/`false` indicating success. + * Always succeeds without checking charge level if creative is enabled. + +Registration functions +---------------------- +* `technic.register_power_tool(itemname, max_charge)` + * Same as `technic.power_tools[itemname] = max_charge` + * This function makes the craftitem `itemname` chargeable. +* `technic.register_machine(tier, nodename, machine_type)` + * Same as `technic.machines[tier][nodename] = machine_type` + * Currently this is requisite to make technic recognize your node. + * See also `Machine types` +* `technic.register_tier(tier)` + * Same as `technic.machines[tier] = {}` + * See also `tiers` + +### Specific machines +* `technic.register_solar_array(data)` + * data is a table +* `technic.can_insert_unique_stack(pos, node, stack, direction)` +* `technic.insert_object_unique_stack(pos, node, stack, direction)` + * Functions for the parameters `can_insert` and `insert_object` to avoid + filling multiple inventory slots with same type of item. + +Used itemdef fields +------------------- +* groups: + * `technic_ = 1` ltier is a tier in small letters; this group makes + the node connect to the cable(s) of the right tier. + * `technic_machine = 1` Currently used for +* `connect_sides` + * In addition to the default use (see lua_api.txt), this tells where the + machine can be connected. +# +# +* `technic_run(pos, node)` + * This function is currently used to update the node. + Modders have to manually change the information about supply etc. in the + node metadata. + +Machine types +------------- +There are currently following types: +* `technic.receiver = "RE"` e.g. grinder +* `technic.producer = "PR"` e.g. solar panel +* `technic.producer_receiver = "PR_RE"` supply converter +* `technic.battery = "BA"` e.g. LV batbox + +Switching Station +----------------- +The switching station is the center of all power distribution on an electric +network. + +The station collects power from sources (PR), distributes it to sinks (RE), +and uses the excess/shortfall to charge and discharge batteries (BA). + +For now, all supply and demand values are expressed in kW. + +It works like this: + All PR,BA,RE nodes are indexed and tagged with the switching station. +The tagging is a workaround to allow more stations to be built without allowing +a cheat with duplicating power. + All the RE nodes are queried for their current EU demand. Those which are off +would require no or a small standby EU demand, while those which are on would +require more. +If the total demand is less than the available power they are all updated with +the demand number. +If any surplus exists from the PR nodes the batteries will be charged evenly +with this. +If the total demand requires draw on the batteries they will be discharged +evenly. + +If the total demand is more than the available power all RE nodes will be shut +down. We have a brown-out situation. + +Hence for now all the power distribution logic resides in this single node. + +### Node meta usage +Nodes connected to the network will have one or more of these parameters as meta +data: + * `_EU_supply` : Exists for PR and BA node types. + This is the EU value supplied by the node. Output + * `_EU_demand` : Exists for RE and BA node types. + This is the EU value the node requires to run. Output + * `_EU_input` : Exists for RE and BA node types. + This is the actual EU value the network can give the node. Input + +The reason the LV|MV|HV type is prepended to meta data is because some machine +could require several supplies to work. +This way the supplies are separated per network. diff --git a/mods/technic_plus/technic/doc/chests.md b/mods/technic_plus/technic/doc/chests.md new file mode 100644 index 0000000..9513486 --- /dev/null +++ b/mods/technic_plus/technic/doc/chests.md @@ -0,0 +1,52 @@ + +chests +------ + +The technic mod replaces the basic Minetest game's single type of +chest with a range of chests that have different sizes and features. +The chest types are identified by the materials from which they are made; +the better chests are made from more exotic materials. The chest types +form a linear sequence, each being (with one exception noted below) +strictly more powerful than the preceding one. The sequence begins with +the wooden chest from the basic game, and each later chest type is built +by upgrading a chest of the preceding type. The chest types are: + +1. wooden chest: 8×4 (32) slots +2. iron chest: 9×5 (45) slots +3. copper chest: 12×5 (60) slots +4. silver chest: 12×6 (72) slots +5. gold chest: 15×6 (90) slots +6. mithril chest: 15×6 (90) slots + +The iron and later chests have the ability to sort their contents, +when commanded by a button in their interaction forms. Item types are +sorted in the same order used in the unified\_inventory craft guide. +The copper and later chests also have an auto-sorting facility that can +be enabled from the interaction form. An auto-sorting chest automatically +sorts its contents whenever a player closes the chest. The contents will +then usually be in a sorted state when the chest is opened, but may not +be if pneumatic tubes have operated on the chest while it was closed, +or if two players have the chest open simultaneously. + +The silver and gold chests, but not the mithril chest, have a built-in +sign-like capability. They can be given a textual label, which will +be visible when hovering over the chest. The gold chest, but again not +the mithril chest, can be further labelled with a colored patch that is +visible from a moderate distance. + +The mithril chest is currently an exception to the upgrading system. +It has only as many inventory slots as the preceding (gold) type, and has +fewer of the features. It has no feature that other chests don't have: +it is strictly weaker than the gold chest. It is planned that in the +future it will acquire some unique features, but for now the only reason +to use it is aesthetic. + +The size of the largest chests is dictated by the maximum size +of interaction form that the game engine can successfully display. +If in the future the engine becomes capable of handling larger forms, +by scaling them to fit the screen, the sequence of chest sizes will +likely be revised. + +As with the chest of the basic Minetest game, each chest type comes +in both locked and unlocked flavors. All of the chests work with the +pneumatic tubes of the pipeworks mod. diff --git a/mods/technic_plus/technic/doc/digilines.md b/mods/technic_plus/technic/doc/digilines.md new file mode 100644 index 0000000..a563467 --- /dev/null +++ b/mods/technic_plus/technic/doc/digilines.md @@ -0,0 +1,132 @@ + +# Technic digilines compatibility + +This document describes the interaction of +technic machines with the `digilines` mod (https://github.com/minetest-mods/digilines) + +## Switching station + +**NOTE**: make sure the channel is set accordingly, "switch" in this case + +There are two ways getting information from the switching station: +1. Give it a mesecon signal (eg. with a lever) and it will send always when the supply or demand changes. + +2. Send to the switching station `"get"` or `"GET"` and it will send back. + +The sent message is always a table containing the supply, demand and lag. + +Example luacontroller code: +```lua +if event.type == "program" then + -- start interrupt cycle + interrupt(1) +end + +if event.type == "interrupt" then + -- request stats + digiline_send("switch", "GET") +end + +if event.type == "digiline" and event.channel == "switch" then + --[[ + event.msg = { + demand = 0, -- demand in EU's + supply = 0, -- supply in EU's + lag = 0 -- generated lag in microseconds + } + --]] +end +``` + +## Power monitor +The commands: +- `"get"`: The power monitor sends back information about the attached network + - `"supply"`, `"demand"` and `"lag"`: Same as switching station + - `"battery_count"`, `"battery_charge"` and `"battery_charge_max"`: Totaled information about the attached batteries. + + +## Supply Converter +You can send the following to it: +- `"get"`: It will send back a table containing the fields `"enabled"`, `"power"` and `"mesecon_mode"` which are all integers. +- `"off"`: Deactivate the supply converter. +- `"on"`: Activate the supply converter. +- `"toggle"`: Activate or deactivate the supply converter depending on its current state. +- `"power "..power`: Set the amount of the power, it shall convert. +- `"mesecon_mode "..`: Set the mesecon mode. + +## Battery Boxes +Send to it `"get"` or `"GET"` and it will send a table back containing: +- `demand`: A number. +- `supply`: A number. +- `input`: A number. +- `charge`: A number. +- `max_charge`: A number. +- `src`: Itemstack made to table. +- `dst`: Itemstack made to table. +- `upgrade1`: Itemstack made to table. +- `upgrade2`: Itemstack made to table. + + +## Forcefield Emitter +You should send a table to it containing the `command` and for some commands the `value` field. +Some strings will automatically be made to tables: +- `"get"` :arrow_right: `{command = "get"}` +- `"off"` :arrow_right: `{command = "off"}` +- `"on"` :arrow_right: `{command = "on"}` +- `"toggle"` :arrow_right: `{command = "toggle"}` +- `"range "..range` :arrow_right: `{command = "range", value = range}` +- `"shape "..shape` :arrow_right: `{command = "shape", value = shape}` + +The commands: +- `"get"`: The forcefield emitter sends back a table containing: + - `"enabled"`: `0` is off, `1` is on. + - `"range"` + - `"shape"`: `0` is spheric, `1` is cubic. +- `"off"`: Deactivate the forcefield emitter. +- `"on"`: Activate the forcefield emitter. +- `"toggle"`: Activate or deactivate the forcefield emitter depending on its current state. +- `"range"`: Set the range to `value`. +- `"shape"`: `value` can be a number (`0` or `1`) or a string (`"sphere"` or `"cube"`). + + +## Nuclear Reactor +Since the nuclear reactor core can't be accessed by digiline wire because the water layer which mustn't have a hole, you need the HV Digicables to interact with it. + +You should send a table to it containing at least the `command` field and for some commands other fields. + +The commands: +- `"get"`: The nuclear reactor sends back a table containing: + - `"burn_time"`: The time in seconds how long the reactor already runs. One week after start, when it reaches 7 * 24 * 60 * 60 (=604800), the fuel is completely used. + - `"enabled"`: A bool. + - `"siren"`: A bool. + - `"structure_accumulated_badness"` + - `"rods"`: A table with 6 numbers in it, one for each fuel slot. + - A positive value is the count of fuel rods in the slot. + - `0` means the slot is empty. + - A negative value means some other items are in the slot. The absolute value is the count of these items. +- `"self_destruct"`: A setting has to be enabled to use this. The reactor will melt down after `timer` seconds or instantly. +- `"start"`: Tries to start the reactor, `"Start successful"` is sent back on success, `"Error"` if something is wrong. + +If the automatic start is enabled, it will always send `"fuel used"` when it uses fuel. + + +## Quarry +You should send a table to it containing the `command` and for some commands the `value` field. +Some strings will automatically be converted to tables: +- `"get"` :arrow_right: `{command = "get"}` +- `"on"` :arrow_right: `{command = "on"}` +- `"off"` :arrow_right: `{command = "off"}` +- `"restart` :arrow_right: `{command = "restart"}` +- `"radius "..value` :arrow_right: `{command = "radius", value = value}` + +The commands: +- `"get"`: The forcefield emitter sends back a table containing: + - `"enabled"`: `0` is off, `1` is on. + - `"radius"` + - `"finished"` + - `"dug_nodes"` + - `"dig_level"`: A negative value means above the quarry, a positive value means below. +- `"on"`: Activate the quarry. +- `"off"`: Deactivate the quarry. +- `"restart"`: Restart the quarry. +- `"radius"`: Set the radius to `value` and restart the quarry if the radius changed. diff --git a/mods/technic_plus/technic/doc/generators.md b/mods/technic_plus/technic/doc/generators.md new file mode 100644 index 0000000..6964101 --- /dev/null +++ b/mods/technic_plus/technic/doc/generators.md @@ -0,0 +1,221 @@ + +power generators +---------------- + +### fuel-fired generators ### + +The fuel-fired generators are electrical power generators that generate +power by the combustion of fuel. Versions of them are available for +all three voltages (LV, MV, and HV). These are all capable of burning +any type of combustible fuel, such as coal. They are relatively easy +to build, and so tend to be the first kind of generator used to power +electrical machines. In this role they form an intermediate step between +the directly fuel-fired machines and a more mature electrical network +powered by means other than fuel combustion. They are also, by virtue of +simplicity and controllability, a useful fallback or peak load generator +for electrical networks that normally use more sophisticated generators. + +The MV and HV fuel-fired generators can accept fuel via pneumatic tube, +from any direction. + +Keeping a fuel-fired generator fully fuelled is usually wasteful, because +it will burn fuel as long as it has any, even if there is no demand for +the electrical power that it generates. This is unlike the directly +fuel-fired machines, which only burn fuel when they have work to do. +To satisfy intermittent demand without waste, a fuel-fired generator must +only be given fuel when there is either demand for the energy or at least +sufficient battery capacity on the network to soak up the excess energy. + +The higher-tier fuel-fired generators get much more energy out of a +fuel item than the lower-tier ones. The difference is much more than +is needed to overcome the inefficiency of supply converters, so it is +worth operating fuel-fired generators at a higher tier than the machines +being powered. + +### solar generators ### + +The solar generators are electrical power generators that generate power +from sunlight. Versions of them are available for all three voltages +(LV, MV, and HV). There are four types in total, two LV and one each +of MV and HV, forming a sequence of four tiers. The higher-tier ones +are each built mainly from three solar generators of the next tier down, +and their outputs scale in rough accordance, tripling at each tier. + +To operate, an arrayed solar generator must be at elevation +1 or above +and have a transparent block (typically air) immediately above it. +It will generate power only when the block above is well lit during +daylight hours. It will generate more power at higher elevation, +reaching maximum output at elevation +36 or higher when sunlit. The small +solar generator has similar rules with slightly different thresholds. +These rules are an attempt to ensure that the generator will only operate +from sunlight, but it is actually possible to fool them to some extent +with light sources such as meselamps. + +### hydro generator ### + +The hydro generator is an LV power generator that generates a respectable +amount of power from the natural motion of water. To operate, the +generator must be horizontally adjacent to flowing water. The power +produced is dependent on how much flow there is across any or all four +sides, the most flow of course coming from water that's flowing straight +down. + +### geothermal generator ### + +The geothermal generator is an LV power generator that generates a small +amount of power from the temperature difference between lava and water. +To operate, the generator must be horizontally adjacent to both lava +and water. It doesn't matter whether the liquids consist of source +blocks or flowing blocks. + +Beware that if lava and water blocks are adjacent to each other then the +lava will be solidified into stone or obsidian. If the lava adjacent to +the generator is thus destroyed, the generator will stop producing power. +Currently, in the default Minetest game, lava is destroyed even if +it is only diagonally adjacent to water. Under these circumstances, +the only way to operate the geothermal generator is with it adjacent +to one lava block and one water block, which are on opposite sides of +the generator. If diagonal adjacency doesn't destroy lava, such as with +the gloopblocks mod, then it is possible to have more than one lava or +water block adjacent to the geothermal generator. This increases the +generator's output, with the maximum output achieved with two adjacent +blocks of each liquid. + +### wind generator ### + +The wind generator is an MV power generator that generates a moderate +amount of energy from wind. To operate, the generator must be placed +atop a column of at least 20 wind mill frame blocks, and must be at +an elevation of +30 or higher. It generates more at higher elevation, +reaching maximum output at elevation +50 or higher. Its surroundings +don't otherwise matter; it doesn't actually need to be in open air. + +### nuclear generator ### + +The nuclear generator (nuclear reactor) is an HV power generator that +generates a large amount of energy from the controlled fission of +uranium-235. It must be fuelled, with uranium fuel rods, but consumes +the fuel quite slowly in relation to the rate at which it is likely to +be mined. The operation of a nuclear reactor poses radiological hazards +to which some thought must be given. Economically, the use of nuclear +power requires a high capital investment, and a secure infrastructure, +but rewards the investment well. + +Nuclear fuel is made from uranium. Natural uranium doesn't have a +sufficiently high proportion of U-235, so it must first be enriched +via centrifuge. Producing one unit of 3.5%-fissile uranium requires +the input of five units of 0.7%-fissile (natural) uranium, and produces +four units of 0.0%-fissile (fully depleted) uranium as a byproduct. +It takes five ingots of 3.5%-fissile uranium to make each fuel rod, and +six rods to fuel a reactor. It thus takes the input of the equivalent +of 150 ingots of natural uranium, which can be obtained from the mining +of 75 blocks of uranium ore, to make a full set of reactor fuel. + +The nuclear reactor is a large multi-block structure. Only one block in +the structure, the reactor core, is of a type that is truly specific to +the reactor; the rest of the structure consists of blocks that have mainly +non-nuclear uses. The reactor core is where all the generator-specific +action happens: it is where the fuel rods are inserted, and where the +power cable must connect to draw off the generated power. + +The reactor structure consists of concentric layers, each a cubical +shell, around the core. Immediately around the core is a layer of water, +representing the reactor coolant; water blocks may be either source blocks +or flowing blocks. Around that is a layer of stainless steel blocks, +representing the reactor pressure vessel, and around that a layer of +blast-resistant concrete blocks, representing a containment structure. +It is customary, though no longer mandatory, to surround this with a +layer of ordinary concrete blocks. The mandatory reactor structure +makes a 7×7×7 cube, and the full customary structure a +9×9×9 cube. + +The layers surrounding the core don't have to be absolutely complete. +Indeed, if they were complete, it would be impossible to cable the core to +a power network. The cable makes it necessary to have at least one block +missing from each surrounding layer. The water layer is only permitted +to have one water block missing of the 26 possible. The steel layer may +have up to two blocks missing of the 98 possible, and the blast-resistant +concrete layer may have up to two blocks missing of the 218 possible. +Thus it is possible to have not only a cable duct, but also a separate +inspection hole through the solid layers. The separate inspection hole +is of limited use: the cable duct can serve double duty. + +Once running, the reactor core is significantly radioactive. The layers +of reactor structure provide quite a lot of shielding, but not enough +to make the reactor safe to be around, in two respects. Firstly, the +shortest possible path from the core to a player outside the reactor +is sufficiently short, and has sufficiently little shielding material, +that it will damage the player. This only affects a player who is +extremely close to the reactor, and close to a face rather than a vertex. +The customary additional layer of ordinary concrete around the reactor +adds sufficient distance and shielding to negate this risk, but it can +also be addressed by just keeping extra distance (a little over two +meters of air). + +The second radiological hazard of a running reactor arises from shine +paths; that is, specific paths from the core that lack sufficient +shielding. The necessary cable duct, if straight, forms a perfect +shine path, because the cable itself has no radiation shielding effect. +Any secondary inspection hole also makes a shine path, along which the +only shielding material is the water of the reactor coolant. The shine +path aspect of the cable duct can be ameliorated by adding a kink in the +cable, but this still yields paths with reduced shielding. Ultimately, +shine paths must be managed either with specific shielding outside the +mandatory structure, or with additional no-go areas. + +The radioactivity of an operating reactor core makes starting up a reactor +hazardous, and can come as a surprise because the non-operating core +isn't radioactive at all. The radioactive damage is survivable, but it is +normally preferable to avoid it by some care around the startup sequence. +To start up, the reactor must have a full set of fuel inserted, have all +the mandatory structure around it, and be cabled to a switching station. +Only the fuel insertion requires direct access to the core, so irradiation +of the player can be avoided by making one of the other two criteria be +the last one satisfied. Completing the cabling to a switching station +is the easiest to do from a safe distance. + +Once running, the reactor will generate 100 kEU/s for a week (168 hours, +604800 seconds), a total of 6.048 GEU from one set of fuel. After the +week is up, it will stop generating and no longer be radioactive. It can +then be refuelled to run for another week. It is not really intended +to be possible to pause a running reactor, but actually disconnecting +it from a switching station will have the effect of pausing the week. +This will probably change in the future. A paused reactor is still +radioactive, just not generating electrical power. + +A running reactor can't be safely dismantled, and not only because +dismantling the reactor implies removing the shielding that makes +it safe to be close to the core. The mandatory parts of the reactor +structure are not just mandatory in order to start the reactor; they're +mandatory in order to keep it intact. If the structure around the core +gets damaged, and remains damaged, the core will eventually melt down. +How long there is before meltdown depends on the extent of the damage; +if only one mandatory block is missing, meltdown will follow in 100 +seconds. While the structure of a running reactor is in a damaged state, +heading towards meltdown, a siren built into the reactor core will sound. +If the structure is rectified, the siren will signal all-clear. If the +siren stops sounding without signalling all-clear, then it was stopped +by meltdown. + +If meltdown is imminent because of damaged reactor structure, digging the +reactor core is not a way to avert it. Digging the core of a running +reactor causes instant meltdown. The only way to dismantle a reactor +without causing meltdown is to start by waiting for it to finish the +week-long burning of its current set of fuel. Once a reactor is no longer +operating, it can be dismantled by ordinary means, with no special risks. + +Meltdown, if it occurs, destroys the reactor and poses a major +environmental hazard. The reactor core melts, becoming a hot, highly +radioactive liquid known as "corium". A single meltdown yields a single +corium source block, where the core used to be. Corium flows, and the +flowing corium is very destructive to whatever it comes into contact with. +Flowing corium also randomly solidifies into a radioactive solid called +"Chernobylite". The random solidification and random destruction of +solid blocks means that the flow of corium is constantly changing. +This combined with the severe radioactivity makes corium much more +challenging to deal with than lava. If a meltdown is left to its own +devices, it gets worse over time, as the corium works its way through +the reactor structure and starts to flow over a variety of paths. +It is best to tackle a meltdown quickly; the priority is to extinguish +the corium source block, normally by dropping gravel into it. Only the +most motivated should attempt to pick up the corium in a bucket. diff --git a/mods/technic_plus/technic/doc/images/LV_Fuel_Fired_Generator_Crafting.png b/mods/technic_plus/technic/doc/images/LV_Fuel_Fired_Generator_Crafting.png new file mode 100644 index 0000000..95e50f1 Binary files /dev/null and b/mods/technic_plus/technic/doc/images/LV_Fuel_Fired_Generator_Crafting.png differ diff --git a/mods/technic_plus/technic/doc/images/LV_cable_Crafting.png b/mods/technic_plus/technic/doc/images/LV_cable_Crafting.png new file mode 100644 index 0000000..1354c0c Binary files /dev/null and b/mods/technic_plus/technic/doc/images/LV_cable_Crafting.png differ diff --git a/mods/technic_plus/technic/doc/images/Switching_station_crafting.png b/mods/technic_plus/technic/doc/images/Switching_station_crafting.png new file mode 100644 index 0000000..0f1d767 Binary files /dev/null and b/mods/technic_plus/technic/doc/images/Switching_station_crafting.png differ diff --git a/mods/technic_plus/technic/doc/images/Technic Screenshot.png b/mods/technic_plus/technic/doc/images/Technic Screenshot.png new file mode 100644 index 0000000..682effe Binary files /dev/null and b/mods/technic_plus/technic/doc/images/Technic Screenshot.png differ diff --git a/mods/technic_plus/technic/doc/machines.md b/mods/technic_plus/technic/doc/machines.md new file mode 100644 index 0000000..50d1f97 --- /dev/null +++ b/mods/technic_plus/technic/doc/machines.md @@ -0,0 +1,331 @@ + +powered machines +---------------- + +## Overview +Many of the important machines in Technic run on electricity, using wires to connect generators with the consuming machines. These electric circuits consist of a generator, a consumer, wiring, and a switching station. Every independent circuit requires all 4 of these elements to function. In general the machines are all connected on the bottom by wire. Machines should be placed first and then the wire placed under and around them. The wiring should automatically adjust itself to connect to each machine and adjacent wires. If the wiring looks incorrect, it's likely that it won't work so be sure to check this! + +Circuits are also grouped into 3 different categories based on how much power they transfer and the corresponding voltage: low voltage (LV), medium voltage (MV), and high voltage (HV). The base level for all electronics is low voltage, so if voltage isn't specified for a electrical component, you may safely assume it's low voltage. Most low-voltage components are upgradable to medium- and high-voltage through further crafting. To get started, you won't need to worry about any MV or HV components, and the basic low-voltage components are fine. + +## Getting started +The first step to working with the more advanced machines are to get a basic electrical circuit set up for converting coal into power for other machines. This will rely on the following: + + +1x LV Fuel Fired Generator + + +1x Switching station + + +2x LV Cable + +The generator and switching station should be placed side-by-side with the wire underneath connecting both of them. Once this is done, additional consumers can be added to the network. A grinder or extractor are both good choices to expand the capabilities of the coal-fired smelter and coal-fired alloy furnace that you already have. + + +### powered machine tiers ### + +Each powered machine takes its power in some specific form, being +either fuel-fired (burning fuel directly) or electrically powered at +some specific voltage. There is a general progression through the +game from using fuel-fired machines to electrical machines, and to +higher electrical voltages. The most important kinds of machine come +in multiple variants that are powered in different ways, so the earlier +ones can be superseded. However, some machines are only available for +a specific power tier, so the tier can't be entirely superseded. + +### powered machine upgrades ### + +Some machines have inventory slots that are used to upgrade them in +some way. Generally, machines of MV and HV tiers have two upgrade slots, +and machines of lower tiers (fuel-fired and LV) do not. Any item can +be placed in an upgrade slot, but only specific items will have any +upgrading effect. It is possible to have multiple upgrades of the same +type, but this can't be achieved by stacking more than one upgrade item +in one slot: it is necessary to put the same kind of item in more than one +upgrade slot. The ability to upgrade machines is therefore very limited. +Two kinds of upgrade are currently possible: an energy upgrade and a +tube upgrade. + +An energy upgrade consists of a battery item, the same kind of battery +that serves as a mobile energy store. The effect of an energy upgrade +is to improve in some way the machine's use of electrical energy, most +often by making it use less energy. The upgrade effect has no relation +to energy stored in the battery: the battery's charge level is irrelevant +and will not be affected. + +A tube upgrade consists of a control logic unit item. The effect of a +tube upgrade is to make the machine able, or more able, to eject items +it has finished with into pneumatic tubes. The machines that can take +this kind of upgrade are in any case capable of accepting inputs from +pneumatic tubes. These upgrades are essential in using powered machines +as components in larger automated systems. + +### tubes with powered machines ### + +Generally, powered machines of MV and HV tiers can work with pneumatic +tubes, and those of lower tiers cannot. (As an exception, the fuel-fired +furnace from the basic Minetest game can accept inputs through tubes, +but can't output into tubes.) + +If a machine can accept inputs through tubes at all, then this +is a capability of the basic machine, not requiring any upgrade. +Most item-processing machines take only one kind of input, and in that +case they will accept that input from any direction. This doesn't match +how tubes visually connect to the machines: generally tubes will visually +connect to any face except the front, but an item passing through a tube +in front of the machine will actually be accepted into the machine. + +A minority of machines take more than one kind of input, and in that +case the input slot into which an arriving item goes is determined by the +direction from which it arrives. In this case the machine may be picky +about the direction of arriving items, associating each input type with +a single face of the machine and not accepting inputs at all through the +remaining faces. Again, the visual connection of tubes doesn't match: +generally tubes will still visually connect to any face except the front, +thus connecting to faces that neither accept inputs nor emit outputs. + +Machines do not accept items from tubes into non-input inventory slots: +the output slots or upgrade slots. Output slots are normally filled +only by the processing operation of the machine, and upgrade slots must +be filled manually. + +Powered machines generally do not eject outputs into tubes without +an upgrade. One tube upgrade will make them eject outputs at a slow +rate; a second tube upgrade will increase the rate. Whether the slower +rate is adequate depends on how it compares to the rate at which the +machine produces outputs, and on how the machine is being used as part +of a larger construct. The machine always ejects its outputs through a +particular face, usually a side. Due to a bug, the side through which +outputs are ejected is not consistent: when the machine is rotated one +way, the direction of ejection is rotated the other way. This will +probably be fixed some day, but because a straightforward fix would +break half the machines already in use, the fix may be tied to some +larger change such as free selection of the direction of ejection. + +### battery boxes ### + +The primary purpose of battery boxes is to temporarily store electrical +energy to let an electrical network cope with mismatched supply and +demand. They have a secondary purpose of charging and discharging +powered tools. They are thus a mixture of electrical infrastructure, +powered machine, and generator. Battery boxes connect to cables only +from the bottom. + +MV and HV battery boxes have upgrade slots. Energy upgrades increase +the capacity of a battery box, each by 10% of the un-upgraded capacity. +This increase is far in excess of the capacity of the battery that forms +the upgrade. + +For charging and discharging of power tools, rather than having input and +output slots, each battery box has a charging slot and a discharging slot. +A fully charged/discharged item stays in its slot. The rates at which a +battery box can charge and discharge increase with voltage, so it can +be worth building a battery box of higher tier before one has other +infrastructure of that tier, just to get access to faster charging. + +MV and HV battery boxes work with pneumatic tubes. An item can be input +to the charging slot through the sides or back of the battery box, or +to the discharging slot through the top. With a tube upgrade, fully +charged/discharged tools (as appropriate for their slot) will be ejected +through a side. + +### processing machines ### + +The furnace, alloy furnace, grinder, extractor, compressor, and centrifuge +have much in common. Each implements some industrial process that +transforms items into other items, and the manner in which they present +these processes as powered machines is essentially identical. + +Most of the processing machines operate on inputs of only a single type +at a time, and correspondingly have only a single input slot. The alloy +furnace is an exception: it operates on inputs of two distinct types at +once, and correspondingly has two input slots. It doesn't matter which +way round the alloy furnace's inputs are placed in the two slots. + +The processing machines are mostly available in variants for multiple +tiers. The furnace and alloy furnace are each available in fuel-fired, +LV, and MV forms. The grinder, extractor, and compressor are each +available in LV and MV forms. The centrifuge is the only single-tier +processing machine, being only available in MV form. The higher-tier +machines process items faster than the lower-tier ones, but also have +higher power consumption, usually taking more energy overall to perform +the same amount of processing. The MV machines have upgrade slots, +and energy upgrades reduce their energy consumption. + +The MV machines can work with pneumatic tubes. They accept inputs via +tubes from any direction. For most of the machines, having only a single +input slot, this is perfectly simple behavior. The alloy furnace is more +complex: it will put an arriving item in either input slot, preferring to +stack it with existing items of the same type. It doesn't matter which +slot each of the alloy furnace's inputs is in, so it doesn't matter that +there's no direct control over that, but there is a risk that supplying +a lot of one item type through tubes will result in both slots containing +the same type of item, leaving no room for the second input. + +The MV machines can be given a tube upgrade to make them automatically +eject output items into pneumatic tubes. The items are always ejected +through a side, though which side it is depends on the machine's +orientation, due to a bug. Output items are always ejected singly. +For some machines, such as the grinder, the ejection rate with a +single tube upgrade doesn't keep up with the rate at which items can +be processed. A second tube upgrade increases the ejection rate. + +The LV and fuel-fired machines do not work with pneumatic tubes, except +that the fuel-fired furnace (actually part of the basic Minetest game) +can accept inputs from tubes. Items arriving through the bottom of +the furnace go into the fuel slot, and items arriving from all other +directions go into the input slot. + +### music player ### + +The music player is an LV powered machine that plays audio recordings. +It offers a selection of up to nine tracks. The technic modpack doesn't +include specific music tracks for this purpose; they have to be installed +separately. + +The music player gives the impression that the music is being played in +the Minetest world. The music only plays as long as the music player +is in place and is receiving electrical power, and the choice of music +is controlled by interaction with the machine. The sound also appears +to emanate specifically from the music player: the ability to hear it +depends on the player's distance from the music player. However, the +game engine doesn't currently support any other positional cues for +sound, such as attenuation, panning, or HRTF. The impression of the +sound being located in the Minetest world is also compromised by the +subjective nature of track choice: the specific music that is played to +a player depends on what media the player has installed. + +### CNC machine ### + +The CNC machine is an LV powered machine that cuts building blocks into a +variety of sub-block shapes that are not covered by the crafting recipes +of the stairs mod and its variants. Most of the target shapes are not +rectilinear, involving diagonal or curved surfaces. + +Only certain kinds of building material can be processed in the CNC +machine. + +### tool workshop ### + +The tool workshop is an MV powered machine that repairs mechanically-worn +tools, such as pickaxes and the other ordinary digging tools. It has +a single slot for a tool to be repaired, and gradually repairs the +tool while it is powered. For any single tool, equal amounts of tool +wear, resulting from equal amounts of tool use, take equal amounts of +repair effort. Also, all repairable tools currently take equal effort +to repair equal percentages of wear. The amount of tool use enabled by +equal amounts of repair therefore depends on the tool type. + +The mechanical wear that the tool workshop repairs is always indicated in +inventory displays by a colored bar overlaid on the tool image. The bar +can be seen to fill and change color as the tool workshop operates, +eventually disappearing when the repair is complete. However, not every +item that shows such a wear bar is using it to show mechanical wear. +A wear bar can also be used to indicate charging of a power tool with +stored electrical energy, or filling of a container, or potentially for +all sorts of other uses. The tool workshop won't affect items that use +wear bars to indicate anything other than mechanical wear. + +The tool workshop has upgrade slots. Energy upgrades reduce its power +consumption. + +It can work with pneumatic tubes. Tools to be repaired are accepted +via tubes from any direction. With a tube upgrade, the tool workshop +will also eject fully-repaired tools via one side, the choice of side +depending on the machine's orientation, as for processing machines. It is +safe to put into the tool workshop a tool that is already fully repaired: +assuming the presence of a tube upgrade, the tool will be quickly ejected. +Furthermore, any item of unrepairable type will also be ejected as if +fully repaired. (Due to a historical limitation of the basic Minetest +game, it is impossible for the tool workshop to distinguish between a +fully-repaired tool and any item type that never displays a wear bar.) + +### quarry ### + +The quarry is an HV powered machine that automatically digs out a +large area. The region that it digs out is a cuboid with a square +horizontal cross section, located immediately behind the quarry machine. +The quarry's action is slow and energy-intensive, but requires little +player effort. + +The size of the quarry's horizontal cross section is configurable through +the machine's interaction form. A setting referred to as "radius" +is an integer number of meters which can vary from 2 to 8 inclusive. +The horizontal cross section is a square with side length of twice the +radius plus one meter, thus varying from 5 to 17 inclusive. Vertically, +the quarry always digs from 3 m above the machine to 100 m below it, +inclusive, a total vertical height of 104 m. + +Whatever the quarry digs up is ejected through the top of the machine, +as if from a pneumatic tube. Normally a tube should be placed there +to convey the material into a sorting system, processing machines, or +at least chests. A chest may be placed directly above the machine to +capture the output without sorting, but is liable to overflow. + +If the quarry encounters something that cannot be dug, such as a liquid, +a locked chest, or a protected area, it will skip past that and attempt +to continue digging. + +The quarry consumes 10 kEU per block dug, which is quite a lot of energy. +With most of what is dug being mere stone, it is usually not economically +favorable to power a quarry from anything other than solar power. +In particular, one cannot expect to power a quarry by burning the coal +that it digs up. + +Given sufficient power, the quarry digs at a rate of one block per second. +This is rather tedious to wait for. Unfortunately, leaving the quarry +unattended normally means that the Minetest server won't keep the machine +running: it needs a player nearby. This can be resolved by using a world +anchor. The digging is still quite slow, and independently of whether a +world anchor is used the digging can be speeded up by placing multiple +quarry machines with overlapping digging areas. Four can be placed to +dig identical areas, one on each side of the square cross section. + +The quarry can be toggled on and off with a mesecons signal. + +### forcefield emitter ### + +The forcefield emitter is an HV powered machine that generates a +forcefield reminiscent of those seen in many science-fiction stories. + +The emitter can be configured to generate a forcefield of either +spherical or cubical shape, in either case centered on the emitter. +The size of the forcefield is configured using a radius parameter that +is an integer number of meters which can vary from 5 to 20 inclusive. +For a spherical forcefield this is simply the radius of the forcefield; +for a cubical forcefield it is the distance from the emitter to the +center of each square face. + +The power drawn by the emitter is proportional to the surface area of +the forcefield being generated. A spherical forcefield is therefore the +cheapest way to enclose a specified volume of space with a forcefield, +if the shape of the space doesn't matter. A cubical forcefield is less +efficient at enclosing volume, but is cheaper than the larger spherical +forcefield that would be required if it is necessary to enclose a +cubical space. + +The emitter is normally controlled merely through its interaction form, +which has an enable/disable toggle. However, it can also (via the form) +be placed in a mesecon-controlled mode. If mesecon control is enabled, +the emitter must be receiving a mesecon signal in addition to being +manually enabled, in order for it to generate the forcefield. + +The forcefield itself behaves largely as if solid, despite being +immaterial: it cannot be traversed, and prevents access to blocks behind +it. It is transparent, but not totally invisible. It cannot be dug. +Some effects can pass through it, however, such as the beam of a mining +laser, and explosions. In fact, explosions as currently implemented by +the tnt mod actually temporarily destroy the forcefield itself; the tnt +mod assumes too much about the regularity of node types. + +The forcefield occupies space that would otherwise have been air, but does +not replace or otherwise interfere with materials that are solid, liquid, +or otherwise not just air. If such an object blocking the forcefield is +removed, the forcefield will quickly extend into the now-available space, +but it does not do so instantly: there is a brief moment when the space +is air and can be traversed. + +It is possible to have a doorway in a forcefield, by placing in advance, +in space that the forcefield would otherwise occupy, some non-air blocks +that can be walked through. For example, a door suffices, and can be +opened and closed while the forcefield is in place. diff --git a/mods/technic_plus/technic/doc/mesecons.md b/mods/technic_plus/technic/doc/mesecons.md new file mode 100644 index 0000000..cff258b --- /dev/null +++ b/mods/technic_plus/technic/doc/mesecons.md @@ -0,0 +1,10 @@ + +# Technic mesecons compatibility + +This document describes the interaction of +technic machines with the `mesecons` mod (https://github.com/minetest-mods/mesecons) + +## HV Quarry + +* **On-Action**: Enables the quarry +* **Off-Action**: Disables the quarry diff --git a/mods/technic_plus/technic/doc/power.md b/mods/technic_plus/technic/doc/power.md new file mode 100644 index 0000000..6807677 --- /dev/null +++ b/mods/technic_plus/technic/doc/power.md @@ -0,0 +1,67 @@ + +electrical power +---------------- + +Most machines in technic are electrically powered. To operate them it is +necessary to construct an electrical power network. The network links +together power generators and power-consuming machines, connecting them +using power cables. + +There are three tiers of electrical networking: low voltage (LV), +medium voltage (MV), and high voltage (HV). Each network must operate +at a single voltage, and most electrical items are specific to a single +voltage. Generally, the machines of higher tiers are more powerful, +but consume more energy and are more expensive to build, than machines +of lower tiers. It is normal to build networks of all three tiers, +in ascending order as one progresses through the game, but it is not +strictly necessary to do this. Building HV equipment requires some parts +that can only be manufactured using electrical machines, either LV or MV, +so it is not possible to build an HV network first, but it is possible +to skip either LV or MV on the way to HV. + +Each voltage has its own cable type, with distinctive insulation. Cable +segments connect to each other and to compatible machines automatically. +Incompatible electrical items don't connect. All non-cable electrical +items must be connected via cable: they don't connect directly to each +other. Most electrical items can connect to cables in any direction, +but there are a couple of important exceptions noted below. + +To be useful, an electrical network must connect at least one power +generator to at least one power-consuming machine. In addition to these +items, the network must have a "switching station" in order to operate: +no energy will flow without one. Unlike most electrical items, the +switching station is not voltage-specific: the same item will manage +a network of any tier. However, also unlike most electrical items, +it is picky about the direction in which it is connected to the cable: +the cable must be directly below the switching station. + +Hovering over a network's switching station will show the aggregate energy +supply and demand, which is useful for troubleshooting. Electrical energy +is measured in "EU", and power (energy flow) in EU per second (EU/s). +Energy is shifted around a network instantaneously once per second. + +In a simple network with only generators and consumers, if total +demand exceeds total supply then no energy will flow, the machines +will do nothing, and the generators' output will be lost. To handle +this situation, it is recommended to add a battery box to the network. +A battery box will store generated energy, and when enough has been +stored to run the consumers for one second it will deliver it to the +consumers, letting them run part-time. It also stores spare energy +when supply exceeds demand, to let consumers run full-time when their +demand occasionally peaks above the supply. More battery boxes can +be added to cope with larger periods of mismatched supply and demand, +such as those resulting from using solar generators (which only produce +energy in the daytime). + +When there are electrical networks of multiple tiers, it can be appealing +to generate energy on one tier and transfer it to another. The most +direct way to do this is with the "supply converter", which can be +directly wired into two networks. It is another tier-independent item, +and also particular about the direction of cable connections: it must +have the cable of one network directly above, and the cable of another +network directly below. The supply converter demands 10000 EU/s from +the network above, and when this network gives it power it supplies 9000 +EU/s to the network below. Thus it is only 90% efficient, unlike most of +the electrical system which is 100% efficient in moving energy around. +To transfer more than 10000 EU/s between networks, connect multiple +supply converters in parallel. diff --git a/mods/technic_plus/technic/doc/processes.md b/mods/technic_plus/technic/doc/processes.md new file mode 100644 index 0000000..b291ed9 --- /dev/null +++ b/mods/technic_plus/technic/doc/processes.md @@ -0,0 +1,105 @@ + +industrial processes +-------------------- + +### alloying ### + +In technic, alloying is a way of combining items to create other items, +distinct from standard crafting. Alloying always uses inputs of exactly +two distinct types, and produces a single output. Like cooking, which +takes a single input, it is performed using a powered machine, known +generically as an "alloy furnace". An alloy furnace always has two +input slots, and it doesn't matter which way round the two ingredients +are placed in the slots. Many alloying recipes require one or both +slots to contain a stack of more than one of the ingredient item: the +quantity required of each ingredient is part of the recipe. + +As with the furnaces used for cooking, there are multiple kinds of alloy +furnace, powered in different ways. The most-used alloy furnaces are +electrically powered. There is also an alloy furnace that is powered +by directly burning fuel, just like the basic cooking furnace. Building +almost any electrical machine, including the electrically-powered alloy +furnaces, requires a machine casing component, one ingredient of which +is brass, an alloy. It is therefore necessary to use the fuel-fired +alloy furnace in the early part of the game, on the way to building +electrical machinery. + +Alloying recipes are mainly concerned with metals. These recipes +combine a base metal with some other element, most often another metal, +to produce a new metal. This is discussed in the section on metal. +There are also a few alloying recipes in which the base ingredient is +non-metallic, such as the recipe for the silicon wafer. + +### grinding, extracting, and compressing ### + +Grinding, extracting, and compressing are three distinct, but very +similar, ways of converting one item into another. They are all quite +similar to the cooking found in the basic Minetest game. Each uses +an input consisting of a single item type, and produces a single +output. They are all performed using powered machines, respectively +known generically as a "grinder", "extractor", and "compressor". +Some compressing recipes require the input to be a stack of more than +one of the input item: the quantity required is part of the recipe. +Grinding and extracting recipes never require such a stacked input. + +There are multiple kinds of grinder, extractor, and compressor. Unlike +cooking furnaces and alloy furnaces, there are none that directly burn +fuel; they are all electrically powered. + +Grinding recipes always produce some kind of dust, loosely speaking, +as output. The most important grinding recipes are concerned with metals: +every metal lump or ingot can be ground into metal dust. Coal can also +be ground into dust, and burning the dust as fuel produces much more +energy than burning the original coal lump. There are a few other +grinding recipes that make block types from the basic Minetest game +more interconvertible: standard stone can be ground to standard sand, +desert stone to desert sand, cobblestone to gravel, and gravel to dirt. + +Extracting is a miscellaneous category, used for a small group +of processes that just don't fit nicely anywhere else. (Its name is +notably vaguer than those of the other kinds of processing.) It is used +for recipes that produce dye, mainly from flowers. (However, for those +recipes using flowers, the basic Minetest game provides parallel crafting +recipes that are easier to use and produce more dye, and those recipes +are not suppressed by technic.) Its main use is to generate rubber from +raw latex, which it does three times as efficiently as merely cooking +the latex. Extracting was also formerly used for uranium enrichment for +use as nuclear fuel, but this use has been superseded by a new enrichment +system using the centrifuge. + +Compressing recipes are mainly used to produce a few relatively advanced +artificial item types, such as the copper and carbon plates used in +advanced machine recipes. There are also a couple of compressing recipes +making natural block types more interconvertible. + +### centrifuging ### + +Centrifuging is another way of using a machine to convert items. +Centrifuging takes an input of a single item type, and produces outputs +of two distinct types. The input may be required to be a stack of +more than one of the input item: the quantity required is part of +the recipe. Centrifuging is only performed by a single machine type, +the MV (electrically-powered) centrifuge. + +Currently, centrifuging recipes don't appear in the unified\_inventory +craft guide, because unified\_inventory can't yet handle recipes with +multiple outputs. + +Generally, centrifuging separates the input item into constituent +substances, but it can only work when the input is reasonably fluid, +and in marginal cases it is quite destructive to item structure. +(In real life, centrifuges require their input to be mainly fluid, that +is either liquid or gas. Few items in the game are described as liquid +or gas, so the concept of the centrifuge is stretched a bit to apply to +finely-divided solids.) + +The main use of centrifuging is in uranium enrichment, where it +separates the isotopes of uranium dust that otherwise appears uniform. +Enrichment is a necessary process before uranium can be used as nuclear +fuel, and the radioactivity of uranium blocks is also affected by its +isotopic composition. + +A secondary use of centrifuging is to separate the components of +metal alloys. This can only be done using the dust form of the alloy. +It recovers both components of binary metal/metal alloys. It can't +recover the carbon from steel or cast iron. diff --git a/mods/technic_plus/technic/doc/radioactivity.md b/mods/technic_plus/technic/doc/radioactivity.md new file mode 100644 index 0000000..627572f --- /dev/null +++ b/mods/technic_plus/technic/doc/radioactivity.md @@ -0,0 +1,136 @@ + +radioactivity +------------- + +The technic mod adds radioactivity to the game, as a hazard that can +harm player characters. Certain substances in the game are radioactive, +and when placed as blocks in the game world will damage nearby players. +Conversely, some substances attenuate radiation, and so can be used +for shielding. The radioactivity system is based on reality, but is +not an attempt at serious simulation: like the rest of the game, it has +many simplifications and deliberate deviations from reality in the name +of game balance. + +In real life radiological hazards can be roughly divided into three +categories based on the time scale over which they act: prompt radiation +damage (such as radiation burns) that takes effect immediately; radiation +poisoning that becomes visible in hours and lasts weeks; and cumulative +effects such as increased cancer risk that operate over decades. +The game's version of radioactivity causes only prompt damage, not +any delayed effects. Damage comes in the abstracted form of removing +the player's hit points, and is immediately visible to the player. +As with all other kinds of damage in the game, the player can restore +the hit points by eating food items. High-nutrition foods, such as the +pie baskets supplied by the bushes\_classic mod, are a useful tool in +dealing with radiological hazards. + +Only a small range of items in the game are radioactive. From the technic +mod, the only radioactive items are uranium ore, refined uranium blocks, +nuclear reactor cores (when operating), and the materials released when +a nuclear reactor melts down. Other mods can plug into the technic +system to make their own block types radioactive. Radioactive items +are harmless when held in inventories. They only cause radiation damage +when placed as blocks in the game world. + +The rate at which damage is caused by a radioactive block depends on the +distance between the source and the player. Distance matters because the +damaging radiation is emitted equally in all directions by the source, +so with distance it spreads out, so less of it will strike a target +of any specific size. The amount of radiation absorbed by a target +thus varies in proportion to the inverse square of the distance from +the source. The game imitates this aspect of real-life radioactivity, +but with some simplifications. While in real life the inverse square law +is only really valid for sources and targets that are small relative to +the distance between them, in the game it is applied even when the source +and target are large and close together. Specifically, the distance is +measured from the center of the radioactive block to the abdomen of the +player character. For extremely close encounters, such as where the +player swims in a radioactive liquid, there is an enforced lower limit +on the effective distance. + +Different types of radioactive block emit different amounts of radiation. +The least radioactive of the radioactive block types is uranium ore, +which causes 0.25 HP/s damage to a player 1 m away. A block of refined +but unenriched uranium, as an example, is nine times as radioactive, +and so will cause 2.25 HP/s damage to a player 1 m away. By the inverse +square law, the damage caused by that uranium block reduces by a factor +of four at twice the distance, that is to 0.5625 HP/s at a distance of 2 +m, or by a factor of nine at three times the distance, that is to 0.25 +HP/s at a distance of 3 m. Other radioactive block types are far more +radioactive than these: the most radioactive of all, the result of a +nuclear reactor melting down, is 1024 times as radioactive as uranium ore. + +Uranium blocks are radioactive to varying degrees depending on their +isotopic composition. An isotope being fissile, and thus good as +reactor fuel, is essentially uncorrelated with it being radioactive. +The fissile U-235 is about six times as radioactive than the non-fissile +U-238 that makes up the bulk of natural uranium, so one might expect that +enriching from 0.7% fissile to 3.5% fissile (or depleting to 0.0%) would +only change the radioactivity of uranium by a few percent. But actually +the radioactivity of enriched uranium is dominated by the non-fissile +U-234, which makes up only about 50 parts per million of natural uranium +but is about 19000 times more radioactive than U-238. The radioactivity +of natural uranium comes just about half from U-238 and half from U-234, +and the uranium gets enriched in U-234 along with the U-235. This makes +3.5%-fissile uranium about three times as radioactive as natural uranium, +and 0.0%-fissile uranium about half as radioactive as natural uranium. + +Radiation is attenuated by the shielding effect of material along the +path between the radioactive block and the player. In general, only +blocks of homogeneous material contribute to the shielding effect: for +example, a block of solid metal has a shielding effect, but a machine +does not, even though the machine's ingredients include a metal case. +The shielding effect of each block type is based on the real-life +resistance of the material to ionising radiation, but for game balance +the effectiveness of shielding is scaled down from real life, more so +for stronger shield materials than for weaker ones. Also, whereas in +real life materials have different shielding effects against different +types of radiation, the game only has one type of damaging radiation, +and so only one set of shielding values. + +Almost any solid or liquid homogeneous material has some shielding value. +At the low end of the scale, 5 meters of wooden planks nearly halves +radiation, though in that case the planks probably contribute more +to safety by forcing the player to stay 5 m further away from the +source than by actual attenuation. Dirt halves radiation in 2.4 m, +and stone in 1.7 m. When a shield must be deliberately constructed, +the preferred materials are metals, the denser the better. Iron and +steel halve radiation in 1.1 m, copper in 1.0 m, and silver in 0.95 m. +Lead would halve in 0.69 m (its in-game shielding value is 80). Gold halves radiation +in 0.53 m (factor of 3.7 per meter), but is a bit scarce to use for +this purpose. Uranium halves radiation in 0.31 m (factor of 9.4 per +meter), but is itself radioactive. The very best shielding in the game +is nyancat material (nyancats and their rainbow blocks), which halves +radiation in 0.22 m (factor of 24 per meter), but is extremely scarce. See [technic/technic/radiation.lua](https://github.com/minetest-technic/technic/blob/master/technic/radiation.lua) for the in-game shielding values, which are different from real-life values. + +If the theoretical radiation damage from a particular source is +sufficiently small, due to distance and shielding, then no damage at all +will actually occur. This means that for any particular radiation source +and shielding arrangement there is a safe distance to which a player can +approach without harm. The safe distance is where the radiation damage +would theoretically be 0.25 HP/s. This damage threshold is applied +separately for each radiation source, so to be safe in a multi-source +situation it is only necessary to be safe from each source individually. + +The best way to use uranium as shielding is in a two-layer structure, +of uranium and some non-radioactive material. The uranium layer should +be nearer to the primary radiation source and the non-radioactive layer +nearer to the player. The uranium provides a great deal of shielding +against the primary source, and the other material shields against +the uranium layer. Due to the damage threshold mechanism, a meter of +dirt is sufficient to shield fully against a layer of fully-depleted +(0.0%-fissile) uranium. Obviously this is only worthwhile when the +primary radiation source is more radioactive than a uranium block. + +When constructing permanent radiation shielding, it is necessary to +pay attention to the geometry of the structure, and particularly to any +holes that have to be made in the shielding, for example to accommodate +power cables. Any hole that is aligned with the radiation source makes a +"shine path" through which a player may be irradiated when also aligned. +Shine paths can be avoided by using bent paths for cables, passing +through unaligned holes in multiple shield layers. If the desired +shielding effect depends on multiple layers, a hole in one layer still +produces a partial shine path, along which the shielding is reduced, +so the positioning of holes in each layer must still be considered. +Tricky shine paths can also be addressed by just keeping players out of +the dangerous area. diff --git a/mods/technic_plus/technic/doc/resources.md b/mods/technic_plus/technic/doc/resources.md new file mode 100644 index 0000000..690dd17 --- /dev/null +++ b/mods/technic_plus/technic/doc/resources.md @@ -0,0 +1,7 @@ +Technic provides additional resources for building these machines. + +## Latex + + + +Latex is used for manufacturing rubber, which is heavily used for the medium- and high-voltage components within Technic. Latex can be harvested directly from rubber trees (look for the pale green/seafoam leaves) using the tree tap like any other tool. Rubber trees regenerate their latex supplies after about a day. diff --git a/mods/technic_plus/technic/doc/substances.md b/mods/technic_plus/technic/doc/substances.md new file mode 100644 index 0000000..d54fd52 --- /dev/null +++ b/mods/technic_plus/technic/doc/substances.md @@ -0,0 +1,490 @@ + +substances +---------- + +### ore ### + +The technic mod makes extensive use of not just the default ores but also +some that are added by mods. You will need to mine for all the ore types +in the course of the game. Each ore type is found at a specific range of +elevations, and while the ranges mostly overlap, some have non-overlapping +ranges, so you will ultimately need to mine at more than one elevation +to find all the ores. Also, because one of the best elevations to mine +at is very deep, you will be unable to mine there early in the game. + +Elevation is measured in meters, relative to a reference plane that +is not quite sea level. (The standard sea level is at an elevation +of about +1.4.) Positive elevations are above the reference plane and +negative elevations below. Because elevations are always described this +way round, greater numbers when higher, we avoid the word "depth". + +The ores that matter in technic are coal, iron, copper, tin, zinc, +chromium, uranium, silver, gold, mithril, mese, and diamond. + +Coal is part of the basic Minetest game. It is found from elevation ++64 downwards, so is available right on the surface at the start of +the game, but it is far less abundant above elevation 0 than below. +It is initially used as a fuel, driving important machines in the early +part of the game. It becomes less important as a fuel once most of your +machines are electrically powered, but burning fuel remains a way to +generate electrical power. Coal is also used, usually in dust form, as +an ingredient in alloying recipes, wherever elemental carbon is required. + +Iron is part of the basic Minetest game. It is found from elevation ++2 downwards, and its abundance increases in stages as one descends, +reaching its maximum from elevation -64 downwards. It is a common metal, +used frequently as a structural component. In technic, unlike the basic +game, iron is used in multiple forms, mainly alloys based on iron and +including carbon (coal). + +Copper is part of the basic Minetest game (having migrated there from +moreores). It is found from elevation -16 downwards, but is more abundant +from elevation -64 downwards. It is a common metal, used either on its +own for its electrical conductivity, or as the base component of alloys. +Although common, it is very heavily used, and most of the time it will +be the material that most limits your activity. + +Tin is part of the basic Minetest game (having migrated there from +moreores). It is found from elevation +8 downwards, with no +elevation-dependent variations in abundance beyond that point. +It is a common metal. Its main use in pure form is as a component +of electrical batteries. Apart from that its main purpose is +as the secondary ingredient in bronze (the base being copper), but bronze +is itself little used. Its abundance is well in excess of its usage, +so you will usually have a surplus of it. + +Zinc is supplied by technic. It is found from elevation +2 downwards, +with no elevation-dependent variations in abundance beyond that point. +It is a common metal. Its main use is as the secondary ingredient +in brass (the base being copper), but brass is itself little used. +Its abundance is well in excess of its usage, so you will usually have +a surplus of it. + +Chromium is supplied by technic. It is found from elevation -100 +downwards, with no elevation-dependent variations in abundance beyond +that point. It is a moderately common metal. Its main use is as the +secondary ingredient in stainless steel (the base being iron). + +Uranium is supplied by technic. It is found only from elevation -80 down +to -300; using it therefore requires one to mine above elevation -300 even +though deeper mining is otherwise more productive. It is a moderately +common metal, useful only for reasons related to radioactivity: it forms +the fuel for nuclear reactors, and is also one of the best radiation +shielding materials available. It is not difficult to find enough uranium +ore to satisfy these uses. Beware that the ore is slightly radioactive: +it will slightly harm you if you stand as close as possible to it. +It is safe when more than a meter away or when mined. + +Silver is supplied by the moreores mod. It is found from elevation -2 +downwards, with no elevation-dependent variations in abundance beyond +that point. It is a semi-precious metal. It is little used, being most +notably used in electrical items due to its conductivity, being the best +conductor of all the pure elements. + +Gold is part of the basic Minetest game (having migrated there from +moreores). It is found from elevation -64 downwards, but is more +abundant from elevation -256 downwards. It is a precious metal. It is +little used, being most notably used in electrical items due to its +combination of good conductivity (third best of all the pure elements) +and corrosion resistance. + +Mithril is supplied by the moreores mod. It is found from elevation +-512 downwards, the deepest ceiling of any minable substance, with +no elevation-dependent variations in abundance beyond that point. +It is a rare precious metal, and unlike all the other metals described +here it is entirely fictional, being derived from J. R. R. Tolkien's +Middle-Earth setting. It is little used. + +Mese is part of the basic Minetest game. It is found from elevation +-64 downwards. The ore is more abundant from elevation -256 downwards, +and from elevation -1024 downwards there are also occasional blocks of +solid mese (each yielding as much mese as nine blocks of ore). It is a +precious gemstone, and unlike diamond it is entirely fictional. It is +used in many recipes, though mainly not in large quantities, wherever +some magical quality needs to be imparted. + +Diamond is part of the basic Minetest game (having migrated there from +technic). It is found from elevation -128 downwards, but is more abundant +from elevation -256 downwards. It is a precious gemstone. It is used +moderately, mainly for reasons connected to its extreme hardness. + +### rock ### + +In addition to the ores, there are multiple kinds of rock that need to be +mined in their own right, rather than for minerals. The rock types that +matter in technic are standard stone, desert stone, marble, and granite. + +Standard stone is part of the basic Minetest game. It is extremely +common. As in the basic game, when dug it yields cobblestone, which can +be cooked to turn it back into standard stone. Cobblestone is used in +recipes only for some relatively primitive machines. Standard stone is +used in a couple of machine recipes. These rock types gain additional +significance with technic because the grinder can be used to turn them +into dirt and sand. This, especially when combined with an automated +cobblestone generator, can be an easier way to acquire sand than +collecting it where it occurs naturally. + +Desert stone is part of the basic Minetest game. It is found specifically +in desert biomes, and only from elevation +2 upwards. Although it is +easily accessible, therefore, its quantity is ultimately quite limited. +It is used in a few recipes. + +Marble is supplied by technic. It is found in dense clusters from +elevation -50 downwards. It has mainly decorative use, but also appears +in one machine recipe. + +Granite is supplied by technic. It is found in dense clusters from +elevation -150 downwards. It is much harder to dig than standard stone, +so impedes mining when it is encountered. It has mainly decorative use, +but also appears in a couple of machine recipes. + +### rubber ### + +Rubber is a biologically-derived material that has industrial uses due +to its electrical resistivity and its impermeability. In technic, it +is used in a few recipes, and it must be acquired by tapping rubber trees. + +If you have the moretrees mod installed, the rubber trees you need +are those defined by that mod. If not, technic supplies a copy of the +moretrees rubber tree. + +Extracting rubber requires a specific tool, a tree tap. Using the tree +tap (by left-clicking) on a rubber tree trunk block extracts a lump of +raw latex from the trunk. Each trunk block can be repeatedly tapped for +latex, at intervals of several minutes; its appearance changes to show +whether it is currently ripe for tapping. Each tree has several trunk +blocks, so several latex lumps can be extracted from a tree in one visit. + +Raw latex isn't used directly. It must be vulcanized to produce finished +rubber. This can be performed by alloying the latex with coal dust. + +### metal ### + +Many of the substances important in technic are metals, and there is +a common pattern in how metals are handled. Generally, each metal can +exist in five forms: ore, lump, dust, ingot, and block. With a couple of +tricky exceptions in mods outside technic, metals are only *used* in dust, +ingot, and block forms. Metals can be readily converted between these +three forms, but can't be converted from them back to ore or lump forms. + +As in the basic Minetest game, a "lump" of metal is acquired directly by +digging ore, and will then be processed into some other form for use. +A lump is thus more akin to ore than to refined metal. (In real life, +metal ore rarely yields lumps ("nuggets") of pure metal directly. +More often the desired metal is chemically bound into the rock as an +oxide or some other compound, and the ore must be chemically processed +to yield pure metal.) + +Not all metals occur directly as ore. Generally, elemental metals (those +consisting of a single chemical element) occur as ore, and alloys (those +consisting of a mixture of multiple elements) do not. In fact, if the +fictional mithril is taken to be elemental, this pattern is currently +followed perfectly. (It is not clear in the Middle-Earth setting whether +mithril is elemental or an alloy.) This might change in the future: +in real life some alloys do occur as ore, and some elemental metals +rarely occur naturally outside such alloys. Metals that do not occur +as ore also lack the "lump" form. + +The basic Minetest game offers a single way to refine metals: cook a lump +in a furnace to produce an ingot. With technic this refinement method +still exists, but is rarely used outside the early part of the game, +because technic offers a more efficient method once some machines have +been built. The grinder, available only in electrically-powered forms, +can grind a metal lump into two piles of metal dust. Each dust pile +can then be cooked into an ingot, yielding two ingots from one lump. +This doubling of material value means that you should only cook a lump +directly when you have no choice, mainly early in the game when you +haven't yet built a grinder. + +An ingot can also be ground back to (one pile of) dust. Thus it is always +possible to convert metal between ingot and dust forms, at the expense +of some energy consumption. Nine ingots of a metal can be crafted into +a block, which can be used for building. The block can also be crafted +back to nine ingots. Thus it is possible to freely convert metal between +ingot and block forms, which is convenient to store the metal compactly. +Every metal has dust, ingot, and block forms. + +Alloying recipes in which a metal is the base ingredient, to produce a +metal alloy, always come in two forms, using the metal either as dust +or as an ingot. If the secondary ingredient is also a metal, it must +be supplied in the same form as the base ingredient. The output alloy +is also returned in the same form. For example, brass can be produced +by alloying two copper ingots with one zinc ingot to make three brass +ingots, or by alloying two piles of copper dust with one pile of zinc +dust to make three piles of brass dust. The two ways of alloying produce +equivalent results. + +### iron and its alloys ### + +Iron forms several important alloys. In real-life history, iron was the +second metal to be used as the base component of deliberately-constructed +alloys (the first was copper), and it was the first metal whose working +required processes of any metallurgical sophistication. The game +mechanics around iron broadly imitate the historical progression of +processes around it, rather than the less-varied modern processes. + +The two-component alloying system of iron with carbon is of huge +importance, both in the game and in real life. The basic Minetest game +doesn't distinguish between these pure iron and these alloys at all, +but technic introduces a distinction based on the carbon content, and +renames some items of the basic game accordingly. + +The iron/carbon spectrum is represented in the game by three metal +substances: wrought iron, carbon steel, and cast iron. Wrought iron +has low carbon content (less than 0.25%), resists shattering, and +is easily welded, but is relatively soft and susceptible to rusting. +In real-life history it was used for rails, gates, chains, wire, pipes, +fasteners, and other purposes. Cast iron has high carbon content +(2.1% to 4%), is especially hard, and resists corrosion, but is +relatively brittle, and difficult to work. Historically it was used +to build large structures such as bridges, and for cannons, cookware, +and engine cylinders. Carbon steel has medium carbon content (0.25% +to 2.1%), and intermediate properties: moderately hard and also tough, +somewhat resistant to corrosion. In real life it is now used for most +of the purposes previously satisfied by wrought iron and many of those +of cast iron, but has historically been especially important for its +use in swords, armor, skyscrapers, large bridges, and machines. + +In real-life history, the first form of iron to be refined was +wrought iron, which is nearly pure iron, having low carbon content. +It was produced from ore by a low-temperature furnace process (the +"bloomery") in which the ore/iron remains solid and impurities (slag) +are progressively removed by hammering ("working", hence "wrought"). +This began in the middle East, around 1800 BCE. + +Historically, the next forms of iron to be refined were those of high +carbon content. This was the result of the development of a more +sophisticated kind of furnace, the blast furnace, capable of reaching +higher temperatures. The real advantage of the blast furnace is that it +melts the metal, allowing it to be cast straight into a shape supplied by +a mould, rather than having to be gradually beaten into the desired shape. +A side effect of the blast furnace is that carbon from the furnace's fuel +is unavoidably incorporated into the metal. Normally iron is processed +twice through the blast furnace: once producing "pig iron", which has +very high carbon content and lots of impurities but lower melting point, +casting it into rough ingots, then remelting the pig iron and casting it +into the final moulds. The result is called "cast iron". Pig iron was +first produced in China around 1200 BCE, and cast iron later in the 5th +century BCE. Incidentally, the Chinese did not have the bloomery process, +so this was their first iron refining process, and, unlike the rest of +the world, their first wrought iron was made from pig iron rather than +directly from ore. + +Carbon steel, with intermediate carbon content, was developed much later, +in Europe in the 17th century CE. It required a more sophisticated +process, because the blast furnace made it extremely difficult to achieve +a controlled carbon content. Tweaks of the blast furnace would sometimes +produce an intermediate carbon content by luck, but the first processes to +reliably produce steel were based on removing almost all the carbon from +pig iron and then explicitly mixing a controlled amount of carbon back in. + +In the game, the bloomery process is represented by ordinary cooking +or grinding of an iron lump. The lump represents unprocessed ore, +and is identified only as "iron", not specifically as wrought iron. +This standard refining process produces dust or an ingot which is +specifically identified as wrought iron. Thus the standard refining +process produces the (nearly) pure metal. + +Cast iron is trickier. You might expect from the real-life notes above +that cooking an iron lump (representing ore) would produce pig iron that +can then be cooked again to produce cast iron. This is kind of the case, +but not exactly, because as already noted cooking an iron lump produces +wrought iron. The game doesn't distinguish between low-temperature +and high-temperature cooking processes: the same furnace is used not +just to cast all kinds of metal but also to cook food. So there is no +distinction between cooking processes to produce distinct wrought iron +and pig iron. But repeated cooking *is* available as a game mechanic, +and is indeed used to produce cast iron: re-cooking a wrought iron ingot +produces a cast iron ingot. So pig iron isn't represented in the game as +a distinct item; instead wrought iron stands in for pig iron in addition +to its realistic uses as wrought iron. + +Carbon steel is produced by a more regular in-game process: alloying +wrought iron with coal dust (which is essentially carbon). This bears +a fair resemblance to the historical development of carbon steel. +This alloying recipe is relatively time-consuming for the amount of +material processed, when compared against other alloying recipes, and +carbon steel is heavily used, so it is wise to alloy it in advance, +when you're not waiting for it. + +There are additional recipes that permit all three of these types of iron +to be converted into each other. Alloying carbon steel again with coal +dust produces cast iron, with its higher carbon content. Cooking carbon +steel or cast iron produces wrought iron, in an abbreviated form of the +bloomery process. + +There's one more iron alloy in the game: stainless steel. It is managed +in a completely regular manner, created by alloying carbon steel with +chromium. + +### uranium enrichment ### + +When uranium is to be used to fuel a nuclear reactor, it is not +sufficient to merely isolate and refine uranium metal. It is necessary +to control its isotopic composition, because the different isotopes +behave differently in nuclear processes. + +The main isotopes of interest are U-235 and U-238. U-235 is good at +sustaining a nuclear chain reaction, because when a U-235 nucleus is +bombarded with a neutron it will usually fission (split) into fragments. +It is therefore described as "fissile". U-238, on the other hand, +is not fissile: if bombarded with a neutron it will usually capture it, +becoming U-239, which is very unstable and quickly decays into semi-stable +(and fissile) plutonium-239. + +Inconveniently, the fissile U-235 makes up only about 0.7% of natural +uranium, almost all of the other 99.3% being U-238. Natural uranium +therefore doesn't make a great nuclear fuel. (In real life there are +a small number of reactor types that can use it, but technic doesn't +have such a reactor.) Better nuclear fuel needs to contain a higher +proportion of U-235. + +Achieving a higher U-235 content isn't as simple as separating the U-235 +from the U-238 and just using the required amount of U-235. Because +U-235 and U-238 are both uranium, and therefore chemically identical, +they cannot be chemically separated, in the way that different elements +are separated from each other when refining metal. They do differ +in atomic mass, so they can be separated by centrifuging, but because +their atomic masses are very close, centrifuging doesn't separate them +very well. They cannot be separated completely, but it is possible to +produce uranium that has the isotopes mixed in different proportions. +Uranium with a significantly larger fissile U-235 fraction than natural +uranium is called "enriched", and that with a significantly lower fissile +fraction is called "depleted". + +A single pass through a centrifuge produces two output streams, one with +a fractionally higher fissile proportion than the input, and one with a +fractionally lower fissile proportion. To alter the fissile proportion +by a significant amount, these output streams must be centrifuged again, +repeatedly. The usual arrangement is a "cascade", a linear arrangement +of many centrifuges. Each centrifuge takes as input uranium with some +specific fissile proportion, and passes its two output streams to the +two adjacent centrifuges. Natural uranium is input somewhere in the +middle of the cascade, and the two ends of the cascade produce properly +enriched and depleted uranium. + +Fuel for technic's nuclear reactor consists of enriched uranium of which +3.5% is fissile. (This is a typical value for a real-life light water +reactor, a common type for power generation.) To enrich uranium in the +game, it must first be in dust form: the centrifuge will not operate +on ingots. (In real life uranium enrichment is done with the uranium +in the form of a gas.) It is best to grind uranium lumps directly to +dust, rather than cook them to ingots first, because this yields twice +as much metal dust. When uranium is in refined form (dust, ingot, or +block), the name of the inventory item indicates its fissile proportion. +Uranium of any available fissile proportion can be put through all the +usual processes for metal. + +A single centrifuge operation takes two uranium dust piles, and produces +as output one dust pile with a fissile proportion 0.1% higher and one with +a fissile proportion 0.1% lower. Uranium can be enriched up to the 3.5% +required for nuclear fuel, and depleted down to 0.0%. Thus a cascade +covering the full range of fissile fractions requires 34 cascade stages. +(In real life, enriching to 3.5% uses thousands of cascade stages. +Also, centrifuging is less effective when the input isotope ratio +is more skewed, so the steps in fissile proportion are smaller for +relatively depleted uranium. Zero fissile content is only asymptotically +approachable, and natural uranium relatively cheap, so uranium is normally +only depleted to around 0.3%. On the other hand, much higher enrichment +than 3.5% isn't much more difficult than enriching that far.) + +Although centrifuges can be used manually, it is not feasible to perform +uranium enrichment by hand. It is a practical necessity to set up +an automated cascade, using pneumatic tubes to transfer uranium dust +piles between centrifuges. Because both outputs from a centrifuge are +ejected into the same tube, sorting tubes are needed to send the outputs +in different directions along the cascade. It is possible to send items +into the centrifuges through the same tubes that take the outputs, so the +simplest version of the cascade structure has a line of 34 centrifuges +linked by a line of 34 sorting tube segments. + +Assuming that the cascade depletes uranium all the way to 0.0%, +producing one unit of 3.5%-fissile uranium requires the input of five +units of 0.7%-fissile (natural) uranium, takes 490 centrifuge operations, +and produces four units of 0.0%-fissile (fully depleted) uranium as a +byproduct. It is possible to reduce the number of required centrifuge +operations by using more natural uranium input and outputting only +partially depleted uranium, but (unlike in real life) this isn't usually +an economical approach. The 490 operations are not spread equally over +the cascade stages: the busiest stage is the one taking 0.7%-fissile +uranium, which performs 28 of the 490 operations. The least busy is the +one taking 3.4%-fissile uranium, which performs 1 of the 490 operations. + +A centrifuge cascade will consume quite a lot of energy. It is +worth putting a battery upgrade in each centrifuge. (Only one can be +accommodated, because a control logic unit upgrade is also required for +tube operation.) An MV centrifuge, the only type presently available, +draws 7 kEU/s in this state, and takes 5 s for each uranium centrifuging +operation. It thus takes 35 kEU per operation, and the cascade requires +17.15 MEU to produce each unit of enriched uranium. It takes five units +of enriched uranium to make each fuel rod, and six rods to fuel a reactor, +so the enrichment cascade requires 514.5 MEU to process a full set of +reactor fuel. This is about 0.85% of the 6.048 GEU that the reactor +will generate from that fuel. + +If there is enough power available, and enough natural uranium input, +to keep the cascade running continuously, and exactly one centrifuge +at each stage, then the overall speed of the cascade is determined by +the busiest stage, the 0.7% stage. It can perform its 28 operations +towards the enrichment of a single uranium unit in 140 s, so that is +the overall cycle time of the cascade. It thus takes 70 min to enrich +a full set of reactor fuel. While the cascade is running at this full +speed, its average power consumption is 122.5 kEU/s. The instantaneous +power consumption varies from second to second over the 140 s cycle, +and the maximum possible instantaneous power consumption (with all 34 +centrifuges active simultaneously) is 238 kEU/s. It is recommended to +have some battery boxes to smooth out these variations. + +If the power supplied to the centrifuge cascade averages less than +122.5 kEU/s, then the cascade can't run continuously. (Also, if the +power supply is intermittent, such as solar, then continuous operation +requires more battery boxes to smooth out the supply variations, even if +the average power is high enough.) Because it's automated and doesn't +require continuous player attention, having the cascade run at less +than full speed shouldn't be a major problem. The enrichment work will +consume the same energy overall regardless of how quickly it's performed, +and the speed will vary in direct proportion to the average power supply +(minus any supply lost because battery boxes filled completely). + +If there is insufficient power to run both the centrifuge cascade at +full speed and whatever other machines require power, all machines on +the same power network as the centrifuge will be forced to run at the +same fractional speed. This can be inconvenient, especially if use +of the other machines is less automated than the centrifuge cascade. +It can be avoided by putting the centrifuge cascade on a separate power +network from other machines, and limiting the proportion of the generated +power that goes to it. + +If there is sufficient power and it is desired to enrich uranium faster +than a single cascade can, the process can be speeded up more economically +than by building an entire second cascade. Because the stages of the +cascade do different proportions of the work, it is possible to add a +second and subsequent centrifuges to only the busiest stages, and have +the less busy stages still keep up with only a single centrifuge each. + +Another possible approach to uranium enrichment is to have no fixed +assignment of fissile proportions to centrifuges, dynamically putting +whatever uranium is available into whichever centrifuges are available. +Theoretically all of the centrifuges can be kept almost totally busy all +the time, making more efficient use of capital resources, and the number +of centrifuges used can be as little (down to one) or as large as desired. +The difficult part is that it is not sufficient to put each uranium dust +pile individually into whatever centrifuge is available: they must be +input in matched pairs. Any odd dust pile in a centrifuge will not be +processed and will prevent that centrifuge from accepting any other input. + +### concrete ### + +Concrete is a synthetic building material. The technic modpack implements +it in the game. + +Two forms of concrete are available as building blocks: ordinary +"concrete" and more advanced "blast-resistant concrete". Despite its +name, the latter has no special resistance to explosions or to any other +means of destruction. + +Concrete can also be used to make fences. They act just like wooden +fences, but aren't flammable. Confusingly, the item that corresponds +to a wooden "fence" is called "concrete post". Posts placed adjacently +will implicitly create fence between them. Fencing also appears between +a post and adjacent concrete block. diff --git a/mods/technic_plus/technic/doc/tools.md b/mods/technic_plus/technic/doc/tools.md new file mode 100644 index 0000000..848ac9b --- /dev/null +++ b/mods/technic_plus/technic/doc/tools.md @@ -0,0 +1,69 @@ +Tools in Technic fall into two categories: manual and electric. Both sets of tools are unstackable in the inventory. Manual tools work similarly to the manual tools in `minetest`, they have limited durability that is reduced during use (they disappear after they hit 0 durability). Manual tools can be regenerated by using the Tool Workshop, so that valuable tools, such as mese or diamond tools can be preserved. Electric tools require charging in Battery Boxes (of any voltage) and will not be destroyed when they reach 0 charge. Higher levels of electric tools are more powerful and contain more charge so they work longer. + +## Chainsaw + + + +This electric tool speeds up harvesting of wood by allowing the harvesting of an entire tree in a single click. Just click on any part of a tree, and the wood and leaves of that tree at that point and above will be cut and dropped on the ground as blocks. It has enough charge to cut down about 5 trees before running out of power. + +**Note:** If you can't find the drops from using the chainsaw, dig around as they can be buried under neighbouring terrain blocks. + +## Flashlight + + + +This electric tool illumates the area in front of the player. While it is electric, and so requires charging, to use it one only needs to equip it. Punching with this tool does nothing. + +## Lava can + + + +The lava can works similarly to the bucket tool and the water can, but instead of carrying water, it can carry lava source blocks (the ones that aren't animated), up to 8 at a time. To use, simply equip and click on lava source blocks (they will highlight in black). Then clicking anywhere where there isn't a lava source block will place them again. + +**Warning:** Be careful where you place these source blocks! Since you're placing lava source blocks, lava will flow out of them and may trap or burn you depending on where you are. + +## Mining drill + + + + + +This electric tool operates similarly to a pickaxe, though every block takes exactly one click to drill out. While the Mining Laser allows for faster collection of bulk minerals, it's cutting path can sometimes be undesirable, and the mining drill is useful in these instances. + +The higher levels of the mining drill allow for drilling more blocks at once, substantially reducing mining time. At mark-2, the mining drill can drill 3 blocks at once, either 3-deep, 3-wide, or 3-tall. At mark-3, the mining drill can drill 9-blocks at once in a 3x3 layout around the block selected. Switching between these modes can be done by shift-clicking. + +**Advice:** Since these tools require substantially more diamonds than the mining laser, and yet drills slower, it is suggested that a mining laser be built first. + +## Mining laser + + + + + +This electric tool is a substantial upgrade above the pickaxe that you start mining with. The laser works by drilling directly forward 7 blocks making a path that's roughly 1-block in diameter. The laser is electric, requiring charging in a battery box (any voltage). As soon as an LV electrical system is set up, this is a great next step. + +## Sonic screwdriver + + + +This electric tool is used for rotating nodes, much like the default Screwdriver tool, but loses charge instead of durability. This is useful for any nodes which have a "front" direction, like stairs, machines, furniture, etc. Nodes are rotated around the Y-axes (vertical). + +## Tree tap + + + +This manual tool allows for harvesting latex from rubber trees. Extracting latex can be done by hitting rubber trees with it yields for 1 latex. The rubber tree will regenerate its latex supply over the course of a day. + +## Water can + + + +The water can works similarly to the bucket tool from minetest_game, but it can hold 16 `water_source` (the water blocks that don't look like they're flowing) blocks instead of 1. To use, simply equip the water can and click on water source blocks (they will highlight in black). Then clicking anywhere where there isn't a `water_source` block with the water can equipped will place them. + +**Warning:** Be careful where you place these source blocks! Since you're placing water source blocks, water will flow out of them and may trap or drown you depending on where you are. + +## Wrench + + + +The manual tool allows for moving blocks which contain an inventory, like chests. A shift-right-click on a machine/chest will immediately add it to the inventory. diff --git a/mods/technic_plus/technic/effects.lua b/mods/technic_plus/technic/effects.lua new file mode 100644 index 0000000..d49398a --- /dev/null +++ b/mods/technic_plus/technic/effects.lua @@ -0,0 +1,25 @@ + + +minetest.register_abm({ + nodenames = {"technic:hv_nuclear_reactor_core_active"}, + interval = 10, + chance = 1, + action = function(pos, node) + minetest.add_particlespawner({ + amount = 50, + time = 10, + minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5}, + maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5}, + minvel = {x=-0.8, y=-0.8, z=-0.8}, + maxvel = {x=0.8, y=0.8, z=0.8}, + minacc = {x=0,y=0,z=0}, + maxacc = {x=0,y=0,z=0}, + minexptime = 0.5, + maxexptime = 2, + minsize = 1, + maxsize = 2, + texture = "blueparticle.png", + glow = 5 + }) + end +}) diff --git a/mods/technic_plus/technic/helpers.lua b/mods/technic_plus/technic/helpers.lua new file mode 100644 index 0000000..88d8cba --- /dev/null +++ b/mods/technic_plus/technic/helpers.lua @@ -0,0 +1,262 @@ +local constant_digit_count = technic.config:get("constant_digit_count") + +-- converts a number to a readable string with SI prefix, e.g. 10000 → "10 k", +-- 15 → "15 ", 0.1501 → "150.1 m" +-- a non-breaking space (U+a0) instead of a usual one is put after number +-- The precision is 4 digits +local prefixes = {[-8] = "y", [-7] = "z", [-6] = "a", [-5] = "f", [-4] = "p", + [-3] = "n", [-2] = "µ", [-1] = "m", [0] = "", [1] = "k", [2] = "M", + [3] = "G", [4] = "T", [5] = "P", [6] = "E", [7] = "Z", [8] = "Y"} +function technic.pretty_num(num) + -- the small number added is due to floating point inaccuracy + local b = math.floor(math.log10(math.abs(num)) +0.000001) + local pref_i + if b ~= 0 then + -- b is decremented by 1 to avoid a single digit with many decimals, + -- e.g. instead of 1.021 MEU, 1021 kEU is shown + pref_i = math.floor((b - 1) / 3) + else + -- as special case, avoid showing e.g. 1100 mEU instead of 1.1 EU + pref_i = 0 + end + if not prefixes[pref_i] then + -- This happens for 0, nan, inf, very big values, etc. + if num == 0 then + -- handle 0 explicilty to avoid showing "-0" + if not constant_digit_count then + return "0 " + end + -- gives 0.000 + return string.format("%.3f ", 0) + end + return string.format("%.4g ", num) + end + + num = num * 10 ^ (-3 * pref_i) + if constant_digit_count then + local comma_digits_cnt = 3 - (b - 3 * pref_i) + return string.format("%." .. comma_digits_cnt .. "f %s", + num, prefixes[pref_i]) + end + return string.format("%.4g %s", num, prefixes[pref_i]) +end + +-- some unittests +assert(technic.pretty_num(-0) == "0 ") +assert(technic.pretty_num(0) == "0 ") +assert(technic.pretty_num(1234) == "1234 ") +assert(technic.pretty_num(123456789) == "123.5 M") + + +-- used to display power values +function technic.EU_string(num) + return technic.pretty_num(num) .. "EU" +end + + +--- Same as minetest.swap_node, but only changes name +-- and doesn't re-set if already set. +function technic.swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name ~= name then + node.name = name + minetest.swap_node(pos, node) + end +end + + +--- Fully charge RE chargeable item. +-- Must be defined early to reference in item definitions. +function technic.refill_RE_charge(stack) + local max_charge = technic.power_tools[stack:get_name()] + if not max_charge then return stack end + technic.set_RE_wear(stack, max_charge, max_charge) + local meta = minetest.deserialize(stack:get_metadata()) or {} + meta.charge = max_charge + stack:set_metadata(minetest.serialize(meta)) + return stack +end + +function technic.set_RE_charge(stack, charge) + local max_charge = technic.power_tools[stack:get_name()] + if max_charge then + technic.set_RE_wear(stack, charge, max_charge) + local meta = minetest.deserialize(stack:get_metadata()) or {} + meta.charge = math.min(math.max(0, charge), max_charge) + stack:set_metadata(minetest.serialize(meta)) + end +end + +technic.set_charge = technic.set_RE_charge + +function technic.get_RE_charge(stack) + local max_charge = technic.power_tools[stack:get_name()] + if max_charge then + local meta = minetest.deserialize(stack:get_metadata()) or {} + return meta.charge or 0, max_charge + end + return 0, 0 +end + +technic.get_charge = technic.get_RE_charge + +function technic.use_RE_charge(stack, amount) + if technic.creative_mode or amount <= 0 then + -- Do not check charge in creative mode or when trying to use zero amount + return true + end + local charge = technic.get_RE_charge(stack) + if charge < amount then + -- Not enough energy available + return false + end + technic.set_RE_charge(stack, charge - amount) + -- Charge used successfully + return true +end + +technic.use_charge = technic.use_RE_charge + +-- If the node is loaded, returns it. If it isn't loaded, load it and return nil. +function technic.get_or_load_node(pos) + local node = minetest.get_node_or_nil(pos) + if node then return node end + local vm = VoxelManip() + local _, _ = vm:read_from_map(pos, pos) + return nil +end + + +technic.tube_inject_item = pipeworks.tube_inject_item or function(pos, start_pos, velocity, item) + local tubed = pipeworks.tube_item(vector.new(pos), item) + tubed:get_luaentity().start_pos = vector.new(start_pos) + tubed:set_velocity(velocity) + tubed:set_acceleration(vector.new(0, 0, 0)) +end + + +--- Iterates over the node positions along the specified ray. +-- The returned positions will not include the starting position. +function technic.trace_node_ray(pos, dir, range) + local x_step = dir.x > 0 and 1 or -1 + local y_step = dir.y > 0 and 1 or -1 + local z_step = dir.z > 0 and 1 or -1 + + local i = 1 + return function(p) + -- Approximation of where we should be if we weren't rounding + -- to nodes. This moves forward a bit faster then we do. + -- A correction is done below. + local real_x = pos.x + (dir.x * i) + local real_y = pos.y + (dir.y * i) + local real_z = pos.z + (dir.z * i) + + -- How far off we've gotten from where we should be. + local dx = math.abs(real_x - p.x) + local dy = math.abs(real_y - p.y) + local dz = math.abs(real_z - p.z) + + -- If the real position moves ahead too fast, stop it so we + -- can catch up. If it gets too far ahead it will smooth + -- out our movement too much and we won't turn fast enough. + if dx + dy + dz < 2 then + i = i + 1 + end + + -- Step in whichever direction we're most off course in. + if dx > dy then + if dx > dz then + p.x = p.x + x_step + else + p.z = p.z + z_step + end + elseif dy > dz then + p.y = p.y + y_step + else + p.z = p.z + z_step + end + if vector.distance(pos, p) > range then + return nil + end + return p + end, vector.round(pos) +end + + +--- Like trace_node_ray, but includes extra positions close to the ray. +function technic.trace_node_ray_fat(pos, dir, range) + local x_step = dir.x > 0 and 1 or -1 + local y_step = dir.y > 0 and 1 or -1 + local z_step = dir.z > 0 and 1 or -1 + + local next_poses = {} + + local i = 1 + return function(p) + local ni, np = next(next_poses) + if np then + next_poses[ni] = nil + return np + end + + -- Approximation of where we should be if we weren't rounding + -- to nodes. This moves forward a bit faster then we do. + -- A correction is done below. + local real_x = pos.x + (dir.x * i) + local real_y = pos.y + (dir.y * i) + local real_z = pos.z + (dir.z * i) + + -- How far off we've gotten from where we should be. + local dx = math.abs(real_x - p.x) + local dy = math.abs(real_y - p.y) + local dz = math.abs(real_z - p.z) + + -- If the real position moves ahead too fast, stop it so we + -- can catch up. If it gets too far ahead it will smooth + -- out our movement too much and we won't turn fast enough. + if dx + dy + dz < 2 then + i = i + 1 + end + + -- Step in whichever direction we're most off course in. + local sx, sy, sz -- Whether we've already stepped along each axis + if dx > dy then + if dx > dz then + sx = true + p.x = p.x + x_step + else + sz = true + p.z = p.z + z_step + end + elseif dy > dz then + sy = true + p.y = p.y + y_step + else + sz = true + p.z = p.z + z_step + end + + if vector.distance(pos, p) > range then + return nil + end + + -- Add other positions that we're significantly off on. + -- We can just use fixed integer keys here because the + -- table will be completely cleared before we reach this + -- code block again. + local dlen = math.sqrt(dx*dx + dy*dy + dz*dz) + -- Normalized axis deltas + local dxn, dyn, dzn = dx / dlen, dy / dlen, dz / dlen + if not sx and dxn > 0.5 then + next_poses[1] = vector.new(p.x + x_step, p.y, p.z) + end + if not sy and dyn > 0.5 then + next_poses[2] = vector.new(p.x, p.y + y_step, p.z) + end + if not sz and dzn > 0.5 then + next_poses[3] = vector.new(p.x, p.y, p.z + z_step) + end + + return p + end, vector.round(pos) +end diff --git a/mods/technic_plus/technic/init.lua b/mods/technic_plus/technic/init.lua new file mode 100644 index 0000000..87cb751 --- /dev/null +++ b/mods/technic_plus/technic/init.lua @@ -0,0 +1,76 @@ +-- Minetest 0.4.7 mod: technic +-- namespace: technic +-- (c) 2012-2013 by RealBadAngel + +local load_start = os.clock() + +technic = rawget(_G, "technic") or {} +technic.creative_mode = minetest.settings:get_bool("creative_mode") + +local modpath = minetest.get_modpath("technic") +technic.modpath = modpath + + +-- Boilerplate to support intllib +if rawget(_G, "intllib") then + technic.getter = intllib.Getter() +else + technic.getter = function(s, a, ...) + if a == nil then + return s + end + a = {a, ...} + return s:gsub( + "(@?)@(%(?)(%d+)(%)?)", + function(e, o, n, c) + if e == "" then + return a[tonumber(n)] .. (o == "" and c or "") + else + return "@" .. o .. n .. c + end + end + ) + end +end +local S = technic.getter + +-- Read configuration file +dofile(modpath.."/config.lua") + +-- Lag monitoring +dofile(modpath.."/max_lag.lua") + +-- Helper functions +dofile(modpath.."/helpers.lua") + +-- Items +dofile(modpath.."/items.lua") + +-- Craft recipes for items +dofile(modpath.."/crafts.lua") + +-- Register functions +dofile(modpath.."/register.lua") + +-- Radiation +dofile(modpath.."/radiation.lua") + +-- Machines +dofile(modpath.."/machines/init.lua") + +-- Tools +dofile(modpath.."/tools/init.lua") + +-- Aliases for legacy node/item names +dofile(modpath.."/legacy.lua") + +-- visual effects +dofile(modpath.."/effects.lua") + +if minetest.settings:get_bool("log_mods") then + print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start)) +end + +if minetest.settings:get_bool("enable_technic_integration_test") then + dofile(modpath.."/integration_test.lua") +end diff --git a/mods/technic_plus/technic/integration_test.lua b/mods/technic_plus/technic/integration_test.lua new file mode 100644 index 0000000..c687a8b --- /dev/null +++ b/mods/technic_plus/technic/integration_test.lua @@ -0,0 +1,56 @@ + +minetest.log("warning", "[technic] integration-test enabled!") + +-- those mods have to be present +local assert_mods = { + "technic", + "pipeworks" +} + +-- those nodes have to be present +local assert_nodes = { + "technic:admin_anchor" +} + +-- defered integration test function +minetest.register_on_mods_loaded(function() + minetest.log("warning", "[technic] all mods loaded, starting delayed test-function") + + minetest.after(1, function() + minetest.log("warning", "[technic] starting integration test") + + -- export stats + local file = io.open(minetest.get_worldpath().."/registered_nodes.txt", "w" ); + if file then + for name in pairs(minetest.registered_nodes) do + file:write(name .. '\n') + end + file:close() + end + + -- check mods + for _, modname in ipairs(assert_mods) do + if not minetest.get_modpath(modname) then + error("Mod not present: " .. modname) + end + end + + -- check nodes + for _, nodename in ipairs(assert_nodes) do + if not minetest.registered_nodes[nodename] then + error("Node not present: " .. nodename) + end + end + + -- write success flag + local data = minetest.write_json({ success = true }, true); + file = io.open(minetest.get_worldpath().."/integration_test.json", "w" ); + if file then + file:write(data) + file:close() + end + + minetest.log("warning", "[technic] integration tests done!") + minetest.request_shutdown("success") + end) +end) diff --git a/mods/technic_plus/technic/items.lua b/mods/technic_plus/technic/items.lua new file mode 100644 index 0000000..cf57229 --- /dev/null +++ b/mods/technic_plus/technic/items.lua @@ -0,0 +1,203 @@ + +local S = technic.getter + +minetest.register_craftitem("technic:silicon_wafer", { + description = S("Silicon Wafer"), + inventory_image = "technic_silicon_wafer.png", +}) + +minetest.register_craftitem( "technic:doped_silicon_wafer", { + description = S("Doped Silicon Wafer"), + inventory_image = "technic_doped_silicon_wafer.png", +}) + +minetest.register_craftitem("technic:uranium_fuel", { + description = S("Uranium Fuel"), + inventory_image = "technic_uranium_fuel.png", +}) + +minetest.register_craftitem( "technic:diamond_drill_head", { + description = S("Diamond Drill Head"), + inventory_image = "technic_diamond_drill_head.png", +}) + +minetest.register_tool("technic:blue_energy_crystal", { + description = S("Blue Energy Crystal"), + inventory_image = minetest.inventorycube( + "technic_diamond_block_blue.png", + "technic_diamond_block_blue.png", + "technic_diamond_block_blue.png"), + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +minetest.register_tool("technic:green_energy_crystal", { + description = S("Green Energy Crystal"), + inventory_image = minetest.inventorycube( + "technic_diamond_block_green.png", + "technic_diamond_block_green.png", + "technic_diamond_block_green.png"), + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +minetest.register_tool("technic:red_energy_crystal", { + description = S("Red Energy Crystal"), + inventory_image = minetest.inventorycube( + "technic_diamond_block_red.png", + "technic_diamond_block_red.png", + "technic_diamond_block_red.png"), + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +minetest.register_craftitem("technic:copper_coil", { + description = S("Copper Coil"), + inventory_image = "technic_copper_coil.png", +}) + +minetest.register_craftitem("technic:lv_transformer", { + description = S("Low Voltage Transformer"), + inventory_image = "technic_lv_transformer.png", +}) + +minetest.register_craftitem("technic:mv_transformer", { + description = S("Medium Voltage Transformer"), + inventory_image = "technic_mv_transformer.png", +}) + +minetest.register_craftitem( "technic:hv_transformer", { + description = S("High Voltage Transformer"), + inventory_image = "technic_hv_transformer.png", +}) + +minetest.register_craftitem( "technic:control_logic_unit", { + description = S("Control Logic Unit"), + inventory_image = "technic_control_logic_unit.png", +}) + +minetest.register_craftitem("technic:mixed_metal_ingot", { + description = S("Mixed Metal Ingot"), + inventory_image = "technic_mixed_metal_ingot.png", +}) + +minetest.register_craftitem("technic:composite_plate", { + description = S("Composite Plate"), + inventory_image = "technic_composite_plate.png", +}) + +minetest.register_craftitem("technic:copper_plate", { + description = S("Copper Plate"), + inventory_image = "technic_copper_plate.png", +}) + +minetest.register_craftitem("technic:carbon_plate", { + description = S("Carbon Plate"), + inventory_image = "technic_carbon_plate.png", +}) + +minetest.register_craftitem("technic:graphite", { + description = S("Graphite"), + inventory_image = "technic_graphite.png", +}) + +minetest.register_craftitem("technic:carbon_cloth", { + description = S("Carbon Cloth"), + inventory_image = "technic_carbon_cloth.png", +}) + +minetest.register_node("technic:machine_casing", { + description = S("Machine Casing"), + groups = {cracky=2}, + sunlight_propagates = true, + paramtype = "light", + drawtype = "allfaces", + tiles = {"technic_machine_casing.png"}, + sounds = default.node_sound_stone_defaults(), +}) + +for p = 0, 35 do + local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil + local psuffix = p == 7 and "" or p + local ingot = "technic:uranium"..psuffix.."_ingot" + local block = "technic:uranium"..psuffix.."_block" + local ov = p == 7 and minetest.override_item or nil; + (ov or minetest.register_craftitem)(ingot, { + description = string.format(S("%.1f%%-Fissile Uranium Ingot"), p/10), + inventory_image = "technic_uranium_ingot.png", + groups = {uranium_ingot=1, not_in_creative_inventory=nici}, + }); + -- Note on radioactivity of blocks: + -- Source: + -- The baseline radioactivity of an isotope is not especially + -- correlated with whether it's fissile (i.e., suitable as + -- reactor fuel). Natural uranium consists mainly of fissile + -- U-235 and non-fissile U-238, and both U-235 and U-238 are + -- significantly radioactive. U-235's massic activity is + -- about 80.0 MBq/kg, and U-238's is about 12.4 MBq/kg, which + -- superficially suggests that 3.5%-fissile uranium should have + -- only 1.19 times the activity of fully-depleted uranium. + -- But a third isotope affects the result hugely: U-234 has + -- massic activity of 231 GBq/kg. Natural uranium has massic + -- composition of 99.2837% U-238, 0.711% U-235, and 0.0053% U-234, + -- so its activity comes roughly 49% each from U-234 and U-238 + -- and only 2% from U-235. During enrichment via centrifuge, + -- the U-234 fraction is concentrated along with the U-235, with + -- the U-234:U-235 ratio remaining close to its original value. + -- (Actually the U-234 gets separated from U-238 slightly more + -- than the U-235 is, so the U-234:U-235 ratio is slightly + -- higher in enriched uranium.) A typical massic composition + -- for 3.5%-fissile uranium is 96.47116% U-238, 3.5% U-235, and + -- 0.02884% U-234. This gives 3.5%-fissile uranium about 6.55 + -- times the activity of fully-depleted uranium. The values we + -- compute here for the "radioactive" group value are based on + -- linear interpolation of activity along that scale, rooted at + -- a natural (0.7%-fissile) uranium block having the activity of + -- 9 uranium ore blocks (due to 9 ingots per block). The group + -- value is proportional to the square root of the activity, and + -- uranium ore has radioactive=1. This yields radioactive=1.0 + -- for a fully-depleted uranium block and radioactive=2.6 for + -- a 3.5%-fissile uranium block. + local radioactivity = math.floor(math.sqrt((1+5.55*p/35) * 18 / (1+5.55*7/35)) + 0.5); + (ov or minetest.register_node)(block, { + description = string.format(S("%.1f%%-Fissile Uranium Block"), p/10), + tiles = {"technic_uranium_block.png"}, + is_ground_content = true, + groups = {uranium_block=1, not_in_creative_inventory=nici, + cracky=1, level=2, radioactive=radioactivity}, + sounds = default.node_sound_stone_defaults(), + }); + if not ov then + minetest.register_craft({ + output = block, + recipe = { + {ingot, ingot, ingot}, + {ingot, ingot, ingot}, + {ingot, ingot, ingot}, + }, + }) + minetest.register_craft({ + output = ingot.." 9", + recipe = {{block}}, + }) + end +end + diff --git a/mods/technic_plus/technic/legacy.lua b/mods/technic_plus/technic/legacy.lua new file mode 100644 index 0000000..6a080e1 --- /dev/null +++ b/mods/technic_plus/technic/legacy.lua @@ -0,0 +1,41 @@ + +-- Aliases to convert from legacy node/item names + +technic.legacy_nodenames = { + ["technic:alloy_furnace"] = "technic:lv_alloy_furnace", + ["technic:alloy_furnace_active"] = "technic:lv_alloy_furnace_active", + ["technic:battery_box"] = "technic:lv_battery_box0", + ["technic:battery_box1"] = "technic:lv_battery_box1", + ["technic:battery_box2"] = "technic:lv_battery_box2", + ["technic:battery_box3"] = "technic:lv_battery_box3", + ["technic:battery_box4"] = "technic:lv_battery_box4", + ["technic:battery_box5"] = "technic:lv_battery_box5", + ["technic:battery_box6"] = "technic:lv_battery_box6", + ["technic:battery_box7"] = "technic:lv_battery_box7", + ["technic:battery_box8"] = "technic:lv_battery_box8", + ["technic:electric_furnace"] = "technic:lv_electric_furnace", + ["technic:electric_furnace_active"] = "technic:lv_electric_furnace_active", + ["technic:grinder"] = "technic:lv_grinder", + ["technic:grinder_active"] = "technic:lv_grinder_active", + ["technic:extractor"] = "technic:lv_extractor", + ["technic:extractor_active"] = "technic:lv_extractor_active", + ["technic:compressor"] = "technic:lv_compressor", + ["technic:compressor_active"] = "technic:lv_compressor_active", + ["technic:hv_battery_box"] = "technic:hv_battery_box0", + ["technic:mv_battery_box"] = "technic:mv_battery_box0", + ["technic:generator"] = "technic:lv_generator", + ["technic:generator_active"] = "technic:lv_generator_active", + ["technic:iron_dust"] = "technic:wrought_iron_dust", + ["technic:enriched_uranium"] = "technic:uranium35_ingot", +} + +for old, new in pairs(technic.legacy_nodenames) do + minetest.register_alias(old, new) +end + +for i = 0, 64 do + minetest.register_alias("technic:hv_cable"..i, "technic:hv_cable") + minetest.register_alias("technic:mv_cable"..i, "technic:mv_cable") + minetest.register_alias("technic:lv_cable"..i, "technic:lv_cable") +end + diff --git a/mods/technic_plus/technic/locale/de.txt b/mods/technic_plus/technic/locale/de.txt new file mode 100644 index 0000000..45ff387 --- /dev/null +++ b/mods/technic_plus/technic/locale/de.txt @@ -0,0 +1,168 @@ +# German Translation for Technic Mod +# Deutsche Uebersetzung des Technic Mods +# by Xanthin + +## Misc +[Technic] Loaded in %f seconds = [Technic] ist in %f Sekunden geladen + +## Items +Silicon Wafer = Siliziumscheibe +Doped Silicon Wafer = Dotierte Siliziumscheibe +Enriched Uranium = Angereichertes Uran +Uranium Fuel = Uranbrennstoff +Diamond Drill Head = Diamantbohrkopf +Blue Energy Crystal = Blauer Energiekristall +Green Energy Crystal = Gruener Energiekristall +Red Energy Crystal = Roter Energiekristall +Fine Copper Wire = Feinkupferdraht +Copper Coil = Kupferspule +Electric Motor = Elektromotor +Low Voltage Transformer = Niederspannungstransformator +Medium Voltage Transformer = Mittelspannungstransformator +High Voltage Transformer = Hochspannungstransformator +Control Logic Unit = Steuer- und Regelungseinheit +Mixed Metal Ingot = Mischmetallbarren +Composite Plate = Verbundplatte +Copper Plate = Kupferplatte +Carbon Plate = Kohlefaserplatte +Graphite = Graphit +Carbon Cloth = Kohlefasergewebe +Raw Latex = Rohlatex +Rubber Fiber = Gummifaser +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +Machine cannot be removed because it is not empty = Die Maschine kann nicht entfernt werden, weil sie noch nicht leer ist. +Inventory move disallowed due to protection = Das Inventar ist geschuetzt, Zugriff verweigert. +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 ist eingeschaltet (@2 EU) +%s Active = %s ist eingeschaltet +%s Disabled = %s ist ausgeschaltet +%s Enabled = +%s Idle = %s ist bereit +%s Improperly Placed = %s ist falsch plaziert +%s Unpowered = %s hat keine Stromversorgung +%s Out Of Fuel = %s hat keinen Brennstoff +%s Has Bad Cabling = %s ist falsch verkabelt +%s Has No Network = %s hat kein Netzwerk +%s Finished = %s ist fertig +Enable/Disable = Einschalten/Ausschalten +Range = Reichweite +Upgrade Slots = Verbesserungsfaecher +In: = Rein: +Out: = Raus: +Slot %d = Fach %d +Itemwise = Einzelstuecke +Stackwise = Ganzer Stapel +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = %s Legierungsofen +%s Battery Box = %s Batteriebox +%s Cable = %s Kabel +%s Compressor = %s Kompressor +%s Extractor = %s Extraktor +%s Forcefield Emitter = %s Kraftfeld-Emitter +%s Furnace = %s Ofen +%s Grinder = %s Schleifmaschine +%s Music Player = %s Musikspieler +%s Quarry = %s Steinbruch +%s Tool Workshop = %s Werkzeugwerkstatt +Arrayed Solar %s Generator = %s Solaranlage +Fuel-Fired %s Generator = %s Kohle-Generator +Geothermal %s Generator = %s Geothermie-Generator +Hydro %s Generator = %s Wassermuehle +Nuclear %s Generator Core = %s Reaktorkern +Small Solar %s Generator = %s Solarmodul +Wind %s Generator = %s Windmuehle +Self-Contained Injector = Selbstversorger-Injektor +Constructor Mk%d = Konstruktor Modell %d +Frame = Rahmen +Frame Motor = Rahmenmotor +Template = Schablone +Template (replacing) = Schablone (ersetzend) +Template motor = Schablonenmotor +Template tool = Schablonenwerkzeug +Battery Box = Batteriebox +Supply Converter = Stromumwandler +Switching Station = Schaltanlage +Fuel-Fired Alloy Furnace = Kohle-Legierungsofen +Fuel-Fired Furnace = Kohle-Ofen +Wind Mill Frame = Windmuehlengeruest +Forcefield = Kraftfeld +Nuclear Reactor Rod Compartment = Brennstabfaecher +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = Aufladen +Discharge = Entladen +Power level = Energiestufe +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = @1 Batteriebox: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Versorgung: @2 Bedarf: @3 +Production at %d%% = Produktion bei %d%% +Choose Milling Program: = Waehle ein Fraesprogramm: +Slim Elements half / normal height: = Schmale Elemente von halber / normaler Hoehe: +Current track %s = Aktueller Titel %s +Stopped = +Keeping %d/%d map blocks loaded = +Digging not started = +Digging finished = +Digging %d m above machine = +Digging %d m below machine = + +## Grinder Recipes +# $1: Name +%s Dust = %sstaub +Akalin = Akalin +Alatro = Alatro +Arol = Arol +Brass = Messing +Bronze = Bronze +Carbon Steel = Kohlenstoffstahl +Cast Iron = Gusseisen +Chromium = Chrom +Coal = Kohle +Copper = Kupfer +Gold = Gold +Mithril = Mithril +Silver = Silber +Stainless Steel = Edelstahl +Talinite = Talinite +Tin = Zinn +Wrought Iron = Schmiedeeisen +Zinc = Zink +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = Akkubatterie +Water Can = Wasserkanister +Lava Can = Lavakanister +Chainsaw = Kettensaege +Flashlight = Taschenlampe +3 nodes deep. = 3 Bloecke tief. +3 nodes tall. = 3 Bloecke hoch. +3 nodes wide. = 3 Bloecke breit. +3x3 nodes. = 3x3 Bloecke. +Use while sneaking to change Mining Drill Mk%d modes. = Halte die Shift-Taste beim Benutzen gedrueckt, um die Funktion des Bergbaubohrers Modell %d zu aendern. +Mining Drill Mk%d Mode %d = Bergbaubohrer Modell %d Funktion %d +Mining Drill Mk%d = Bergbaubohrer Modell %d +Mining Laser Mk%d = Bergbaulaser Modell %d +Single node. = Einzelblock +Sonic Screwdriver = Schallschraubendreher +Tree Tap = Baumzapfhahn + +## Craft descriptions +Alloy cooking = +Grinding = +Compressing = +Extracting = diff --git a/mods/technic_plus/technic/locale/es.txt b/mods/technic_plus/technic/locale/es.txt new file mode 100644 index 0000000..fa66988 --- /dev/null +++ b/mods/technic_plus/technic/locale/es.txt @@ -0,0 +1,162 @@ +# Spanish Translation for Technic Mod +# Traduccion al Español del Mod Technic +# Autor: Diego Martínez + +## Misc +[Technic] Loaded in %f seconds = [Technic] Cargado en %f segundos + +## Items +Silicon Wafer = Oblea de Silicio +Doped Silicon Wafer = Oblea de Silicio Dopada +Enriched Uranium = Uranio Enriquecido +Uranium Fuel = Combustible de Uranio +Diamond Drill Head = Mecha de Taladro de Diamante +Blue Energy Crystal = Cristal de Energia Azul +Green Energy Crystal = Cristal de Energia Verde +Red Energy Crystal = Cristal de Energia Rojo +Fine Copper Wire = Cable Fino de Cobre +Copper Coil = Resorte de Cobre +Electric Motor = Motor Electrico +Low Voltage Transformer = Transformador de Bajo Voltaje +Medium Voltage Transformer = Transformador de Voltaje Medio +High Voltage Transformer = Transformador de Alto Voltaje +Control Logic Unit = Unidad Logica de Control +Mixed Metal Ingot = Lingote de Metal Mezclado +Composite Plate = Placa de Compuestos +Copper Plate = Placa de Cobre +Carbon Plate = Placa de Carbon +Graphite = Grafito +Carbon Cloth = Tela de Carbon +Raw Latex = Latex Crudo +Rubber Fiber = Fibra de Hule +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +Machine cannot be removed because it is not empty = La maquina no puede removerse porque no esta vacia +Inventory move disallowed due to protection = +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 Activo (@2 EU) +%s Active = %s Activo +%s Enabled = +%s Idle = %s Quieto +%s Unpowered = %s Sin Energia +%s Out Of Fuel = %s Sin Combustible +%s Has Bad Cabling = %s Tiene Mal Cableado +%s Has No Network = %s No Tiene Una Red +%s Finished = %s Terminado +%s Disabled = %s Deshabilitado +%s Improperly Placed = %s No Colocado Apropiadamente +Range = Alcance +Enable/Disable = Habilitar/Deshabilitar +Itemwise = +Stackwise = +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = Horno de Aleacion %s +%s Battery Box = Caja de Bateria %s +%s Cable = Cable %s +%s Compressor = Compresor %s +%s Extractor = Extractor %s +%s Forcefield Emitter = Emisor de Campo de Fuerza %s +%s Furnace = Horno %s +%s Grinder = Amoladora %s +%s Music Player = Reproductor de Musica %s +%s Quarry = Cantera %s +%s Tool Workshop = Taller de Herramientas %s +Arrayed Solar %s Generator = Panel Solar %s +Fuel-Fired %s Generator = Generador a Carbon %s +Geothermal %s Generator = Generador Geotermico %s +Hydro %s Generator = Molino de Agua %s +Nuclear %s Generator Core = Nucleo de Reactor Nuclear %s +Small Solar %s Generator = Panel Solar %s +Wind %s Generator = Molino de Viento %s +Self-Contained Injector = +Constructor Mk%d = +Frame = +Frame Motor = +Template = +Template (replacing) = +Template Motor = +Template Tool = +Supply Converter = Convertidor de Alimentacion +Switching Station = Estacion de Conmutacion +Battery Box = Caja de Baterias +Fuel-Fired Alloy Furnace = Horno de Aleacion a Carbon +Fuel-Fired Furnace = Horno a Carbon +Forcefield = Campo de Fuerza +Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear +Wind Mill Frame = Armazon de Molino de Viento +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = Cargar +Discharge = Descargar +Power level = Nivel de Poder +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = Caja de Bateria @1: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Alimentacion: @2 Demanda: @3 +# $1: Production percent +Production at %d%% = Produccion en %d%% +Stopped = +Keeping %d/%d map blocks loaded = +Digging not started = +Digging finished = +Digging %d m above machine = +Digging %d m below machine = + +## Grinder Recipes +# $1: Name +%s Dust = Polvo de %s +Akalin = Akalina +Alatro = Alatro +Arol = Arol +Brass = Laton +Bronze = Bronce +Carbon Steel = Acero al Carbono +Cast Iron = Hierro Fundido +Chromium = Cromo +Coal = Carbon +Copper = Cobre +Gold = Oro +Mithril = Mitrilo +Silver = Plata +Stainless Steel = Acero Inoxidable +Talinite = Talinita +Tin = Estanio +Wrought Iron = Hierro Forjado +Zinc = Zinc +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = +Water Can = Bidon de Agua +Lava Can = Bidon de Lava +Chainsaw = Motosierra +Flashlight = Linterna +3 nodes deep. = 3 nodos de profundo. +3 nodes tall. = 3 nodos de alto. +3 nodes wide. = 3 nodos de ancho. +3x3 nodes. = 3x3 nodos. +Use while sneaking to change Mining Drill Mk%d modes. = Manten pulsado Mayus y Usar para cambiar el modo del Taladro de Mineria Mk%d. +Mining Drill Mk%d Mode %d = Taladro de Mineria Mk%d Modo %d +Mining Drill Mk%d = Taladro de Mineria Mk%d +Mining Laser Mk%d = Laser de Mineria Mk%d +Single node. = Nodo simple. +Sonic Screwdriver = Destonillador Sonico +Tree Tap = Grifo de Arbol + +## Craft descriptions +Alloy cooking = +Grinding = +Compressing = +Extracting = diff --git a/mods/technic_plus/technic/locale/fr.txt b/mods/technic_plus/technic/locale/fr.txt new file mode 100644 index 0000000..6fc8dd4 --- /dev/null +++ b/mods/technic_plus/technic/locale/fr.txt @@ -0,0 +1,215 @@ +# template.txt +# Template for translations of Technic + +## Misc +[Technic] Loaded in %f seconds = [Technic] Chargement en %f secondes + +## Items +Silicon Wafer = Tranche de silicium +Doped Silicon Wafer = Tranche de silicium doppée +Enriched Uranium = Uranium enrichi +Uranium Fuel = Uranium 235 +Diamond Drill Head = Tête de forage en diamant +Blue Energy Crystal = Cristal d'énergie bleu +Green Energy Crystal = Cristal d'énergie vert +Red Energy Crystal = Cristal d'énergie rouge +Fine Copper Wire = Fil en cuivre fin +Fine Gold Wire = Fil en or fin +Fine Silver Wire = Fil en argent fin +Copper Coil = Bobine de cuivre +Electric Motor = Moteur électrique +Low Voltage Transformer = Transformateur basse tension +Medium Voltage Transformer = Transformateur moyenne tension +High Voltage Transformer = Transformateur haute tension +Control Logic Unit = Unité de contrôle logique +Mixed Metal Ingot = Lingot de métal allié +Composite Plate = Plaque composite +Copper Plate = Plaque de cuivre +Carbon Plate = Plaque de carbone +Graphite = Graphite +Carbon Cloth = Fibre de carbone +Raw Latex = Latex brut +Rubber Fiber = Fibre de caoutchouc +%.1f%%-Fissile Uranium Ingot = Lingot d'uranium fissile (%.1f%%) +%.1f%%-Fissile Uranium Block = Bloc d'uranium fissile (%.1f%%) + +## Machine misc +Machine cannot be removed because it is not empty = La machine ne peut pas être retirée car elle n'est pas vide +Inventory move disallowed due to protection = Le mouvement d'inventaire n'est pas autorisé en raison de la protection + +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 Active (@2 EU) +%s Active = %s actif +%s Disabled = %s désactivé +%s Enabled = %s activé +%s Idle = %s au repos +%s Improperly Placed = %s est mal placé +%s is empty = %s est vide +%s Unpowered = %s non alimenté en énergie +%s Out Of Fuel = %s plus de carburant +%s Has Bad Cabling = %s est mal cablé +%s (Slave) = %s (esclave) +%s Has No Network = %s n'a pas de réseau +%s Finished = %s a fini +Enable/Disable = Activer/Désactiver +Range = Plage +Upgrade Slots = Emplacement d'amélioration +In: = Entrée : +Out: = Sortie : +Slot %d = Emplacement %d +Itemwise = Item par Item +Stackwise = Stack par Stack +Ignoring Mesecon Signal = Ignorer le signal Mesecon +Controlled by Mesecon Signal = Contrôlé par signal Mesecon +Owner: = Propriétaire : +Unlocked = Déverrouillé +Locked = Verrouillé +Radius: = Rayon : +Enabled = Activé +Disabled = Désactivé + +## Machine names +# $1: Tier +%s Alloy Furnace = Four à alliage %s +%s Battery Box = Batterie %s +%s Cable = Câble %s +%s CNC Machine = Machine-outils %s +%s Centrifuge = Centrifugeuse %s +%s Compressor = Compresseur %s +%s Extractor = Extracteur %s +%s Forcefield Emitter = Emetteur de champ de force %s +%s Furnace = Four %s +%s Grinder = Broyeur %s +%s Music Player = Grammophone %s +%s Quarry = Carrière %s +%s Tool Workshop = Atelier d'outillage %s +Arrayed Solar %s Generator = Générateur solaire %s +Fuel-Fired %s Generator = Générateur thermique %s +Geothermal %s Generator = Géénarteur géothermique %s +Hydro %s Generator = Générateur hydroélectrique %s +Nuclear %s Generator Core = Générateur nucléaire % +Small Solar %s Generator = Petit générateur solaire %s +Wind %s Generator = Générateur éolien %s +Self-Contained Injector = Injecteur autonome +Constructor Mk%d = Constructeur Mk%d +Frame = Cadre +Frame Motor = Cadre de moteur +Template = Modèle +Template (replacing) = +Template Motor = +Template Tool = +Battery Box = Compartiment à batterie +Supply Converter = Convertisseur de tension +Switching Station = Station de commutation +Fuel-Fired Alloy Furnace = Four à alliage à carburant +Fuel-Fired Furnace = Four à carburant +Wind Mill Frame = Cadre d'éolienne +Forcefield = Champ de force +Nuclear Reactor Rod Compartment = Compartiment à barres du réacteur nucléaire +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = Charger +Discharge = Décharger +Power level = Niveau d'énergie + +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = @1 batterie : @2/@3 + +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. fournit : @2 demande : @3 +Production at %d%% = Production à %d%% +Choose Milling Program: = Choisissez le programme de fraisage : +Slim Elements half / normal height: = +Current track %s = Morceau actuel %s +Stopped = Arrêté +Keeping %d/%d map blocks loaded = +Digging not started = Creusement non démarré +Digging finished = Creusement terminé +Digging %d m above machine = Creusement à %dm au dessus de la machine +Digging %d m below machine = Creusement à %dm en dessous de la machine +@1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5) + +## CNC +Cylinder = +Element Cross = Elément croisé +Element Cross Double = Elément croisé (double) +Element Edge = Elément de bordure +Element Edge Double = Elément de bordure (double) +Element End = Elément de fin +Element End Double = Elément de fin (double) +Element Straight = Elément droit +Element Straight Double = Elément droit (double) +Element T = Elément en T +Element T Double = Elément en T (double) +Horizontal Cylinder = Cylindre horizontal +One Curved Edge Block = Bloc à un bord incurvé +Pyramid = Pyramide +Slope = Pente +Slope Edge = +Slope Inner Edge = +Slope Lying = +Slope Upside Down = +Slope Upside Down Edge = +Slope Upside Down Inner Edge = +Sphere = Sphère +Spike = Pointe +Stick = Bâton +Two Curved Edge Block = Bloc à deux bords incurvés +Brick = Brique +Cobble = Pierre taillée +Dirt = Terre +Leaves = Feuilles +Sandstone = Grès +Stone = Pierre +Tree = Arbre +Wooden = Bois + +## Grinder Recipes +# $1: Name +%s Dust = Poudre de %s +Akalin = +Alatro = +Arol = +Brass = Laiton +Bronze = Bronze +Carbon Steel = Acier au carbone +Cast Iron = Fonte +Chromium = Chrome +Coal = Charbon +Copper = Cuivre +Gold = Or +Mithril = Mithril +Silver = Argent +Stainless Steel = Acier inoxydable +Talinite = Talanite +Tin = Etain +Wrought Iron = Fer +Zinc = Zinc +%.1f%%-Fissile Uranium = Uranium fissile (%.1f%%) + +## Tools +RE Battery = Batterie RE +Water Can = Jerrycan d'eau +Lava Can = Jerrycan de lave +Chainsaw = Tronçonneuse +Flashlight = Lampe-torche +3 nodes deep. = +3 nodes tall. = +3 nodes wide. = +3x3 nodes. = +Use while sneaking to change Mining Drill Mk%d modes. = +Mining Drill Mk%d Mode %d = Foreuse Mk%d Mode %d +Mining Drill Mk%d = Foreuse Mk%d +Mining Laser Mk%d = Foreuse laser Mk%d +Single node. = Mode simple. +Sonic Screwdriver = Tournevis supersonique +Tree Tap = Robinet à sève + +## Craft descriptions +Alloy cooking = Fonderie d'alliage +Grinding = Broyage +Compressing = Compression +Extracting = Extraction +Separating = Séparation diff --git a/mods/technic_plus/technic/locale/it.txt b/mods/technic_plus/technic/locale/it.txt new file mode 100644 index 0000000..18b0e4f --- /dev/null +++ b/mods/technic_plus/technic/locale/it.txt @@ -0,0 +1,165 @@ + +## Misc +[Technic] Loaded in %f seconds = [Technic] caricato in %f secondi + +## Items +Silicon Wafer = Wafer di silicone +Doped Silicon Wafer = Wafer di silicone dopato +Enriched Uranium = Uranio arricchito +Uranium Fuel = Uranio Combustibile +Diamond Drill Head = Trivella diamantata +Blue Energy Crystal = Cristallo energetico blu +Green Energy Crystal = Cristallo energetico verde +Red Energy Crystal = Cristallo energetico rosso +Fine Copper Wire = Filo di rame fine +Copper Coil = Bobina di rame +Electric Motor = Motore elettrico +Low Voltage Transformer = Trasformatore in bassa tensione +Medium Voltage Transformer = Trasformatore in media tensione +High Voltage Transformer = Trasformatore in alta tensione +Control Logic Unit = Unità di controllo logica +Mixed Metal Ingot = Lingotto in lega ibrida +Composite Plate = Lastra composita +Copper Plate = Lastra di rame +Carbon Plate = Lastra in carbonio +Graphite = Lastra in graffite +Carbon Cloth = Fibra di carbonio +Raw Latex = Latex grezzo +Rubber Fiber = Fibra di gomma +%.1f%%-Fissile Uranium Ingot = %.1f%%-Lingotto di uranio fissile +%.1f%%-Fissile Uranium Block = %.1f%%-Blocco di uranio fissile + +## Machine misc +Machine cannot be removed because it is not empty = La macchina non può essere rimossa perchè non è vuota +Inventory move disallowed due to protection = Impossibile muovere l'inventario a causa della protezione +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 Attivo (@2 EU) +%s Active = %s Attivo +%s Disabled = %s Disabilitato +%s Enabled = %s Abilitato +%s Idle = %s Inattivo +%s Improperly Placed = %s Piazzato impropiamente +%s Unpowered = %s Non alimentato +%s Out Of Fuel = %s senza carburante +%s Has Bad Cabling = %s ha un cablaggio scorretto +%s Has No Network = %s non è collegata +%s Finished = %s Finito +Enable/Disable = Abilita/Disabilita +Range = Raggio +Upgrade Slots = Alloggi di aggiornamento +In: = Ingresso: +Out: = Uscita: +Slot %d = Alloggio %d +Itemwise = Singolo elemento +Stackwise = pila completa +Owner: = Proprietario: +Unlocked = Non chiuso a chiave +Locked = Chiuso a chiave +Radius: = Raggio: +Enabled = Abilitato +Disabled = Disabilitato + +## Machine names +# $1: Tier +%s Alloy Furnace = %s Fornace per leghe +%s Battery Box = %s Box batterie +%s Cable = Cavo %s +%s Compressor = Compressore %s +%s Extractor = Estrattore %s +%s Forcefield Emitter = Emettitore di campo di forza %s +%s Furnace = %s Fornace +%s Grinder = %s Tritatutto +%s Music Player = Music Player %s +%s Quarry = Cava %s +%s Tool Workshop = Officina per attrezzi %s +Arrayed Solar %s Generator = %s Pannello Solare +Fuel-Fired %s Generator = %s Generatore a carbone +Geothermal %s Generator = %s Generatore Geotermico +Hydro %s Generator = Turbina Elettrica %s +Nuclear %s Generator Core = Reattore nucleare %s +Small Solar %s Generator = %s Pannello solare +Wind %s Generator = %s Generatore eolico +Self-Contained Injector = Ignettore +Constructor Mk%d = Costruttore Mk%d +Frame = Cornice +Frame Motor = Cornice del motore +Template = Sagoma +Template (replacing) = Sagoma (di rimpiazzo) +Template Motor = Motore per sagome +Template Tool = Strumento per sagome +Battery Box = Box batterie +Supply Converter = Trasformatore +Switching Station = Stazione di controllo +Fuel-Fired Alloy Furnace = Fornace per leghe a carbone +Fuel-Fired Furnace = Fornace a carbone +Wind Mill Frame = Pala eolica +Forcefield = Campo di forza +Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare +Administrative World Anchor = Ancora-mondo amministrativa + +## Machine-specific +# $1: Pruduced EU +Charge = Carica +Discharge = Scarica +Power level = Livello di potenza +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = @1 Box Batterie: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Prodotto: @2 Consumato: @3 +Production at %d%% = Produzione a %d%% +Choose Milling Program: = Scegliere un programma di Fresatura +Slim Elements half / normal height: = Metà elementi sottili / altezza normale: +Current track %s = Traccia corrente %s +Stopped = Fermato +Keeping %d/%d map blocks loaded = Mantenimento di %d/%d blocchi mappa caricati +Digging not started = Scavo non iniziato +Digging finished = Scavo finito +Digging %d m above machine = Scavo di %d m sopra la macchina +Digging %d m below machine = Scavo di %d m sotto la macchina + +## Grinder Recipes +# $1: Name +%s Dust = Polvere di %s +Akalin = Alcalino +Alatro = Alatro +Arol = Arol +Brass = Ottone +Bronze = Bronzo +Carbon Steel = Acciaio al Carbonio +Cast Iron = Ghisa +Chromium = Cromo +Coal = Carbone +Copper = Rame +Gold = Oro +Mithril = Mithril +Silver = Argento +Stainless Steel = Acciaio Inossidabile +Talinite = Talinite +Tin = Stagno +Wrought Iron = Ferro Battuto +Zinc = Zinco +%.1f%%-Fissile Uranium = %.1f%%-Uranio fissile + +## Tools +RE Battery = Batteria RE +Water Can = Serbatoio d'acqua +Lava Can = Serbatoio di lava +Chainsaw = Motosega +Flashlight = Torcia +3 nodes deep. = 3 nodi in profondità. +3 nodes tall. = 3 nodi in altezza. +3 nodes wide. = 3 nodi in larghezza. +3x3 nodes. = 3x3 nodi. +Use while sneaking to change Mining Drill Mk%d modes. = Premi shift (freccia grossa) e usa per cambiare modalità nella trivella da miniera Mk%d. +Mining Drill Mk%d Mode %d = Trivella mk%d in modalità %d +Mining Drill Mk%d = Trivella da miniera mk%d +Mining Laser Mk%d = Laser da miniera mk%d +Single node. = Nodo singolo. +Sonic Screwdriver = Cacciavite sonico +Tree Tap = Batti albero + +## Craft descriptions +Alloy cooking = Cottura lege +Grinding = Macinazione +Compressing = Compressione +Extracting = Estrazione diff --git a/mods/technic_plus/technic/locale/pl.txt b/mods/technic_plus/technic/locale/pl.txt new file mode 100644 index 0000000..663f807 --- /dev/null +++ b/mods/technic_plus/technic/locale/pl.txt @@ -0,0 +1,175 @@ +# Polish Translation for Technic mod +# Polskie tłumaczenie Technic mod +# by mat9117 + +## Misc +[Technic] Loaded in %f seconds = [Technic] Wczytany w %f sekund + +## Items +Silicon Wafer = Płytka krzemowa +Doped Silicon Wafer = Domieszkowana płytka krzemowa +Enriched Uranium = Wzbogacony uran +Uranium Fuel = Paliwo uranowe +Diamond Drill Head = Diamentowa głowica wiertła +Blue Energy Crystal = Niebieski kryształ energii +Green Energy Crystal = Zielony kryształ energii +Red Energy Crystal = Czerwony kryształ energii +Fine Copper Wire = Cienki miedziany drut +Copper Coil = Miedziana cewka +Electric Motor = Silnik elektryczny +Low Voltage Transformer = Transformator niskiego napięcia +Medium Voltage Transformer = Transformator średniego napięcia +High Voltage Transformer = Transformator wysokiego napięcia +Control Logic Unit = Jednostka sterująca +Mixed Metal Ingot = Sztabka zmieszanych metali +Composite Plate = Płytka kompozytowa +Copper Plate = Płytka miedziana +Carbon Plate = Płytka węglowa +Graphite = Grafit +Carbon Cloth = Włókno węglowe +Raw Latex = Lateks naturalny +Rubber Fiber = Włókno gumowe +%.1f%%-Fissile Uranium Ingot = %.1f%% Sztabka uranu +%.1f%%-Fissile Uranium Block = %.1f%% Blok uranu + +## Machine misc +Machine cannot be removed because it is not empty = Nie można usunąć maszyny, ponieważ nie jest pusta +Inventory move disallowed due to protection = Przenoszenie rzeczy z ekwipunku niemożliwe z powodu ochrony +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = @1 Aktywny (@2 EU) +%s Active = %s Aktywny/a +%s Disabled = %s Wyłączony/a +%s Enabled = %s Włączony/a +%s Idle = %s Bezczynny/a +%s Improperly Placed = %s Ustawiony/a nieprawidłowo +%s is empty = %s jest pusty/a +%s Unpowered = %s brak zasilania +%s Out Of Fuel = %s brak paliwa +%s Has Bad Cabling = %s Źle podłączono kable +%s (Slave) = +%s Has No Network = %s Nie podłączony/a do sieci +%s Finished = %s Ukończony +Enable/Disable = Włącz/Wyłącz +Range = Zasięg +Upgrade Slots = Miejsca na ulepszenia +In: = Wejście +Out: = Wyjście +Slot %d = Otwór %d +Itemwise = Jeden przedmiot +Stackwise = Cały stack +Ignoring Mesecon Signal = Ignoruj sygnał Mesecon +Controlled by Mesecon Signal = Sterowany sygnałem Mesecon +Owner: = Właściciel: +Unlocked = Odblokowany/a +Locked = Zablokowany/a +Radius: = Promień: +Enabled = Włączony/a +Disabled = Wyłączony/a + +## Machine names +# $1: Tier +%s Alloy Furnace = %s Piec stopowy +%s Battery Box = %s Skrzynka baterii +%s Cable = %s Przewód +%s Centrifuge = %s Centryfuga +%s Compressor = %s Kompresor +%s Extractor = %s Ekstraktor +%s Forcefield Emitter = %s Emiter pola siłowego +%s Furnace = %s Piec +%s Grinder = %s Młynek +%s Music Player = %s Odtwarzacz muzyki +%s Quarry = %s Kamieniołom +%s Tool Workshop = %s Warsztat narzędzi +Arrayed Solar %s Generator = %s Szeregowy generator słoneczny +Fuel-Fired %s Generator = %s Generator zasilany paliwem +Geothermal %s Generator = %s Generator geotermalny +Hydro %s Generator = %s Hydrogenerator +Nuclear %s Generator Core = %s Reaktor atomowy +Small Solar %s Generator = %s Mały generator słoneczny +Wind %s Generator = %s Generator wiatrowy +Self-Contained Injector = Samowystarczalny wtryskiwacz +Constructor Mk%d = Konstruktor Mk%d +Frame = Klatka +Frame Motor = Silnik klatkowy +Template = Szablon +Template (replacing) = Szablon (zastępczy) +Template Motor =Szablon silnika +Template Tool = Szablon narzędzia +Battery Box = Skrzynka baterii +Supply Converter = Konwerter zasilania +Switching Station = Rozdzielnia +Fuel-Fired Alloy Furnace = Piec stopowy zasilany paliwem +Fuel-Fired Furnace = Piec zasilany paliwem +Wind Mill Frame = Klatka wiatraka +Forcefield = Pole siłowe +Nuclear Reactor Rod Compartment = Komora rdzenia reaktora atomowego +Administrative World Anchor = Administracyjna kotwica świata + +## Machine-specific +# $1: Pruduced EU +Charge = Ładuj +Discharge = Rozładuj +Power level = Poziom zasilania +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = @1 Skrzynka baterii: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Zapas: @2 Pobór: @3 +Production at %d%% = Produkowanie w %d%% +Choose Milling Program: = Wybierz program mielenia: +Slim Elements half / normal height: = Małe elementy połowa / normalna wysokość: +Current track %s = +Stopped = Zatrzymany/a +Keeping %d/%d map blocks loaded = Ciągle ładuję %d/%d bloki mapy +Digging not started = Nie rozpoczęto kopania +Digging finished = Kopanie skończone +Digging %d m above machine = Kopię %d m nad maszyną +Digging %d m below machine = Kopię %d m pod maszyną +@1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5) + +## Grinder Recipes +# $1: Name +%s Dust = %s Pył +Akalin = Akalinowy +Alatro = Alatrowy +Arol = Arolowy +Brass = Mosiądzu +Bronze = Brązu +Carbon Steel = Stali węglowej +Cast Iron = Żeliwa +Chromium = Chromu +Coal = Węglowy +Copper = Miedzi +Gold = Złoty +Mithril = Mithrilu +Silver = Srebrny +Stainless Steel = Stali nierdzewnej +Talinite = Talinitu +Tin = Cyny +Wrought Iron = Kutego żelaza +Zinc = Cynku +%.1f%%-Fissile Uranium = %.1f%% Uranu + +## Tools +RE Battery = Bateria ładowalna +Water Can = Kanister wody +Lava Can = Kanister lawy +Chainsaw = Piła łańcuchowa +Flashlight = Latarka +3 nodes deep. = Głęboki na 3 bloki. +3 nodes tall. = Wysoki na 3 bloki. +3 nodes wide. = Szeroki na 3 bloki. +3x3 nodes. = 3x3 bloki. +Use while sneaking to change Mining Drill Mk%d modes. = Użyj podczas skradania, aby zmienić tryby wiertła górniczego Mk%d +Mining Drill Mk%d Mode %d = Tryb wiertła górniczego Mk%d +Mining Drill Mk%d = Wiertło górnicze Mk%d +Mining Laser Mk%d = Laser górniczy Mk%d +Single node. = Pojedynczy blok. +Sonic Screwdriver = Dźwiękowy śrubokręt +Tree Tap = Nacinak drzewny + +## Craft descriptions +Alloy cooking = Stapianie +Grinding = Mielenie +Compressing = Kompresowanie +Extracting = Ekstrakcja +Separating = Oddzielanie diff --git a/mods/technic_plus/technic/locale/pt_BR.txt b/mods/technic_plus/technic/locale/pt_BR.txt new file mode 100644 index 0000000..7baa4a5 --- /dev/null +++ b/mods/technic_plus/technic/locale/pt_BR.txt @@ -0,0 +1,211 @@ +# Braziliam portuguese translation for technic +# Tradução portuguesa brasileira para technic +# By Sires + +## Misc +[Technic] Loaded in %f seconds = [Technic] Carregado em %f segundos + +## Items +Silicon Wafer = Pastilha de Silício +Doped Silicon Wafer = Pastilha de Silício Dopada +Enriched Uranium = Urânio Enriquecido +Uranium Fuel = Combustivel de Urânio +Diamond Drill Head = Cabeça de Broca de Diamante +Blue Energy Crystal = Cristal de Energia Azul +Green Energy Crystal = Cristal de Energia Verde +Red Energy Crystal = Cristal de Energia Vermelho +Fine Copper Wire = Fio Fino de Cobre +Copper Coil = Bobina de Cobre +Electric Motor = Motor Elétrico +Low Voltage Transformer = Transformador de Baixa Voltagem +Medium Voltage Transformer = Transformador de Média Voltagem +High Voltage Transformer = Transformador de Alta Voltagem +Control Logic Unit = Unidade de Controle Lógico +Mixed Metal Ingot = Lingote de Metal Misturado +Composite Plate = Placa Composta +Copper Plate = Placa de Cobre +Carbon Plate = Placa de Carbono +Graphite = Grafite +Carbon Cloth = Recido de Carbono +Raw Latex = Latex bruto +Rubber Fiber = Fibra de Borracha +%.1f%%-Fissile Uranium Ingot = Lingote de Urânio %.1f%%-Físsil +%.1f%%-Fissile Uranium Block = Bloco de Urânio %.1f%%-Físsil + +## Machine Misc +Machine cannot be removed because it is not empty = A máquina não pode ser removida porque ela não está vazia +Inventory move disallowed due to protection = Movimento de inventário não permitido pela proteção +# $1: Machine name (includes tier) +@1 Active (@2 EU) = @1 Ativo (@2 EU) +%s Active = %s Ativo +%s Disabled = %s Ativado +%s Enabled = %s Desativado +%s Idle = Ócio +%s Improperly Placed = %s Colocado Inapropriadamente +%s is empty = %s está vazio +%s Unpowered = %s Sem energia +%s Out Of Fuel = %s Sem Combustível +%s Has Bad Cabling = %s Tem Cabeamento Ruim +%s (Slave) = %s (Servo) +%s Has No Network = %s Não Tem Rede +%s Finished = %s Acabou +Enable/Disable = Ativar/Desativar +Range = Alcance +Upgrade Slots = Lugares para Melhoria +In: = Entrada: +Out: = Saída: +Slot %d = Lugar %d +Itemwise = Por item +Stackwise = Por pilha +Ignoring Mesecon Signal = Ignorar Sinaal de Mesecon +Controlled by Mesecon Signal = Controlado por Sinal de Mesecon +Owner: = Dono: +Unlocked = Destravado +Locked = Travado +Radius: = Raio: +Enabled = Ativado +Disabled = Desativado + +## Machine names +# $1: Tier +%s Alloy Furnace = Fornalha de Liga %s +%s Battery Box = Caixa de Bateria %s +%s Cable = Cabo %s +%s CNC Machine = Máquina CNC %s +%s Centrifuge = Centrifuga %s +%s Compressor = Compresso %s +%s Extractor = Extrator %s +%s Forcefield Emitter = Emissor de Campo de Força %s +%s Furnace = Fornalha %s +%s Grinder = Triturador %s +%s Music Player = Tocador de Música %s +%s Quarry = Pedreira %s +%s Tool Workshop = Oficina de Ferramentas %s +Arrayed Solar %s Generator = Gerador Solar Equipado %s +Fuel-Fired %s Generator = Gerador Alimentado-por-Combustível %s +Geothermal %s Generator = Gerador Geotermal %s +Hydro %s Generator = Gerador Hidráulico %s +Nuclear %s Generator Core = Núcleo de Gerador Nuclear %s +Small Solar %s Generator = Gerador Solar Pequeno %s +Wind %s Generator = Gerador de Energia Eólica %s +Self-Contained Injector = Injetor Auto-Contido +Constructor Mk%d = Construtor Nv%d +Frame = Armação +Frame Motor = Motor de Armação +Template = Modelo +Template (replacing) = Modelo (recolocando) +Template Motor = Modelo de Motor +Template Tool = Modelo de Ferramenta +Battery Box = Caixa de Bateria +Supply Converter = Conversor de Energia +Switching Station = Estação de Comutação +Fuel-Fired Alloy Furnace = Fornalha de Liga Alimentada-por-Combustível +Fuel-Fired Furnace = Fornalha Alimentada-por-Combustível +Wind Mill Frame = Armação de Moinho de Vento +Forcefield = Campo de Força +Nuclear Reactor Rod Compartment = Compartimento de Barra do Reator Nuclear +Administrative World Anchor = Âncora de Mundo Administrativa + +## Machine-specific +# $1: Pruduced EU +Charge = Carregar +Discharge = Descarregar +Power level = Nível de Energia +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = Caixa de Baterias @1: @2/@3 +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = @1. Suprimento: @2 Demanda: @3 +Production at %d%% = Produção em %d%% +Choose Milling Program: = Escolha o Programa de Serragem: +Slim Elements half / normal height: = Metade de Elementos Finos / altura normal: +Current track %s = Música Atual %s +Stopped = Parado +Keeping %d/%d map blocks loaded = Mantendo %d/%d blocos de mapa carregados +Digging not started = Escavação não começada +Digging finished = Escavação terminada +Digging %d m above machine = Escavando %d m acima da máquina +Digging %d m below machine = Escavando %d m abaixo da máquina +@1 (@2 @3 -> @4 @5) = @1 (@2 @3 -> @4 @5) + +## CNC +Cylinder = Cilindro +Element Cross = Cruz do Elemento +Element Cross Double = Cruz Dupla do Elemento +Element Edge = Borda do Elemento +Element Edge Double = Borda Dupla do Elemento +Element End = Final do Elemento +Element End Double = Final Duplo do Elemento +Element Straight = Elemento Contínuo +Element Straight Double = Elemento Contínuo duplo +Element T = Elemento em T +Element T Double = Elemento em T Duplo +Horizontal Cylinder = Cilindro Horizontal +One Curved Edge Block = Uma Borda de Bloco Curvada +Pyramid = Pirâmide +Slope = Ladeira +Slope Edge = Canto de Ladeira +Slope Inner Edge = Canto de Dentro de Ladeira +Slope Lying = Ladeira Deitada +Slope Upside Down = Ladeira de Cabeça para Baixo +Slope Upside Down Edge = Cande de Ladeira de Cabeça para Baixo +Slope Upside Down Inner Edge = Canto de Dentro de Ladeira de Cabeça para Baixo +Sphere = Esfera +Spike = Espinho +Stick = Graveto +Two Curved Edge Block = Bloco de Duas Bordas Curvadas +Brick = Tijolo +Cobble = Pedregulho +Dirt = Terra +Leaves = Folhas +Sandstone = Arenito +Stone = Pedra +Tree = Árvore +Wooden = de Madeira + +## Grinder Recipes +# $1: Name +%s Dust = Pó de %s +Akalin = Akalin +Alatro = Alatro +Arol = Arol +Brass = Latão +Bronze = Bronze +Carbon Steel = Aço Carbono +Cast Iron = Ferro Fundido +Chromium = Crômio +Coal = Carvão +Copper = Cobre +Gold = Ouro +Mithril = Mithril +Silver = Prata +Stainless Steel = Aço Inoxidável +Talinite = Talinite +Tin = Estanho +Wrought Iron = Ferro Forjado +Zinc = Zinco +%.1f%%-Fissile Uranium = Urânio %.1f%%-Físsil + +## Tools +RE Battery = Bateria RE +Water Can = Lata de Água +Lava Can = Lata de Lava +Chainsaw = Motosserra +Flashlight = Lanterna +3 nodes deep. = 3 nodes de profundidade. +3 nodes tall. = 3 nodes de altura. +3 nodes wide. = 3 nodes de largura. +3x3 nodes. = 3x3 nodes. +Use while sneaking to change Mining Drill Mk%d modes. = Use enquanto esgueirando para mudar os modos da Broca de Mineração Nv%d. +Mining Drill Mk%d Mode %d = Broca de Mineração Nv%d Modo %d +Mining Drill Mk%d = Broca de Mineração Nv%d +Mining Laser Mk%d = Laser de Mineração Nv%d +Single node. = Unico node. +Sonic Screwdriver = Chave de Fenda Sônica. +Tree Tap = Torneira de Árvore + +## Craft descriptions +Alloy cooking = Cozinhando em liga +Grinding = Triturando +Compressing = Comprimindo +Extracting = Extraindo +Separating = Separando diff --git a/mods/technic_plus/technic/locale/template.txt b/mods/technic_plus/technic/locale/template.txt new file mode 100644 index 0000000..796b2d2 --- /dev/null +++ b/mods/technic_plus/technic/locale/template.txt @@ -0,0 +1,178 @@ +# template.txt +# Template for translations of Technic + + +## Misc +[Technic] Loaded in %f seconds = + +## Items +Silicon Wafer = +Doped Silicon Wafer = +Enriched Uranium = +Uranium Fuel = +Diamond Drill Head = +Blue Energy Crystal = +Green Energy Crystal = +Red Energy Crystal = +Fine Copper Wire = +Fine Gold Wire = +Fine Silver Wire = +Copper Coil = +Electric Motor = +Low Voltage Transformer = +Medium Voltage Transformer = +High Voltage Transformer = +Control Logic Unit = +Mixed Metal Ingot = +Composite Plate = +Copper Plate = +Carbon Plate = +Graphite = +Carbon Cloth = +Raw Latex = +Rubber Fiber = +%.1f%%-Fissile Uranium Ingot = +%.1f%%-Fissile Uranium Block = + +## Machine misc +Machine cannot be removed because it is not empty = +Inventory move disallowed due to protection = +# $1: Machine name (Includes tier) +@1 Active (@2 EU) = +%s Active = +%s Disabled = +%s Enabled = +%s Idle = +%s Improperly Placed = +%s is empty = +%s Unpowered = +%s Out Of Fuel = +%s Has Bad Cabling = +%s (Slave) = +%s Has No Network = +%s Finished = +Enable/Disable = +Range = +Upgrade Slots = +In: = +Out: = +Slot %d = +Itemwise = +Stackwise = +Ignoring Mesecon Signal = +Controlled by Mesecon Signal = +Owner: = +Unlocked = +Locked = +Radius: = +Enabled = +Disabled = + +## Machine names +# $1: Tier +%s Alloy Furnace = +%s Battery Box = +%s Cable = +%s Centrifuge = +%s Compressor = +%s Extractor = +%s Forcefield Emitter = +%s Furnace = +%s Grinder = +%s Music Player = +%s Quarry = +%s Tool Workshop = +Arrayed Solar %s Generator = +Fuel-Fired %s Generator = +Geothermal %s Generator = +Hydro %s Generator = +Nuclear %s Generator Core = +Small Solar %s Generator = +Wind %s Generator = +Self-Contained Injector = +Constructor Mk%d = +Frame = +Frame Motor = +Template = +Template (replacing) = +Template Motor = +Template Tool = +Battery Box = +Supply Converter = +Switching Station = +Fuel-Fired Alloy Furnace = +Fuel-Fired Furnace = +Wind Mill Frame = +Forcefield = +Nuclear Reactor Rod Compartment = +Administrative World Anchor = + +## Machine-specific +# $1: Pruduced EU +Charge = +Discharge = +Power level = +# $1: Tier $2: current_charge $3: max_charge +@1 Battery Box: @2/@3 = +# $1: Machine name $2: Supply $3: Demand +@1. Supply: @2 Demand: @3 = +Production at %d%% = +Choose Milling Program: = +Slim Elements half / normal height: = +Current track %s = +Stopped = +Keeping %d/%d map blocks loaded = +Digging not started = +Digging finished = +Digging %d m above machine = +Digging %d m below machine = +@1 (@2 @3 -> @4 @5) = + + +## Grinder Recipes +# $1: Name +%s Dust = +Akalin = +Alatro = +Arol = +Brass = +Bronze = +Carbon Steel = +Cast Iron = +Chromium = +Coal = +Copper = +Gold = +Mithril = +Silver = +Stainless Steel = +Talinite = +Tin = +Wrought Iron = +Zinc = +%.1f%%-Fissile Uranium = + +## Tools +RE Battery = +Water Can = +Lava Can = +Chainsaw = +Flashlight = +3 nodes deep. = +3 nodes tall. = +3 nodes wide. = +3x3 nodes. = +Use while sneaking to change Mining Drill Mk%d modes. = +Mining Drill Mk%d Mode %d = +Mining Drill Mk%d = +Mining Laser Mk%d = +Single node. = +Sonic Screwdriver = +Tree Tap = + +## Craft descriptions +Alloy cooking = +Grinding = +Compressing = +Extracting = +Separating = diff --git a/mods/technic_plus/technic/locale/zh_CN.txt b/mods/technic_plus/technic/locale/zh_CN.txt new file mode 100644 index 0000000..1b711a7 --- /dev/null +++ b/mods/technic_plus/technic/locale/zh_CN.txt @@ -0,0 +1,145 @@ +# Author: wzy2006 <3450354617@qq.com> +# Template for translations of Technic +[Technic] Loaded in %f seconds =[Technic]在%f秒内加载完成 +Silicon Wafer =硅晶片 +Doped Silicon Wafer =硅芯片 +Enriched Uranium =浓缩铀 +Uranium Fuel =铀燃料 +Diamond Drill Head =金刚石钻头 +Blue Energy Crystal =蓝色能量水晶 +Green Energy Crystal =绿色能源水晶 +Red Energy Crystal =红色能量水晶 +Fine Copper Wire =细铜线 +Copper Coil =铜盘管 +Electric Motor =电动马达 +Low Voltage Transformer =低压变压器 +Medium Voltage Transformer =中压变压器 +High Voltage Transformer =高压变压器 +Control Logic Unit =控制逻辑单元 +Mixed Metal Ingot =混合金属锭 +Composite Plate =复合材料板 +Copper Plate =铜板 +Carbon Plate =碳板 +Graphite =石墨 +Carbon Cloth =碳布 +Raw Latex =生乳胶 +Rubber Fiber =橡胶纤维 +%.1f%%-Fissile Uranium Ingot = %.1f%%-裂变铀锭 +%.1f%%-Fissile Uranium Block = %.1f%%-裂变铀块 +Machine cannot be removed because it is not empty =机器不能被拆除,因为它不是空的 +Inventory move disallowed due to protection =库存移动不允许由于保护 +@1 Active (@2 EU) =@1动作(@2 EU) +%s Active =%s 活动 +%s Disabled =%s 禁用 +%s Enabled =%s 启用 +%s Idle =%s 闲置 +%s Improperly Placed =%s 放置不当 +%s Unpowered =%s 无能量的 +%s Out Of Fuel =%s 燃料耗尽 +%s Has Bad Cabling =%s 布线不良 +%s Has No Network =%s 未并入电网(也许需要"交换站") +%s Finished =%s 完成 +Enable/Disable =启用/禁用 +Range =范围 +Upgrade Slots =升级插槽 +In: =输入: +Out: =输出: +Slot %d =插槽 %d +Itemwise =逐项 +Stackwise =逐堆 +Owner: =拥有者: +Unlocked =解锁 +Locked =锁着的 +Radius: =半径: +Enabled =启用 +Disabled =禁用 +%s Alloy Furnace =%s 合金炉 +%s Battery Box =% s电池盒 +%s Cable =%s 电缆 +%s Compressor =%s 压缩机 +%s Extractor =%s 提取机 +%s Forcefield Emitter =%s 力场发射器 +%s Furnace =%s 熔炉 +%s Grinder =%s 研磨机 +%s Music Player =%s 音乐播放器 +%s Quarry =% s采石机 +%s Tool Workshop =% s工具车间 +Arrayed Solar %s Generator =太阳能%s发电板 +Fuel-Fired %s Generator =火力%s发电机 +Geothermal %s Generator =地热%s发电机 +Hydro %s Generator =水力%s 发电机 +Nuclear %s Generator Core =核裂变%s发电机核心 +Small Solar %s Generator =小型太阳能%s发电板 +Wind %s Generator =风力%s发电机 +Self-Contained Injector =独立式输入器 +Constructor Mk%d =建造器%d +Frame =框架 +Frame Motor =框架电机 +Template =模板 +Template (replacing) =模板(替换) +Template motor =电动机模板 +Template tool =工具模板 +Battery Box =电池盒 +Supply Converter =电源转换器 +Switching Station =交换站 +Fuel-Fired Alloy Furnace =火力合金炉 +Fuel-Fired Furnace =火力熔炉 +Wind Mill Frame =风力机框架 +Forcefield =力场 +Nuclear Reactor Rod Compartment =核反应堆舱 +Administrative World Anchor =管理员区块锚 +Charge =Charge +Discharge =Discharge +Power level =功率级 +@1 Battery Box: @2/@3 =@1电池盒:@2/@3 +@1. Supply: @2 Demand: @3 =@1. 供应: @2 需要: @3 +Production at %d%% =生产 %d%% +Choose Milling Program: =选择研磨程序: +Slim Elements half / normal height: =苗条的元素一半/正常高度: +Current track %s =电流跟踪%s +Stopped =停止 +Keeping %d/%d map blocks loaded =保持%d/%d地图模块加载 +Digging not started =没有开始挖掘 +Digging finished =挖完 +Digging %d m above machine =挖掘 %d m以上的机器 +Digging %d m below machine =挖掘 %d m以下的机器 +%s Dust = %s 粉 +Akalin =Akalin +Alatro =Alatro +Arol =Arol +Brass =黄铜 +Bronze =青铜 +Carbon Steel =碳钢 +Cast Iron =铸铁 +Chromium =铬 +Coal =煤炭 +Copper =铜 +Gold =黄金 +Mithril =秘银 +Silver =银 +Stainless Steel =不锈钢 +Talinite = 绿泥石 +Tin =锡 +Wrought Iron =锻铁 +Zinc =锌 +%.1f%%-Fissile Uranium =%.1f%%-裂变铀 +RE Battery =RE 电池 +Water Can =水罐 +Lava Can =岩浆罐 +Chainsaw =电锯 +Flashlight =手电筒 +3 nodes deep. =3方块深度。 +3 nodes tall. =3方块高。 +3 nodes wide. =3方块宽。 +3x3 nodes. =3x3 方块.。 +Use while sneaking to change Mining Drill Mk%d modes. = 潜行时使用可更改采矿钻机Mk%d模式 +Mining Drill Mk%d Mode %d =采矿钻 MK%d模式%d +Mining Drill Mk%d =采矿钻 MK%d +Mining Laser Mk%d =采矿激光 MK %d +Single node. =单方块。 +Sonic Screwdriver =声波螺丝刀 +Tree Tap =树形水龙头 +Alloy cooking =熔炼合金 +Grinding =研磨中 +Compressing =压缩 +Extracting =提取 \ No newline at end of file diff --git a/mods/technic_plus/technic/machines/HV/battery_box.lua b/mods/technic_plus/technic/machines/HV/battery_box.lua new file mode 100644 index 0000000..89c65da --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/battery_box.lua @@ -0,0 +1,22 @@ +-- HV battery box + +minetest.register_craft({ + output = 'technic:hv_battery_box0', + recipe = { + {'technic:mv_battery_box0', 'technic:mv_battery_box0', 'technic:mv_battery_box0'}, + {'technic:mv_battery_box0', 'technic:hv_transformer', 'technic:mv_battery_box0'}, + {'', 'technic:hv_cable', ''}, + } +}) + +technic.register_battery_box({ + tier = "HV", + max_charge = 1000000, + charge_rate = 100000, + discharge_rate = 400000, + charge_step = 10000, + discharge_step = 40000, + upgrade = 1, + tube = 1, +}) + diff --git a/mods/technic_plus/technic/machines/HV/cables.lua b/mods/technic_plus/technic/machines/HV/cables.lua new file mode 100644 index 0000000..eb29c91 --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/cables.lua @@ -0,0 +1,47 @@ +minetest.register_craft({ + output = 'technic:hv_cable 3', + recipe = { + {'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, + {'technic:mv_cable', 'technic:mv_cable', 'technic:mv_cable'}, + {'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'}, + } +}) + +technic.register_cable("HV", 3/16) + +if minetest.get_modpath("digilines") then + + local S = technic.getter + + if minetest.get_modpath("digistuff") then + minetest.register_craft({ + output = 'technic:hv_digi_cable 1', + type = "shapeless", + recipe = {'digistuff:digimese', 'technic:hv_cable'} + }) + else + minetest.register_craft({ + output = 'technic:hv_digi_cable 1', + recipe = { + {'digilines:wire_std_00000000', 'digilines:wire_std_00000000', 'digilines:wire_std_00000000'}, + {'digilines:wire_std_00000000', 'technic:hv_cable', 'digilines:wire_std_00000000'}, + {'digilines:wire_std_00000000', 'digilines:wire_std_00000000', 'digilines:wire_std_00000000'}, + } + }) + end + + technic.register_cable("HV", 3/16, S("HV Cable (digiline)"), "_digi", { + digiline = { + wire = { + rules = { + {x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1} + } + } + } + }) +end diff --git a/mods/technic_plus/technic/machines/HV/compressor.lua b/mods/technic_plus/technic/machines/HV/compressor.lua new file mode 100644 index 0000000..12e165b --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/compressor.lua @@ -0,0 +1,12 @@ +-- HV compressor + +minetest.register_craft({ + output = 'technic:hv_compressor', + recipe = { + {'technic:carbon_plate', 'technic:mv_compressor', 'technic:composite_plate'}, + {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_compressor({tier = "HV", demand = {1500, 1000, 750}, speed = 5, upgrade = 1, tube = 1}) diff --git a/mods/technic_plus/technic/machines/HV/electric_furnace.lua b/mods/technic_plus/technic/machines/HV/electric_furnace.lua new file mode 100644 index 0000000..57a3cd1 --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/electric_furnace.lua @@ -0,0 +1,18 @@ +-- MV Electric Furnace +-- This is a faster version of the stone furnace which runs on EUs +-- In addition to this it can be upgraded with microcontrollers and batteries +-- This new version uses the batteries to lower the power consumption of the machine +-- Also in addition this furnace can be attached to the pipe system from the pipeworks mod. + +-- FIXME: kpoppel I'd like to introduce an induction heating element here also +minetest.register_craft({ + output = 'technic:hv_electric_furnace', + recipe = { + {'technic:stainless_steel_ingot', 'technic:mv_electric_furnace', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_electric_furnace({tier="HV", upgrade=1, tube=1, demand={4000, 2500, 1500}, speed=12}) + diff --git a/mods/technic_plus/technic/machines/HV/forcefield.lua b/mods/technic_plus/technic/machines/HV/forcefield.lua new file mode 100644 index 0000000..bc755df --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/forcefield.lua @@ -0,0 +1,390 @@ +--- Forcefield generator. +-- @author ShadowNinja +-- +-- Forcefields are powerful barriers but they consume huge amounts of power. +-- The forcefield Generator is an HV machine. + +-- How expensive is the generator? +-- Leaves room for upgrades lowering the power drain? +local digilines_path = minetest.get_modpath("digilines") + +local forcefield_power_drain = 10 + +local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" + +minetest.register_craft({ + output = "technic:forcefield_emitter_off", + recipe = { + {"default:mese", "basic_materials:motor", "default:mese" }, + {"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"}, + {"default:mese", "technic:hv_cable", "default:mese" }, + } +}) + + +local replaceable_cids = {} + +minetest.after(0, function() + for name, ndef in pairs(minetest.registered_nodes) do + if ndef.buildable_to == true and name ~= "ignore" then + replaceable_cids[minetest.get_content_id(name)] = true + end + end +end) + + +-- Idea: Let forcefields have different colors by upgrade slot. +-- Idea: Let forcefields add up by detecting if one hits another. +-- ___ __ +-- / \/ \ +-- | | +-- \___/\___/ + +local function update_forcefield(pos, meta, active) + + if active then + -- rate limit by chance + if math.floor(math.random()*4) ~= 0 then + return + end + end + + local shape = meta:get_int("shape") + local range = meta:get_int("range") + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(vector.subtract(pos, range), + vector.add(pos, range)) + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local data = vm:get_data() + + local c_air = minetest.get_content_id("air") + local c_field = minetest.get_content_id("technic:forcefield") + + for z = -range, range do + for y = -range, range do + local vi = area:index(pos.x + (-range), pos.y + y, pos.z + z) + for x = -range, range do + local relevant + if shape == 0 then + local squared = x * x + y * y + z * z + relevant = + squared <= range * range + range and + squared >= (range - 1) * (range - 1) + (range - 1) + else + relevant = + x == -range or x == range or + y == -range or y == range or + z == -range or z == range + end + if relevant then + local cid = data[vi] + if active and replaceable_cids[cid] then + data[vi] = c_field + elseif not active and cid == c_field then + data[vi] = c_air + end + end + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:update_liquids() + vm:write_to_map() +end + +local function set_forcefield_formspec(meta) + local formspec + if digilines_path then + formspec = "size[5,3.25]".. + "field[0.3,3;5,1;channel;Digiline Channel;"..meta:get_string("channel").."]" + else + formspec = "size[5,2.25]" + end + formspec = formspec.. + "field[0.3,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]" + -- The names for these toggle buttons are explicit about which + -- state they'll switch to, so that multiple presses (arising + -- from the ambiguity between lag and a missed press) only make + -- the single change that the user expects. + if meta:get_int("shape") == 0 then + formspec = formspec.."button[3,0.2;2,1;shape1;"..S("Sphere").."]" + else + formspec = formspec.."button[3,0.2;2,1;shape0;"..S("Cube").."]" + end + if meta:get_int("mesecon_mode") == 0 then + formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]" + else + formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]" + end + if meta:get_int("enabled") == 0 then + formspec = formspec.. + "button[0,1.75;5,1;enable;"..S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]" + else + formspec = formspec.. + "button[0,1.75;5,1;disable;"..S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]" + end + meta:set_string("formspec", formspec) +end + +local forcefield_receive_fields = function(pos, formname, fields, sender) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.chat_send_player(player_name, "You are not allowed to edit this!") + minetest.record_protection_violation(pos, player_name) + return + end + local meta = minetest.get_meta(pos) + local range = nil + if fields.range then + range = tonumber(fields.range) or 0 + -- Smallest field is 5. Anything less is asking for trouble. + -- Largest is 20. It is a matter of pratical node handling. + -- At the maximim range updating the forcefield takes about 0.2s + range = math.max(range, 5) + range = math.min(range, 20) + if range == meta:get_int("range") then range = nil end + end + if fields.shape0 or fields.shape1 or range then + update_forcefield(pos, meta, false) + end + if range then meta:set_int("range", range) end + if fields.channel then meta:set_string("channel", fields.channel) end + if fields.shape0 then meta:set_int("shape", 0) end + if fields.shape1 then meta:set_int("shape", 1) end + if fields.enable then meta:set_int("enabled", 1) end + if fields.disable then meta:set_int("enabled", 0) end + if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end + if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end + set_forcefield_formspec(meta) +end + +local mesecons = { + effector = { + action_on = function(pos, node) + minetest.get_meta(pos):set_int("mesecon_effect", 1) + end, + action_off = function(pos, node) + minetest.get_meta(pos):set_int("mesecon_effect", 0) + end + } +} + +local digiline_def = { + receptor = { + rules = technic.digilines.rules, + action = function() end + }, + effector = { + rules = technic.digilines.rules, + action = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + local msgt = type(msg) + if msgt == "string" then + local smsg = msg:lower() + msg = {} + if smsg == "get" then + msg.command = "get" + elseif smsg == "off" then + msg.command = "off" + elseif smsg == "on" then + msg.command = "on" + elseif smsg == "toggle" then + msg.command = "toggle" + elseif smsg:sub(1, 5) == "range" then + msg.command = "range" + msg.value = tonumber(smsg:sub(7)) + elseif smsg:sub(1, 5) == "shape" then + msg.command = "shape" + msg.value = smsg:sub(7):lower() + msg.value = tonumber(msg.value) or msg.value + end + elseif msgt ~= "table" then + return + end + if msg.command == "get" then + digilines.receptor_send(pos, technic.digilines.rules, channel, { + enabled = meta:get_int("enabled"), + range = meta:get_int("range"), + shape = meta:get_int("shape") + }) + return + elseif msg.command == "off" then + meta:set_int("enabled", 0) + elseif msg.command == "on" then + meta:set_int("enabled", 1) + elseif msg.command == "toggle" then + local onn = meta:get_int("enabled") + onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0. + meta:set_int("enabled", onn) + elseif msg.command == "range" then + if type(msg.value) ~= "number" then + return + end + msg.value = math.max(msg.value, 5) + msg.value = math.min(msg.value, 20) + update_forcefield(pos, meta, false) + meta:set_int("range", msg.value) + elseif msg.command == "shape" then + local valuet = type(msg.value) + if valuet == "string" then + if msg.value == "sphere" then + msg.value = 0 + elseif msg.value == "cube" then + msg.value = 1 + end + elseif valuet ~= "number" then + return + end + if not msg.value then + return + end + update_forcefield(pos, meta, false) + meta:set_int("shape", msg.value) + else + return + end + set_forcefield_formspec(meta) + end + }, +} + +local function run(pos, node) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int("HV_EU_input") + local enabled = meta:get_int("enabled") ~= 0 and + (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0) + local machine_name = S("%s Forcefield Emitter"):format("HV") + + local range = meta:get_int("range") + local power_requirement + if meta:get_int("shape") == 0 then + power_requirement = math.floor(4 * math.pi * range * range) + else + power_requirement = 24 * range * range + end + power_requirement = power_requirement * forcefield_power_drain + + if not enabled then + if node.name == "technic:forcefield_emitter_on" then + update_forcefield(pos, meta, false) + technic.swap_node(pos, "technic:forcefield_emitter_off") + meta:set_string("infotext", S("%s Disabled"):format(machine_name)) + end + meta:set_int("HV_EU_demand", 0) + return + end + meta:set_int("HV_EU_demand", power_requirement) + if eu_input < power_requirement then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + if node.name == "technic:forcefield_emitter_on" then + update_forcefield(pos, meta, false) + technic.swap_node(pos, "technic:forcefield_emitter_off") + end + elseif eu_input >= power_requirement then + if node.name == "technic:forcefield_emitter_off" then + technic.swap_node(pos, "technic:forcefield_emitter_on") + meta:set_string("infotext", S("%s Active"):format(machine_name)) + end + update_forcefield(pos, meta, true) + end +end + +minetest.register_node("technic:forcefield_emitter_off", { + description = S("%s Forcefield Emitter"):format("HV"), + tiles = { + "technic_forcefield_emitter_off.png", + "technic_machine_bottom.png"..cable_entry, + "technic_forcefield_emitter_off.png", + "technic_forcefield_emitter_off.png", + "technic_forcefield_emitter_off.png", + "technic_forcefield_emitter_off.png" + }, + groups = {cracky = 1, technic_machine = 1, technic_hv = 1}, + on_receive_fields = forcefield_receive_fields, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("HV_EU_input", 0) + meta:set_int("HV_EU_demand", 0) + meta:set_int("range", 10) + meta:set_int("enabled", 0) + meta:set_int("mesecon_mode", 0) + meta:set_int("mesecon_effect", 0) + if digilines_path then + meta:set_string("channel", "forcefield"..minetest.pos_to_string(pos)) + end + meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV")) + set_forcefield_formspec(meta) + end, + mesecons = mesecons, + digiline = digiline_def, + technic_run = run, +}) + +minetest.register_node("technic:forcefield_emitter_on", { + description = S("%s Forcefield Emitter"):format("HV"), + tiles = { + "technic_forcefield_emitter_on.png", + "technic_machine_bottom.png"..cable_entry, + "technic_forcefield_emitter_on.png", + "technic_forcefield_emitter_on.png", + "technic_forcefield_emitter_on.png", + "technic_forcefield_emitter_on.png" + }, + groups = {cracky = 1, technic_machine = 1, technic_hv = 1, + not_in_creative_inventory=1}, + drop = "technic:forcefield_emitter_off", + on_receive_fields = forcefield_receive_fields, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + update_forcefield(pos, meta, false) + end, + mesecons = mesecons, + digiline = digiline_def, + technic_run = run, + technic_on_disable = function (pos, node) + local meta = minetest.get_meta(pos) + update_forcefield(pos, meta, false) + technic.swap_node(pos, "technic:forcefield_emitter_off") + end, + on_blast = function(pos, intensity) + minetest.dig_node(pos) + return {"technic:forcefield_emitter_off"} + end, +}) + +minetest.register_node("technic:forcefield", { + description = S("%s Forcefield"):format("HV"), + sunlight_propagates = true, + drawtype = "glasslike", + groups = {not_in_creative_inventory=1}, + paramtype = "light", + light_source = default.LIGHT_MAX, + diggable = false, + drop = '', + tiles = {{ + name = "technic_forcefield_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.0, + }, + }}, + on_blast = function(pos, intensity) + end, +}) + + +if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("technic:forcefield") +end + +technic.register_machine("HV", "technic:forcefield_emitter_on", technic.receiver) +technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver) diff --git a/mods/technic_plus/technic/machines/HV/generator.lua b/mods/technic_plus/technic/machines/HV/generator.lua new file mode 100644 index 0000000..3fb494b --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/generator.lua @@ -0,0 +1,13 @@ +minetest.register_alias("hv_generator", "technic:hv_generator") + +minetest.register_craft({ + output = 'technic:hv_generator', + recipe = { + {'technic:carbon_plate', 'technic:mv_generator', 'technic:composite_plate'}, + {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_generator({tier="HV", tube=1, supply=1200}) + diff --git a/mods/technic_plus/technic/machines/HV/grinder.lua b/mods/technic_plus/technic/machines/HV/grinder.lua new file mode 100644 index 0000000..89dfc31 --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/grinder.lua @@ -0,0 +1,13 @@ +-- HV grinder + +minetest.register_craft({ + output = 'technic:hv_grinder', + recipe = { + {'technic:carbon_plate', 'technic:mv_grinder', 'technic:composite_plate'}, + {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_grinder({tier="HV", demand={1200, 900, 600}, speed=5, upgrade=1, tube=1}) + diff --git a/mods/technic_plus/technic/machines/HV/init.lua b/mods/technic_plus/technic/machines/HV/init.lua new file mode 100644 index 0000000..93cd7b7 --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/init.lua @@ -0,0 +1,22 @@ + +technic.register_tier("HV", "High Voltage") + +local path = technic.modpath.."/machines/HV" + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +dofile(path.."/solar_array.lua") +dofile(path.."/nuclear_reactor.lua") +dofile(path.."/generator.lua") + +-- Machines +dofile(path.."/quarry.lua") +dofile(path.."/forcefield.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/compressor.lua") + + diff --git a/mods/technic_plus/technic/machines/HV/nuclear_reactor.lua b/mods/technic_plus/technic/machines/HV/nuclear_reactor.lua new file mode 100644 index 0000000..dde3545 --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/nuclear_reactor.lua @@ -0,0 +1,514 @@ +--[[ + The enriched uranium rod driven EU generator. +A very large and advanced machine providing vast amounts of power. +Very efficient but also expensive to run as it needs uranium. +Provides 10000 HV EUs for one week (only counted when loaded). + +The nuclear reactor core requires a casing of water and a protective +shield to work. This is checked now and then and if the casing is not +intact the reactor will melt down! +--]] + +local burn_ticks = 7 * 24 * 60 * 60 -- Seconds +local power_supply = 100000 -- EUs +local fuel_type = "technic:uranium_fuel" -- The reactor burns this +local digiline_meltdown = technic.config:get_bool("enable_nuclear_reactor_digiline_selfdestruct") +local has_digilines = minetest.get_modpath("digilines") + +local S = technic.getter + +local reactor_desc = S("@1 Nuclear Reactor Core", S("HV")) +local cable_entry = "^technic_cable_connection_overlay.png" + +-- FIXME: Recipe should make more sense like a rod recepticle, steam chamber, HV generator? +minetest.register_craft({ + output = 'technic:hv_nuclear_reactor_core', + recipe = { + {'technic:carbon_plate', 'default:obsidian_glass', 'technic:carbon_plate'}, + {'technic:composite_plate', 'technic:machine_casing', 'technic:composite_plate'}, + {'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +local function make_reactor_formspec(meta) + local f = "size[8,9]".. + "label[0,0;"..S("Nuclear Reactor Rod Compartment").."]".. + "list[context;src;2,1;3,2;]".. + "list[current_player;main;0,5;8,4;]".. + "listring[]".. + "button[5.5,1.5;2,1;start;Start]".. + "checkbox[5.5,2.5;autostart;automatic Start;"..meta:get_string("autostart").."]" + if not has_digilines then + return f + end + local digiline_enabled = meta:get_string("enable_digiline") + f = f.."checkbox[0.5,2.8;enable_digiline;Enable Digiline;"..digiline_enabled.."]" + if digiline_enabled ~= "true" then + return f + end + return f.. + "button_exit[4.6,3.69;2,1;save;Save]".. + "field[1,4;4,1;remote_channel;Digiline Remote Channel;${remote_channel}]" +end + +local SS_OFF = 0 +local SS_DANGER = 1 +local SS_CLEAR = 2 + +local reactor_siren = {} +local function siren_set_state(pos, state) + local hpos = minetest.hash_node_position(pos) + local siren = reactor_siren[hpos] + if not siren then + if state == SS_OFF then return end + siren = {state=SS_OFF} + reactor_siren[hpos] = siren + end + if state == SS_DANGER and siren.state ~= SS_DANGER then + if siren.handle then minetest.sound_stop(siren.handle) end + siren.handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_danger_loop", + {pos=pos, gain=1.5, loop=true, max_hear_distance=48}) + siren.state = SS_DANGER + elseif state == SS_CLEAR then + if siren.handle then minetest.sound_stop(siren.handle) end + local clear_handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_clear", + {pos=pos, gain=1.5, loop=false, max_hear_distance=48}) + siren.handle = clear_handle + siren.state = SS_CLEAR + minetest.after(10, function() + if siren.handle ~= clear_handle then return end + minetest.sound_stop(clear_handle) + if reactor_siren[hpos] == siren then + reactor_siren[hpos] = nil + end + end) + elseif state == SS_OFF and siren.state ~= SS_OFF then + if siren.handle then minetest.sound_stop(siren.handle) end + reactor_siren[hpos] = nil + end +end + +local function siren_danger(pos, meta) + meta:set_int("siren", 1) + siren_set_state(pos, SS_DANGER) +end + +local function siren_clear(pos, meta) + if meta:get_int("siren") ~= 0 then + siren_set_state(pos, SS_CLEAR) + meta:set_int("siren", 0) + end +end + +--[[ +The standard reactor structure consists of a 9x9x9 cube. A cross +section through the middle: + + CCCC CCCC + CBBB BBBC + CBLL LLBC + CBLWWWLBC + CBLW#WLBC + CBLW|WLBC + CBLL|LLBC + CBBB|BBBC + CCCC|CCCC + C = Concrete, B = Blast-resistant concrete, L = Lead, + W = water node, # = reactor core, | = HV cable + +The man-hole is optional (but necessary for refueling). + +For the reactor to operate and not melt down, it insists on the inner +7x7x7 portion (from the core out to the blast-resistant concrete) +being intact. Intactness only depends on the number of nodes of the +right type in each layer. The water layer must have water in all but +at most one node; the steel and blast-resistant concrete layers must +have the right material in all but at most two nodes. The permitted +gaps are meant for the cable and man-hole, but can actually be anywhere +and contain anything. For the reactor to be useful, a cable must +connect to the core, but it can go in any direction. + +The outer concrete layer of the standard structure is not required +for the reactor to operate. It is noted here because it used to +be mandatory, and for historical reasons (that it predates the +implementation of radiation) it needs to continue being adequate +shielding of legacy reactors. If it ever ceases to be adequate +shielding for new reactors, legacy ones should be grandfathered. + +For legacy reasons, if the reactor has a stainless steel layer instead +of a lead layer it will be converted to a lead layer. +--]] +local function reactor_structure_badness(pos) + local vm = VoxelManip() + local pos1 = vector.subtract(pos, 3) + local pos2 = vector.add(pos, 3) + local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2) + local data = vm:get_data() + local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge}) + + local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete") + local c_lead = minetest.get_content_id("technic:lead_block") + local c_steel = minetest.get_content_id("technic:stainless_steel_block") + local c_water_source = minetest.get_content_id("default:water_source") + local c_water_flowing = minetest.get_content_id("default:water_flowing") + + local blast_layer, steel_layer, lead_layer, water_layer = 0, 0, 0, 0 + + for z = pos1.z, pos2.z do + for y = pos1.y, pos2.y do + for x = pos1.x, pos2.x do + local cid = data[area:index(x, y, z)] + if x == pos1.x or x == pos2.x or + y == pos1.y or y == pos2.y or + z == pos1.z or z == pos2.z then + if cid == c_blast_concrete then + blast_layer = blast_layer + 1 + end + elseif x == pos1.x+1 or x == pos2.x-1 or + y == pos1.y+1 or y == pos2.y-1 or + z == pos1.z+1 or z == pos2.z-1 then + if cid == c_lead then + lead_layer = lead_layer + 1 + elseif cid == c_steel then + steel_layer = steel_layer + 1 + end + elseif x == pos1.x+2 or x == pos2.x-2 or + y == pos1.y+2 or y == pos2.y-2 or + z == pos1.z+2 or z == pos2.z-2 then + if cid == c_water_source or cid == c_water_flowing then + water_layer = water_layer + 1 + end + end + end + end + end + + if steel_layer >= 96 then + for z = pos1.z+1, pos2.z-1 do + for y = pos1.y+1, pos2.y-1 do + for x = pos1.x+1, pos2.x-1 do + local vi = area:index(x, y, z) + if x == pos1.x+1 or x == pos2.x-1 or + y == pos1.y+1 or y == pos2.y-1 or + z == pos1.z+1 or z == pos2.z-1 then + if data[vi] == c_steel then + data[vi] = c_lead + end + end + end + end + end + vm:set_data(data) + vm:write_to_map() + lead_layer = steel_layer + end + + if water_layer > 25 then water_layer = 25 end + if lead_layer > 96 then lead_layer = 96 end + if blast_layer > 216 then blast_layer = 216 end + return (25 - water_layer) + (96 - lead_layer) + (216 - blast_layer) +end + + +local function melt_down_reactor(pos) + minetest.log("action", "A reactor melted down at "..minetest.pos_to_string(pos)) + minetest.set_node(pos, {name = "technic:corium_source"}) +end + + +local function start_reactor(pos, meta) + if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then + return false + end + local inv = meta:get_inventory() + if inv:is_empty("src") then + return false + end + local src_list = inv:get_list("src") + local correct_fuel_count = 0 + for _, src_stack in pairs(src_list) do + if src_stack and src_stack:get_name() == fuel_type then + correct_fuel_count = correct_fuel_count + 1 + end + end + -- Check that the reactor is complete and has the correct fuel + if correct_fuel_count ~= 6 or reactor_structure_badness(pos) ~= 0 then + return false + end + meta:set_int("burn_time", 1) + technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active") + meta:set_int("HV_EU_supply", power_supply) + for idx, src_stack in pairs(src_list) do + src_stack:take_item() + inv:set_stack("src", idx, src_stack) + end + return true +end + + +minetest.register_abm({ + label = "Machines: reactor melt-down check", + nodenames = {"technic:hv_nuclear_reactor_core_active"}, + interval = 4, + chance = 1, + action = function (pos, node) + local meta = minetest.get_meta(pos) + local badness = reactor_structure_badness(pos) + local accum_badness = meta:get_int("structure_accumulated_badness") + if badness == 0 then + if accum_badness ~= 0 then + meta:set_int("structure_accumulated_badness", math.max(accum_badness - 4, 0)) + siren_clear(pos, meta) + end + else + siren_danger(pos, meta) + accum_badness = accum_badness + badness + if accum_badness >= 25 then + melt_down_reactor(pos) + else + meta:set_int("structure_accumulated_badness", accum_badness) + end + end + end, +}) + +local function run(pos, node) + local meta = minetest.get_meta(pos) + local burn_time = meta:get_int("burn_time") or 0 + if burn_time >= burn_ticks or burn_time == 0 then + if has_digilines and meta:get_int("HV_EU_supply") == power_supply then + digilines.receptor_send(pos, technic.digilines.rules, meta:get_string("remote_channel"), { + command = "fuel_used", + pos = pos + }) + end + if meta:get_string("autostart") == "true" then + if start_reactor(pos, meta) then + return + end + end + meta:set_int("HV_EU_supply", 0) + meta:set_int("burn_time", 0) + meta:set_string("infotext", S("%s Idle"):format(reactor_desc)) + technic.swap_node(pos, "technic:hv_nuclear_reactor_core") + meta:set_int("structure_accumulated_badness", 0) + siren_clear(pos, meta) + elseif burn_time > 0 then + burn_time = burn_time + 1 + meta:set_int("burn_time", burn_time) + local percent = math.floor(burn_time / burn_ticks * 100) + meta:set_string("infotext", reactor_desc.." ("..percent.."%)") + meta:set_int("HV_EU_supply", power_supply) + end +end + +local nuclear_reactor_receive_fields = function(pos, formname, fields, sender) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.chat_send_player(player_name, "You are not allowed to edit this!") + minetest.record_protection_violation(pos, player_name) + return + end + local meta = minetest.get_meta(pos) + local update_formspec = false + if fields.remote_channel then + meta:set_string("remote_channel", fields.remote_channel) + end + if fields.start then + local b = start_reactor(pos, meta) + if b then + minetest.chat_send_player(player_name, "Start successful") + else + minetest.chat_send_player(player_name, "Error") + end + end + if fields.autostart then + meta:set_string("autostart", fields.autostart) + update_formspec = true + end + if fields.enable_digiline then + meta:set_string("enable_digiline", fields.enable_digiline) + update_formspec = true + end + if update_formspec then + meta:set_string("formspec", make_reactor_formspec(meta)) + end +end + +local digiline_def = function(pos, _, channel, msg) + local meta = minetest.get_meta(pos) + if meta:get_string("enable_digiline") ~= "true" or + channel ~= meta:get_string("remote_channel") then + return + end + -- Convert string messages to tables: + local msgt = type(msg) + if msgt == "string" then + local smsg = msg:lower() + msg = {} + if smsg == "get" then + msg.command = "get" + elseif smsg:sub(1, 13) == "self_destruct" then + msg.command = "self_destruct" + msg.timer = tonumber(smsg:sub(15)) or 0 + elseif smsg == "start" then + msg.command = "start" + end + elseif msgt ~= "table" then + return + end + + if msg.command == "get" then + local inv = meta:get_inventory() + local invtable = {} + for i = 1, 6 do + local stack = inv:get_stack("src", i) + if stack:is_empty() then + invtable[i] = 0 + elseif stack:get_name() == fuel_type then + invtable[i] = stack:get_count() + else + invtable[i] = -stack:get_count() + end + end + digilines.receptor_send(pos, technic.digilines.rules, channel, { + burn_time = meta:get_int("burn_time"), + enabled = meta:get_int("HV_EU_supply") == power_supply, + siren = meta:get_int("siren") == 1, + structure_accumulated_badness = meta:get_int("structure_accumulated_badness"), + rods = invtable + }) + elseif digiline_meltdown and msg.command == "self_destruct" and + minetest.get_node(pos).name == "technic:hv_nuclear_reactor_core_active" then + if msg.timer ~= 0 and type(msg.timer) == "number" then + siren_danger(pos, meta) + minetest.after(msg.timer, melt_down_reactor, pos) + else + melt_down_reactor(pos) + end + elseif msg.command == "start" then + local b = start_reactor(pos, meta) + if b then + digilines.receptor_send(pos, technic.digilines.rules, channel, { + command = "start_success", + pos = pos + }) + else + digilines.receptor_send(pos, technic.digilines.rules, channel, { + command = "start_error", + pos = pos + }) + end + end +end + +minetest.register_node("technic:hv_nuclear_reactor_core", { + description = reactor_desc, + tiles = { + "technic_hv_nuclear_reactor_core.png", + "technic_hv_nuclear_reactor_core.png"..cable_entry + }, + drawtype = "mesh", + mesh = "technic_reactor.obj", + groups = {cracky = 1, technic_machine = 1, technic_hv = 1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + paramtype = "light", + paramtype2 = "facedir", + stack_max = 1, + on_receive_fields = nuclear_reactor_receive_fields, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", reactor_desc) + meta:set_string("formspec", make_reactor_formspec(meta)) + if has_digilines then + meta:set_string("remote_channel", + "nuclear_reactor"..minetest.pos_to_string(pos)) + end + local inv = meta:get_inventory() + inv:set_size("src", 6) + end, + + -- digiline interface + digiline = { + receptor = { + rules = technic.digilines.rules, + action = function() end, + }, + effector = { + rules = technic.digilines.rules, + action = digiline_def, + }, + }, + + can_dig = technic.machine_can_dig, + on_destruct = function(pos) siren_set_state(pos, SS_OFF) end, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, +}) + +minetest.register_node("technic:hv_nuclear_reactor_core_active", { + tiles = { + "technic_hv_nuclear_reactor_core.png", + "technic_hv_nuclear_reactor_core.png"..cable_entry + }, + drawtype = "mesh", + mesh = "technic_reactor.obj", + groups = {cracky = 1, technic_machine = 1, technic_hv = 1, radioactive = 4, + not_in_creative_inventory = 1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + drop = "technic:hv_nuclear_reactor_core", + light_source = 14, + paramtype = "light", + paramtype2 = "facedir", + on_receive_fields = nuclear_reactor_receive_fields, + + -- digiline interface + digiline = { + receptor = { + rules = technic.digilines.rules, + action = function() end, + }, + effector = { + rules = technic.digilines.rules, + action = digiline_def, + }, + }, + + can_dig = technic.machine_can_dig, + after_dig_node = melt_down_reactor, + on_destruct = function(pos) siren_set_state(pos, SS_OFF) end, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, + technic_on_disable = function(pos, node) + local timer = minetest.get_node_timer(pos) + timer:start(1) + end, + on_timer = function(pos, node) + -- Connected back? + if technic.get_timeout("HV", pos) > 0 then return false end + + local meta = minetest.get_meta(pos) + local burn_time = meta:get_int("burn_time") or 0 + + if burn_time >= burn_ticks or burn_time == 0 then + meta:set_int("HV_EU_supply", 0) + meta:set_int("burn_time", 0) + technic.swap_node(pos, "technic:hv_nuclear_reactor_core") + meta:set_int("structure_accumulated_badness", 0) + siren_clear(pos, meta) + return false + end + + meta:set_int("burn_time", burn_time + 1) + return true + end, +}) + +technic.register_machine("HV", "technic:hv_nuclear_reactor_core", technic.producer) +technic.register_machine("HV", "technic:hv_nuclear_reactor_core_active", technic.producer) diff --git a/mods/technic_plus/technic/machines/HV/quarry.lua b/mods/technic_plus/technic/machines/HV/quarry.lua new file mode 100644 index 0000000..45732cf --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/quarry.lua @@ -0,0 +1,421 @@ + +local S = technic.getter + +local has_digilines = minetest.get_modpath("digilines") + +local quarry_dig_above_nodes = tonumber(technic.config:get("quarry_dig_above_nodes")) +local quarry_max_depth = tonumber(technic.config:get("quarry_max_depth")) +local quarry_time_limit = tonumber(technic.config:get("quarry_time_limit")) + +local quarry_demand = 10000 +local quarry_eject_dir = vector.new(0, 1, 0) +local machine_name = S("%s Quarry"):format("HV") +local quarry_formspec = + "size[8,9]".. + "item_image[7,0;1,1;technic:quarry]".. + "list[context;cache;0,1;4,3;]".. + "listring[context;cache]".. + "list[current_player;main;0,5;8,4;]".. + "listring[current_player;main]".. + "label[0,0;"..machine_name.."]".. + "button[6,0.9;2,1;restart;"..S("Restart").."]" + +if has_digilines then + quarry_formspec = quarry_formspec + .. "field[4.3,3.4;4,1;channel;Channel;${channel}]" +end + +-- hard-coded spiral dig pattern for up to 17x17 dig area +local quarry_dig_pattern = { + 0,1,2,2,3,3,0,0,0,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,0,1,1,1,1,1,2,2, + 2,2,2,2,3,3,3,3,3,3,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, + 2,2,2,2,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, + 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0, + 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +} + +local function is_player_allowed(pos, name) + local owner = minetest.get_meta(pos):get_string("owner") + if owner == "" or owner == name then + return true + end + if not minetest.is_protected(pos, name) then + return true + end + return false +end + +local function reset_quarry(pos) + local meta = minetest.get_meta(pos) + local node = technic.get_or_load_node(pos) or minetest.get_node(pos) + meta:set_int("quarry_dir", node.param2) + meta:set_string("quarry_pos", minetest.pos_to_string(pos)) + meta:set_string("dig_pos", "") + meta:set_int("dig_level", pos.y + quarry_dig_above_nodes) + local radius = meta:get_int("size") + local diameter = (radius*2)+1 + meta:set_int("dig_steps", diameter*diameter) + meta:set_int("dig_index", 0) + meta:set_int("purge_on", 1) + meta:set_int("finished", 0) + meta:set_int("dug", 0) +end + +local function set_quarry_status(pos) + local meta = minetest.get_meta(pos) + local formspec = quarry_formspec.."field[4.3,2.4;2,1;size;"..S("Radius:")..";"..meta:get_int("size").."]" + local status = S("Digging not started") + if meta:get_int("enabled") == 1 then + formspec = formspec.."button[4,0.9;2,1;disable;"..S("Enabled").."]" + if meta:get_int("purge_on") == 1 then + status = S("Purging cache") + meta:set_string("infotext", S("%s purging cache"):format(machine_name)) + meta:set_int("HV_EU_demand", 0) + elseif meta:get_int("finished") == 1 then + status = S("Digging finished") + meta:set_string("infotext", S("%s Finished"):format(machine_name)) + meta:set_int("HV_EU_demand", 0) + else + local rel_y = meta:get_int("dig_level") - pos.y + status = S("Digging %d m "..(rel_y > 0 and "above" or "below").." machine"):format(math.abs(rel_y)) + if meta:get_int("HV_EU_input") >= quarry_demand then + meta:set_string("infotext", S("%s Active"):format(machine_name)) + else + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + end + meta:set_int("HV_EU_demand", quarry_demand) + end + else + formspec = formspec.."button[4,0.9;2,1;enable;"..S("Disabled").."]" + meta:set_string("infotext", S("%s Disabled"):format(machine_name)) + meta:set_int("HV_EU_demand", 0) + end + meta:set_string("formspec", formspec.."label[0,4.1;"..minetest.formspec_escape(status).."]") +end + +local function quarry_receive_fields(pos, formname, fields, sender) + local player_name = sender:get_player_name() + if not is_player_allowed(pos, player_name) then + minetest.chat_send_player(player_name, "You are not allowed to edit this!") + minetest.record_protection_violation(pos, player_name) + return + end + local meta = minetest.get_meta(pos) + if fields.size and string.find(fields.size, "^[0-9]+$") then + local size = tonumber(fields.size) + if size >= 1 and size <= 8 and size ~= meta:get_int("size") then + meta:set_int("size", size) + reset_quarry(pos) + end + end + if fields.channel then + meta:set_string("channel", fields.channel) + end + if fields.enable then meta:set_int("enabled", 1) end + if fields.disable then meta:set_int("enabled", 0) end + if fields.restart then reset_quarry(pos) end + set_quarry_status(pos) +end + +local function quarry_handle_purge(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local cache = inv:get_list("cache") + if not cache then + inv:set_size("cache", 12) + return + end + local i = 0 + for _,stack in ipairs(cache) do + i = i + 1 + if stack then + local item = stack:to_table() + if item then + technic.tube_inject_item(pos, pos, quarry_eject_dir, item) + stack:clear() + inv:set_stack("cache", i, stack) + break + end + end + end + if inv:is_empty("cache") then + meta:set_int("purge_on", 0) + end +end + +local function can_dig_node(pos, node_name, owner, digger) + if node_name == "air" or node_name == "vacuum:vacuum" then + return false + end + local def = minetest.registered_nodes[node_name] + if not def or not def.diggable or (def.can_dig and not def.can_dig(pos, digger)) then + return false + end + if minetest.is_protected(pos, owner) then + return false + end + return true +end + +local function find_ground(quarry_pos, quarry_dir, meta) + local dir = minetest.facedir_to_dir(quarry_dir % 4) + local radius = meta:get_int("size") + local dig_level = meta:get_int("dig_level") + local middle_pos = vector.add(quarry_pos, vector.multiply(dir, radius + 1)) + local pos1 = vector.new(middle_pos.x - radius, dig_level, middle_pos.z - radius) + local pos2 = vector.new(middle_pos.x + radius, dig_level, middle_pos.z + radius) + local nodes = minetest.find_nodes_in_area(pos1, pos2, {"air", "vacuum:vacuum"}) + if #nodes < meta:get_int("dig_steps") then + return vector.new(middle_pos.x, dig_level, middle_pos.z) + end + meta:set_int("dig_level", dig_level - 1) + return nil +end + +local function get_dig_pos(quarry_pos, quarry_dir, dig_pos, dig_index, dig_steps, meta) + if dig_index > 0 and dig_index < dig_steps then + local facedir = (quarry_dir + quarry_dig_pattern[dig_index]) % 4 + dig_pos = vector.add(dig_pos, minetest.facedir_to_dir(facedir)) + elseif dig_index >= dig_steps then + local dig_level = meta:get_int("dig_level") + if (quarry_pos.y - dig_level) >= quarry_max_depth then + return nil, dig_index + end + local dir = minetest.facedir_to_dir(quarry_dir % 4) + dig_pos = vector.add(quarry_pos, vector.multiply(dir, meta:get_int("size") + 1)) + dig_pos.y = dig_level - 1 + meta:set_int("dig_level", dig_pos.y) + dig_index = 0 + end + dig_index = dig_index + 1 + return dig_pos, dig_index +end + +local function execute_dig(pos, node, meta) + local dig_pos = minetest.string_to_pos(meta:get_string("dig_pos")) + local quarry_dir = meta:get_int("quarry_dir") + if not dig_pos then + -- quarry has not hit ground yet + dig_pos = find_ground(pos, quarry_dir, meta) + else + local owner = meta:get_string("owner") + local digger = pipeworks.create_fake_player({name = owner}) + local dig_steps = meta:get_int("dig_steps") + local dig_index = meta:get_int("dig_index") + local t0 = minetest.get_us_time() + local us_used = 0 + -- search for something to dig + while us_used < quarry_time_limit do + dig_pos, dig_index = get_dig_pos(pos, quarry_dir, dig_pos, dig_index, dig_steps, meta) + if not dig_pos then + -- finished digging + meta:set_int("finished", 1) + meta:set_int("purge_on", 1) + break + end + local dig_node = technic.get_or_load_node(dig_pos) or minetest.get_node(dig_pos) + if can_dig_node(dig_pos, dig_node.name, owner, digger) then + -- found something to dig, dig it and stop searching + minetest.remove_node(dig_pos) + local inv = meta:get_inventory() + local drops = minetest.get_node_drops(dig_node.name, "") + for _, dropped_item in ipairs(drops) do + local left = inv:add_item("cache", dropped_item) + while not left:is_empty() do + meta:set_int("purge_on", 1) + quarry_handle_purge(pos) + left = inv:add_item("cache", left) + end + end + local dug_nodes = meta:get_int("dug") + 1 + meta:set_int("dug", dug_nodes) + if dug_nodes % 100 == 0 then + meta:set_int("purge_on", 1) + end + break + end + us_used = minetest.get_us_time() - t0 + end + meta:set_int("dig_index", dig_index) + end + if dig_pos then + meta:set_string("dig_pos", minetest.pos_to_string(dig_pos)) + end +end + +local function quarry_run(pos, node) + local meta = minetest.get_meta(pos) + if minetest.pos_to_string(pos) ~= meta:get_string("quarry_pos") then + -- quarry has been moved since last dig + reset_quarry(pos) + elseif meta:get_int("purge_on") == 1 then + quarry_handle_purge(pos) + elseif meta:get_int("enabled") and meta:get_int("HV_EU_input") >= quarry_demand and meta:get_int("finished") == 0 then + execute_dig(pos, node, meta) + elseif not meta:get_inventory():is_empty("cache") then + meta:set_int("purge_on", 1) + end + set_quarry_status(pos) +end + +local digiline_def = function(pos, _, channel, msg) + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + -- Convert string messages to tables: + if type(msg) == "string" then + local smsg = msg:lower() + msg = {} + if smsg == "get" then + msg.command = "get" + elseif smsg:sub(1,7) == "radius " then + msg.command = "radius" + msg.value = smsg:sub(8,-1) + elseif smsg == "on" then + msg.command = "on" + elseif smsg == "off" then + msg.command = "off" + elseif smsg == "restart" then + msg.command = "restart" + end + end + + if type(msg) ~= "table" then + return + end + + if msg.command == "get" then + digilines.receptor_send(pos, technic.digilines.rules, channel, { + enabled = meta:get_int("enabled"), + radius = meta:get_int("size"), + finished = meta:get_int("finished"), + dug_nodes = meta:get_int("dug"), + dig_level = meta:get_int("dig_level") - pos.y + }) + elseif msg.command == "radius" then + local size = tonumber(msg.value) + if not size or size < 1 or size > 8 or size == meta:get_int("size") then + return + end + meta:set_int("size", size) + reset_quarry(pos) + set_quarry_status(pos) + elseif msg.command == "on" then + meta:set_int("enabled", 1) + set_quarry_status(pos) + elseif msg.command == "off" then + meta:set_int("enabled", 0) + set_quarry_status(pos) + elseif msg.command == "restart" then + reset_quarry(pos) + set_quarry_status(pos) + end + +end + +minetest.register_node("technic:quarry", { + description = S("%s Quarry"):format("HV"), + tiles = { + "technic_carbon_steel_block.png^pipeworks_tube_connection_metallic.png", + "technic_carbon_steel_block.png^technic_cable_connection_overlay.png", + "technic_carbon_steel_block.png^technic_cable_connection_overlay.png", + "technic_carbon_steel_block.png^technic_cable_connection_overlay.png", + "technic_carbon_steel_block.png^default_tool_mesepick.png", + "technic_carbon_steel_block.png^technic_cable_connection_overlay.png" + }, + paramtype2 = "facedir", + groups = {cracky=2, tubedevice=1, technic_machine=1, technic_hv=1}, + connect_sides = {"bottom", "front", "left", "right"}, + tube = { + connect_sides = {top = 1}, + -- lower priority than other tubes, so that quarries will prefer any + -- other tube to another quarry, which could lead to server freezes + -- in certain quarry placements (2x2 for example would never eject) + priority = 10, + can_go = function(pos, node, velocity, stack) + -- always eject the same, even if items came in another way + -- this further mitigates loops and generally avoids random sideway movement + -- that can be expected in certain quarry placements + return { quarry_eject_dir } + end + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("size", 4) + meta:get_inventory():set_size("cache", 12) + reset_quarry(pos) + set_quarry_status(pos) + end, + on_rotate = function(pos, node, player, click, new_param2) + local meta = minetest.get_meta(pos) + if meta:get_int("enabled") == 1 then + return false + end + + -- only allow rotation around y-axis + node.param2 = new_param2 % 4 + + minetest.swap_node(pos, node) + reset_quarry(pos) + set_quarry_status(pos) + return true + end, + after_place_node = function(pos, placer, itemstack) + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + pipeworks.scan_for_tube_objects(pos) + end, + can_dig = function(pos,player) + return minetest.get_meta(pos):get_inventory():is_empty("cache") + end, + after_dig_node = pipeworks.scan_for_tube_objects, + on_receive_fields = quarry_receive_fields, + technic_run = quarry_run, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + return is_player_allowed(pos, player:get_player_name()) and count or 0 + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return is_player_allowed(pos, player:get_player_name()) and stack:get_count() or 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + return is_player_allowed(pos, player:get_player_name()) and stack:get_count() or 0 + end, + mesecons = { + effector = { + action_on = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("enabled", 1) + set_quarry_status(pos) + end, + action_off = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("enabled", 0) + set_quarry_status(pos) + end + } + }, + digiline = { + receptor = { + rules = technic.digilines.rules, + action = function() end, + }, + effector = { + rules = technic.digilines.rules, + action = digiline_def, + }, + }, +}) + +minetest.register_craft({ + recipe = { + {"technic:carbon_plate", "pipeworks:filter", "technic:composite_plate"}, + {"basic_materials:motor", "technic:machine_casing", "technic:diamond_drill_head"}, + {"technic:carbon_steel_block", "technic:hv_cable", "technic:carbon_steel_block"}}, + output = "technic:quarry" +}) + +technic.register_machine("HV", "technic:quarry", technic.receiver) diff --git a/mods/technic_plus/technic/machines/HV/solar_array.lua b/mods/technic_plus/technic/machines/HV/solar_array.lua new file mode 100644 index 0000000..c7de7c8 --- /dev/null +++ b/mods/technic_plus/technic/machines/HV/solar_array.lua @@ -0,0 +1,14 @@ +-- The high voltage solar array is an assembly of medium voltage arrays. +-- Solar arrays are not able to store large amounts of energy. + +minetest.register_craft({ + output = 'technic:solar_array_hv 1', + recipe = { + {'technic:solar_array_mv', 'technic:solar_array_mv', 'technic:solar_array_mv'}, + {'technic:carbon_plate', 'technic:hv_transformer', 'technic:composite_plate'}, + {'', 'technic:hv_cable', ''}, + } +}) + +technic.register_solar_array({tier="HV", power=100}) + diff --git a/mods/technic_plus/technic/machines/LV/alloy_furnace.lua b/mods/technic_plus/technic/machines/LV/alloy_furnace.lua new file mode 100644 index 0000000..5e4f7c4 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/alloy_furnace.lua @@ -0,0 +1,14 @@ +-- LV Alloy furnace + +-- FIXME: kpoppel: I'd like to introduce an induction heating element here... +minetest.register_craft({ + output = 'technic:lv_alloy_furnace', + recipe = { + {'default:brick', 'default:brick', 'default:brick'}, + {'default:brick', 'technic:machine_casing', 'default:brick'}, + {'default:brick', 'technic:lv_cable', 'default:brick'}, + } +}) + +technic.register_alloy_furnace({tier = "LV", speed = 1, demand = {300}}) + diff --git a/mods/technic_plus/technic/machines/LV/battery_box.lua b/mods/technic_plus/technic/machines/LV/battery_box.lua new file mode 100644 index 0000000..bf7f846 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/battery_box.lua @@ -0,0 +1,20 @@ +-- LV Battery box + +minetest.register_craft({ + output = 'technic:lv_battery_box0', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'technic:battery', 'technic:machine_casing', 'technic:battery'}, + {'technic:battery', 'technic:lv_cable', 'technic:battery'}, + } +}) + +technic.register_battery_box({ + tier = "LV", + max_charge = 40000, + charge_rate = 1000, + discharge_rate = 4000, + charge_step = 500, + discharge_step = 800, +}) + diff --git a/mods/technic_plus/technic/machines/LV/cables.lua b/mods/technic_plus/technic/machines/LV/cables.lua new file mode 100644 index 0000000..45019f3 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/cables.lua @@ -0,0 +1,50 @@ + +minetest.register_alias("lv_cable", "technic:lv_cable") + +minetest.register_craft({ + output = 'technic:lv_cable 6', + recipe = { + {'default:paper', 'default:paper', 'default:paper'}, + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + {'default:paper', 'default:paper', 'default:paper'}, + } +}) + +technic.register_cable("LV", 2/16) + +if minetest.get_modpath("digilines") then + + local S = technic.getter + + if minetest.get_modpath("digistuff") then + minetest.register_craft({ + output = 'technic:lv_digi_cable 1', + type = "shapeless", + recipe = {'digistuff:digimese', 'technic:lv_cable'} + }) + else + minetest.register_craft({ + output = 'technic:lv_digi_cable 1', + recipe = { + {'digilines:wire_std_00000000', 'digilines:wire_std_00000000', 'digilines:wire_std_00000000'}, + {'digilines:wire_std_00000000', 'technic:lv_cable', 'digilines:wire_std_00000000'}, + {'digilines:wire_std_00000000', 'digilines:wire_std_00000000', 'digilines:wire_std_00000000'}, + } + }) + end + + technic.register_cable("LV", 2/16, S("LV Cable (digiline)"), "_digi", { + digiline = { + wire = { + rules = { + {x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1} + } + } + } + }) +end diff --git a/mods/technic_plus/technic/machines/LV/compressor.lua b/mods/technic_plus/technic/machines/LV/compressor.lua new file mode 100644 index 0000000..84eb4c5 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/compressor.lua @@ -0,0 +1,17 @@ + +minetest.register_alias("compressor", "technic:lv_compressor") + +minetest.register_craft({ + output = 'technic:lv_compressor', + recipe = { + {'default:stone', 'basic_materials:motor', 'default:stone'}, + {'mesecons:piston', 'technic:machine_casing', 'mesecons:piston'}, + {'basic_materials:silver_wire', 'technic:lv_cable', 'basic_materials:silver_wire'}, + }, + replacements = { + {"basic_materials:silver_wire", "basic_materials:empty_spool"}, + {"basic_materials:silver_wire", "basic_materials:empty_spool"} + }, +}) + +technic.register_compressor({tier = "LV", demand = {300}, speed = 1}) diff --git a/mods/technic_plus/technic/machines/LV/electric_furnace.lua b/mods/technic_plus/technic/machines/LV/electric_furnace.lua new file mode 100644 index 0000000..768f04a --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/electric_furnace.lua @@ -0,0 +1,16 @@ +-- LV Electric Furnace +-- This is a faster version of the stone furnace which runs on EUs + +-- FIXME: kpoppel I'd like to introduce an induction heating element here also +minetest.register_craft({ + output = 'technic:electric_furnace', + recipe = { + {'default:cobble', 'default:cobble', 'default:cobble'}, + {'default:cobble', 'technic:machine_casing', 'default:cobble'}, + {'default:cobble', 'technic:lv_cable', 'default:cobble'}, + } +}) + +technic.register_electric_furnace({tier="LV", demand={300}, speed = 2}) + + diff --git a/mods/technic_plus/technic/machines/LV/extractor.lua b/mods/technic_plus/technic/machines/LV/extractor.lua new file mode 100644 index 0000000..123ad05 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/extractor.lua @@ -0,0 +1,13 @@ + +minetest.register_alias("extractor", "technic:lv_extractor") + +minetest.register_craft({ + output = 'technic:lv_extractor', + recipe = { + {'technic:treetap', 'basic_materials:motor', 'technic:treetap'}, + {'technic:treetap', 'technic:machine_casing', 'technic:treetap'}, + {'', 'technic:lv_cable', ''}, + } +}) + +technic.register_extractor({tier = "LV", demand = {300}, speed = 1}) diff --git a/mods/technic_plus/technic/machines/LV/generator.lua b/mods/technic_plus/technic/machines/LV/generator.lua new file mode 100644 index 0000000..dc9815f --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/generator.lua @@ -0,0 +1,18 @@ +-- The electric generator. +-- A simple device to get started on the electric machines. +-- Inefficient and expensive in fuel (200EU per tick) +-- Also only allows for LV machinery to run. + +minetest.register_alias("lv_generator", "technic:lv_generator") + +minetest.register_craft({ + output = 'technic:lv_generator', + recipe = { + {'default:stone', 'default:furnace', 'default:stone'}, + {'default:stone', 'technic:machine_casing', 'default:stone'}, + {'default:stone', 'technic:lv_cable', 'default:stone'}, + } +}) + +technic.register_generator({tier="LV", supply=200}) + diff --git a/mods/technic_plus/technic/machines/LV/geothermal.lua b/mods/technic_plus/technic/machines/LV/geothermal.lua new file mode 100644 index 0000000..abe6951 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/geothermal.lua @@ -0,0 +1,117 @@ +-- A geothermal EU generator +-- Using hot lava and water this device can create energy from steam +-- The machine is only producing LV EUs and can thus not drive more advanced equipment +-- The output is a little more than the coal burning generator (max 300EUs) + +minetest.register_alias("geothermal", "technic:geothermal") + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:geothermal', + recipe = { + {'technic:granite', 'default:diamond', 'technic:granite'}, + {'basic_materials:copper_wire', 'technic:machine_casing', 'basic_materials:copper_wire'}, + {'technic:granite', 'technic:lv_cable', 'technic:granite'}, + }, + replacements = { + {"basic_materials:copper_wire", "basic_materials:empty_spool"}, + {"basic_materials:copper_wire", "basic_materials:empty_spool"} + }, +}) + +minetest.register_craftitem("technic:geothermal", { + description = S("Geothermal %s Generator"):format("LV"), +}) + +local check_node_around = function(pos) + local node = minetest.get_node(pos) + if node.name == "default:water_source" or node.name == "default:water_flowing" then return 1 end + if node.name == "default:lava_source" or node.name == "default:lava_flowing" then return 2 end + return 0 +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local water_nodes = 0 + local lava_nodes = 0 + local production_level = 0 + local eu_supply = 0 + + -- Correct positioning is water on one side and lava on the other. + -- The two cannot be adjacent because the lava the turns into obsidian or rock. + -- To get to 100% production stack the water and lava one extra block down as well: + -- WGL (W=Water, L=Lava, G=the generator, |=an LV cable) + -- W|L + + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x+1, y=pos.y-1, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y-1, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}, + {x=pos.x, y=pos.y-1, z=pos.z-1}, + } + for _, p in pairs(positions) do + local check = check_node_around(p) + if check == 1 then water_nodes = water_nodes + 1 end + if check == 2 then lava_nodes = lava_nodes + 1 end + end + + if water_nodes == 1 and lava_nodes == 1 then production_level = 25; eu_supply = 50 end + if water_nodes == 2 and lava_nodes == 1 then production_level = 50; eu_supply = 100 end + if water_nodes == 1 and lava_nodes == 2 then production_level = 75; eu_supply = 200 end + if water_nodes == 2 and lava_nodes == 2 then production_level = 100; eu_supply = 300 end + + if production_level > 0 then + meta:set_int("LV_EU_supply", eu_supply) + end + + meta:set_string("infotext", + S("Geothermal %s Generator"):format("LV").." ("..production_level.."%)") + + if production_level > 0 and minetest.get_node(pos).name == "technic:geothermal" then + technic.swap_node (pos, "technic:geothermal_active") + return + end + if production_level == 0 then + technic.swap_node(pos, "technic:geothermal") + meta:set_int("LV_EU_supply", 0) + end +end + +minetest.register_node("technic:geothermal", { + description = S("Geothermal %s Generator"):format("LV"), + tiles = {"technic_geothermal_top.png", "technic_machine_bottom.png", "technic_geothermal_side.png", + "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_lv=1}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Geothermal %s Generator"):format("LV")) + meta:set_int("LV_EU_supply", 0) + end, + technic_run = run, +}) + +minetest.register_node("technic:geothermal_active", { + description = S("Geothermal %s Generator"):format("LV"), + tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png", + "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + drop = "technic:geothermal", + technic_run = run, +}) + +technic.register_machine("LV", "technic:geothermal", technic.producer) +technic.register_machine("LV", "technic:geothermal_active", technic.producer) + diff --git a/mods/technic_plus/technic/machines/LV/grinder.lua b/mods/technic_plus/technic/machines/LV/grinder.lua new file mode 100644 index 0000000..9e45bf4 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/grinder.lua @@ -0,0 +1,13 @@ + +minetest.register_alias("grinder", "technic:lv_grinder") +minetest.register_craft({ + output = 'technic:lv_grinder', + recipe = { + {'default:desert_stone', 'default:diamond', 'default:desert_stone'}, + {'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'}, + {'technic:granite', 'technic:lv_cable', 'technic:granite'}, + } +}) + +technic.register_grinder({tier="LV", demand={200}, speed=1}) + diff --git a/mods/technic_plus/technic/machines/LV/init.lua b/mods/technic_plus/technic/machines/LV/init.lua new file mode 100644 index 0000000..dd33293 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/init.lua @@ -0,0 +1,26 @@ + +technic.register_tier("LV", "Low Voltage") + +local path = technic.modpath.."/machines/LV" + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +dofile(path.."/solar_panel.lua") +dofile(path.."/solar_array.lua") +dofile(path.."/geothermal.lua") +dofile(path.."/water_mill.lua") +dofile(path.."/generator.lua") + +-- Machines +dofile(path.."/alloy_furnace.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/extractor.lua") +dofile(path.."/compressor.lua") + +dofile(path.."/music_player.lua") + +dofile(path.."/lamp.lua") diff --git a/mods/technic_plus/technic/machines/LV/lamp.lua b/mods/technic_plus/technic/machines/LV/lamp.lua new file mode 100644 index 0000000..609cdda --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/lamp.lua @@ -0,0 +1,246 @@ +-- LV LED and LV LED Lamp +-- LED - a weak light source, intended primarily as a core component for LED lamps +-- LED Lamp - a powerful light source, illuminating a 7x7x3(H) volume below itself +-- with light bright as the sun. + +local S = technic.getter + + +local illuminate = function(pos, mode) + for y=1,3,1 do + for x=-3,3,1 do + for z = -3,3,1 do + local loc = {x = pos.x - x, y = pos.y - y, z = pos.z - z} + if mode then + if minetest.get_node(loc).name == "air" then + minetest.swap_node(loc, {name = "technic:dummy_light_source"}) + end + else + if minetest.get_node(loc).name == "technic:dummy_light_source" then + minetest.swap_node(loc, {name = "air"}) + end + end + end + end + end +end + + +local led_on = function(pos, node) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int("LV_EU_input") + local machine_name = S("%s LED"):format("LV") + local machine_node = "technic:lv_led" + local demand = 5 + + if eu_input < demand then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= demand then + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_name)) + end + meta:set_int("LV_EU_demand", demand) +end + +local led_off = function(pos, node) + local meta = minetest.get_meta(pos) + local machine_name = S("%s LED"):format("LV") + local machine_node = "technic:lv_led" + + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + + meta:set_int("LV_EU_demand", 0) +end + + + +local lamp_on = function(pos, node) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int("LV_EU_input") + local machine_name = S("%s Lamp"):format("LV") + local machine_node = "technic:lv_lamp" + local demand = 50 + + if eu_input < demand then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + illuminate(pos, false) + elseif eu_input >= demand then + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_name)) + illuminate(pos, true) + end + meta:set_int("LV_EU_demand", demand) +end + +local lamp_off = function(pos, node) + local meta = minetest.get_meta(pos) + local machine_name = S("%s Lamp"):format("LV") + local machine_node = "technic:lv_lamp" + + illuminate(pos, false) + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + meta:set_int("LV_EU_demand", 0) +end + + +minetest.register_node("technic:dummy_light_source", { + description = S("Dummy light source node"), + node_box = { + type = "fixed", + fixed = {} + }, + collision_box = { + type = "fixed", + fixed = {} + }, + selection_box = { + type = "fixed", + fixed = {} + }, + drawtype = "airlike", + buildable_to = true, + light_source = 14, + sunlight_propagates = true, + diggable = false, + walkable = false, + groups = { not_in_creative_inventory = 1 } +}) + +minetest.register_node("technic:lv_led", { + description = S("LV LED"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {0.2,0.2,0.2,-0.2,-0.2,-0.2} + }, + collision_box = { + type = "fixed", + fixed = {0.2,0.2,0.2,-0.2,-0.2,-0.2} + }, + selection_box = { + type = "fixed", + fixed = {0.2,0.2,0.2,-0.2,-0.2,-0.2} + }, + tiles = {"technic_lv_led.png"}, + inventory_image = "technic_lv_led_inv.png", + sunlight_propagates = true, + groups = {cracky=2, technic_machine=1, technic_lv=1}, + connect_sides = {"front", "back", "left", "right", "top", "bottom"}, + can_dig = technic.machine_can_dig, + technic_run = led_on, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s LED"):format("LV")) + end, + drop = "technic:lv_led" +}) + +minetest.register_node("technic:lv_led_active", { + description = S("LV LED Active"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {0.2,0.2,0.2,-0.2,-0.2,-0.2} + }, + collision_box = { + type = "fixed", + fixed = {0.2,0.2,0.2,-0.2,-0.2,-0.2} + }, + selection_box = { + type = "fixed", + fixed = {0.2,0.2,0.2,-0.2,-0.2,-0.2} + }, + tiles = {"technic_lv_led.png"}, + light_source = 9, + sunlight_propagates = true, + groups = {cracky=2, technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, + connect_sides = {"front", "back", "left", "right", "top", "bottom"}, + can_dig = technic.machine_can_dig, + technic_run = led_on, + technic_on_disable = led_off, + drop = "technic:lv_led" +}) + + +minetest.register_node("technic:lv_lamp", { + description = S("%s Lamp"):format("LV"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5} + }, + collision_box = { + type = "fixed", + fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5} + }, + selection_box = { + type = "fixed", + fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5} + }, + tiles = {"technic_lv_lamp_top.png", "technic_lv_lamp_bottom.png", "technic_lv_lamp_side.png", + "technic_lv_lamp_side.png", "technic_lv_lamp_side.png", "technic_lv_lamp_side.png"}, + groups = {cracky=2, technic_machine=1, technic_lv=1}, + connect_sides = {"front", "back", "left", "right", "top",}, + can_dig = technic.machine_can_dig, + technic_run = lamp_on, + on_destruct = lamp_off, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Lamp"):format("LV")) + end, +}) + + +minetest.register_node("technic:lv_lamp_active", { + description = S("%s Lamp Active"):format("LV"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5} + }, + collision_box = { + type = "fixed", + fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5} + }, + selection_box = { + type = "fixed", + fixed = {0.5,0.5,0.5,-0.5,-0.2,-0.5} + }, + tiles = {"technic_lv_lamp_top.png", "technic_lv_lamp_bottom.png", "technic_lv_lamp_side.png", + "technic_lv_lamp_side.png", "technic_lv_lamp_side.png", "technic_lv_lamp_side.png"}, + groups = {cracky=2, technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, + connect_sides = {"front", "back", "left", "right", "top"}, + light_source = 1, + can_dig = technic.machine_can_dig, + technic_run = lamp_on, + on_destruct = lamp_off, + technic_on_disable = lamp_off, +}) + +minetest.register_craft({ + output = 'technic:lv_led 2', + recipe = { + {'', 'homedecor:plastic_sheeting', ''}, + {'homedecor:plastic_sheeting', 'technic:doped_silicon_wafer', 'homedecor:plastic_sheeting'}, + {'', 'technic:fine_silver_wire', ''}, + }, +}) + +minetest.register_craft({ + output = 'technic:lv_lamp', + recipe = { + {'default:glass', 'default:glass', 'default:glass'}, + {'technic:lv_led', 'technic:lv_led', 'technic:lv_led'}, + {'mesecons_materials:glue', 'technic:lv_cable', 'mesecons_materials:glue'}, + }, +}) + +technic.register_machine("LV", "technic:lv_lamp", technic.receiver) +technic.register_machine("LV", "technic:lv_lamp_active", technic.receiver) + +technic.register_machine("LV", "technic:lv_led", technic.receiver) +technic.register_machine("LV", "technic:lv_led_active", technic.receiver) diff --git a/mods/technic_plus/technic/machines/LV/music_player.lua b/mods/technic_plus/technic/machines/LV/music_player.lua new file mode 100644 index 0000000..3bbb441 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/music_player.lua @@ -0,0 +1,131 @@ +-- LV Music player. +-- The player can play music. But it is high ampage! + +local S = technic.getter + +minetest.register_alias("music_player", "technic:music_player") +minetest.register_craft({ + output = 'technic:music_player', + recipe = { + {'technic:chromium_ingot', 'default:diamond', 'technic:chromium_ingot'}, + {'default:diamond', 'technic:machine_casing', 'default:diamond'}, + {'default:mossycobble', 'technic:lv_cable', 'default:mossycobble'}, + } +}) + +local music_handles = {} + +local function play_track(pos, track) + return minetest.sound_play("technic_track"..tostring(track), + {pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,}) +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int("LV_EU_input") + local machine_name = S("%s Music Player"):format("LV") + local demand = 150 + + local current_track = meta:get_int("current_track") + local pos_hash = minetest.hash_node_position(pos) + local music_handle = music_handles[pos_hash] + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int("LV_EU_demand", demand) + meta:set_int("LV_EU_input", 0) + return + end + + if meta:get_int("active") == 0 then + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_int("LV_EU_demand", 0) + return + end + + if eu_input < demand then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + if music_handle then + minetest.sound_stop(music_handle) + music_handle = nil + end + elseif eu_input >= demand then + meta:set_string("infotext", S("%s Active"):format(machine_name)) + if not music_handle then + music_handle = play_track(pos, current_track) + end + end + music_handles[pos_hash] = music_handle + meta:set_int("LV_EU_demand", demand) +end + +local function stop_player(pos, node) + local pos_hash = minetest.hash_node_position(pos) + local music_handle = music_handles[pos_hash] + if music_handle then + minetest.sound_stop(music_handle) + music_handles[pos_hash] = nil + end +end + +local function set_display(meta) + meta:set_string("formspec", + "size[4,4.5]".. + "item_image[0,0;1,1;technic:music_player]".. + "label[1,0;"..S("%s Music Player"):format("LV").."]".. + "button[0,1;1,1;track1;1]".. + "button[1,1;1,1;track2;2]".. + "button[2,1;1,1;track3;3]".. + "button[0,2;1,1;track4;4]".. + "button[1,2;1,1;track5;5]".. + "button[2,2;1,1;track6;6]".. + "button[0,3;1,1;track7;7]".. + "button[1,3;1,1;track8;8]".. + "button[2,3;1,1;track9;9]".. + "button[3,1;1,1;stop;Stop]".. + "label[0,4;"..minetest.formspec_escape( + meta:get_int("active") == 0 and + S("Stopped") or + S("Current track %s"):format(meta:get_int("current_track"))).."]") +end + +minetest.register_node("technic:music_player", { + description = S("%s Music Player"):format("LV"), + tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png", + "technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_lv=1}, + connect_sides = {"bottom"}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Music Player"):format("LV")) + set_display(meta) + end, + on_receive_fields = function(pos, formanme, fields, sender) + local new_track = nil + if fields.stop then new_track = 0 end + if fields.track1 then new_track = 1 end + if fields.track2 then new_track = 2 end + if fields.track3 then new_track = 3 end + if fields.track4 then new_track = 4 end + if fields.track5 then new_track = 5 end + if fields.track6 then new_track = 6 end + if fields.track7 then new_track = 7 end + if fields.track8 then new_track = 8 end + if fields.track9 then new_track = 9 end + if new_track then + stop_player(pos) + local meta = minetest.get_meta(pos) + meta:set_int("active", new_track == 0 and 0 or 1) + meta:set_int("current_track", new_track) + set_display(meta) + end + end, + on_destruct = stop_player, + technic_run = run, + technic_on_disable = stop_player, +}) + +technic.register_machine("LV", "technic:music_player", technic.receiver) + diff --git a/mods/technic_plus/technic/machines/LV/solar_array.lua b/mods/technic_plus/technic/machines/LV/solar_array.lua new file mode 100644 index 0000000..8c1b8f4 --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/solar_array.lua @@ -0,0 +1,18 @@ +-- The solar array is an assembly of panels into a powerful array +-- The assembly can deliver more energy than the individual panel because +-- of the transformer unit which converts the panel output variations into +-- a stable supply. +-- Solar arrays are not able to store large amounts of energy. +-- The LV arrays are used to make medium voltage arrays. + +minetest.register_craft({ + output = 'technic:solar_array_lv 1', + recipe = { + {'technic:solar_panel', 'technic:solar_panel', 'technic:solar_panel'}, + {'technic:carbon_steel_ingot', 'technic:lv_transformer', 'technic:carbon_steel_ingot'}, + {'', 'technic:lv_cable', ''}, + } +}) + +technic.register_solar_array({tier="LV", power=10}) + diff --git a/mods/technic_plus/technic/machines/LV/solar_panel.lua b/mods/technic_plus/technic/machines/LV/solar_panel.lua new file mode 100644 index 0000000..b3daedc --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/solar_panel.lua @@ -0,0 +1,72 @@ +-- Solar panels are the building blocks of LV solar arrays +-- They can however also be used separately but with reduced efficiency due to the missing transformer. +-- Individual panels are less efficient than when the panels are combined into full arrays. + +local S = technic.getter + + +minetest.register_craft({ + output = 'technic:solar_panel', + recipe = { + {'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'}, + {'basic_materials:silver_wire', 'technic:lv_cable', 'mesecons_materials:glue'}, + }, + replacements = { {"basic_materials:silver_wire", "basic_materials:empty_spool"}, }, +}) + + +local run = function(pos, node) + -- The action here is to make the solar panel prodice power + -- Power is dependent on the light level and the height above ground + -- There are many ways to cheat by using other light sources like lamps. + -- As there is no way to determine if light is sunlight that is just a shame. + -- To take care of some of it solar panels do not work outside daylight hours or if + -- built below 0m + local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} + local machine_name = S("Small Solar %s Generator"):format("LV") + + local light = minetest.get_node_light(pos1, nil) + local time_of_day = minetest.get_timeofday() + local meta = minetest.get_meta(pos) + if light == nil then light = 0 end + -- turn on panel only during day time and if sufficient light + -- I know this is counter intuitive when cheating by using other light sources underground. + if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then + local charge_to_give = math.floor((light + pos1.y) * 3) + charge_to_give = math.max(charge_to_give, 0) + charge_to_give = math.min(charge_to_give, 200) + meta:set_string("infotext", S("@1 Active (@2)", machine_name, + technic.EU_string(charge_to_give))) + meta:set_int("LV_EU_supply", charge_to_give) + else + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_int("LV_EU_supply", 0) + end +end + +minetest.register_node("technic:solar_panel", { + tiles = {"technic_solar_panel_top.png", "technic_solar_panel_bottom.png", "technic_solar_panel_side.png", + "technic_solar_panel_side.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_lv=1}, + connect_sides = {"bottom"}, + sounds = default.node_sound_wood_defaults(), + description = S("Small Solar %s Generator"):format("LV"), + active = false, + drawtype = "nodebox", + paramtype = "light", + is_ground_content = true, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("LV_EU_supply", 0) + meta:set_string("infotext", S("Small Solar %s Generator"):format("LV")) + end, + technic_run = run, +}) + +technic.register_machine("LV", "technic:solar_panel", technic.producer) + diff --git a/mods/technic_plus/technic/machines/LV/water_mill.lua b/mods/technic_plus/technic/machines/LV/water_mill.lua new file mode 100644 index 0000000..e26224e --- /dev/null +++ b/mods/technic_plus/technic/machines/LV/water_mill.lua @@ -0,0 +1,109 @@ +-- A water mill produces LV EUs by exploiting flowing water across it +-- It is a LV EU supplier and fairly low yield (max 180EUs) +-- It is a little over half as good as the thermal generator. + +local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" + +minetest.register_alias("water_mill", "technic:water_mill") + +minetest.register_craft({ + output = 'technic:water_mill', + recipe = { + {'technic:marble', 'default:diamond', 'technic:marble'}, + {'group:wood', 'technic:machine_casing', 'group:wood'}, + {'technic:marble', 'technic:lv_cable', 'technic:marble'}, + } +}) + +local function check_node_around_mill(pos) + local node = minetest.get_node(pos) + if node.name == "default:water_flowing" + or node.name == "default:river_water_flowing" then + return node.param2 -- returns approx. water flow, if any + end + return false +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local water_flow = 0 + local production_level + local eu_supply + local max_output = 4 * 45 -- keeping it around 180, little more than previous 150 :) + + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}, + } + + for _, p in pairs(positions) do + local check = check_node_around_mill(p) + if check then + water_flow = water_flow + check + end + end + + eu_supply = math.min(4 * water_flow, max_output) + production_level = math.floor(100 * eu_supply / max_output) + + meta:set_int("LV_EU_supply", eu_supply) + + meta:set_string("infotext", + S("Hydro %s Generator"):format("LV").." ("..production_level.."%)") + + if production_level > 0 and + minetest.get_node(pos).name == "technic:water_mill" then + technic.swap_node (pos, "technic:water_mill_active") + meta:set_int("LV_EU_supply", 0) + return + end + if production_level == 0 then + technic.swap_node(pos, "technic:water_mill") + end +end + +minetest.register_node("technic:water_mill", { + description = S("Hydro %s Generator"):format("LV"), + tiles = { + "technic_water_mill_top.png", + "technic_machine_bottom.png"..cable_entry, + "technic_water_mill_side.png", + "technic_water_mill_side.png", + "technic_water_mill_side.png", + "technic_water_mill_side.png" + }, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_lv=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Hydro %s Generator"):format("LV")) + meta:set_int("LV_EU_supply", 0) + end, + technic_run = run, +}) + +minetest.register_node("technic:water_mill_active", { + description = S("Hydro %s Generator"):format("LV"), + tiles = {"technic_water_mill_top_active.png", "technic_machine_bottom.png", + "technic_water_mill_side.png", "technic_water_mill_side.png", + "technic_water_mill_side.png", "technic_water_mill_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + drop = "technic:water_mill", + technic_run = run, + technic_disabled_machine_name = "technic:water_mill", +}) + +technic.register_machine("LV", "technic:water_mill", technic.producer) +technic.register_machine("LV", "technic:water_mill_active", technic.producer) + diff --git a/mods/technic_plus/technic/machines/MV/alloy_furnace.lua b/mods/technic_plus/technic/machines/MV/alloy_furnace.lua new file mode 100644 index 0000000..eaddee0 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/alloy_furnace.lua @@ -0,0 +1,14 @@ +-- MV alloy furnace + +minetest.register_craft({ + output = 'technic:mv_alloy_furnace', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_alloy_furnace', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + + +technic.register_alloy_furnace({tier = "MV", speed = 1.5, upgrade = 1, tube = 1, demand = {3000, 2000, 1000}}) + diff --git a/mods/technic_plus/technic/machines/MV/battery_box.lua b/mods/technic_plus/technic/machines/MV/battery_box.lua new file mode 100644 index 0000000..d84ec15 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/battery_box.lua @@ -0,0 +1,22 @@ +-- MV Battery box + +minetest.register_craft({ + output = 'technic:mv_battery_box0', + recipe = { + {'technic:lv_battery_box0', 'technic:lv_battery_box0', 'technic:lv_battery_box0'}, + {'technic:lv_battery_box0', 'technic:mv_transformer', 'technic:lv_battery_box0'}, + {'', 'technic:mv_cable', ''}, + } +}) + +technic.register_battery_box({ + tier = "MV", + max_charge = 200000, + charge_rate = 20000, + discharge_rate = 80000, + charge_step = 2000, + discharge_step = 8000, + upgrade = 1, + tube = 1, +}) + diff --git a/mods/technic_plus/technic/machines/MV/cables.lua b/mods/technic_plus/technic/machines/MV/cables.lua new file mode 100644 index 0000000..5b5a230 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/cables.lua @@ -0,0 +1,50 @@ + +minetest.register_alias("mv_cable", "technic:mv_cable") + +minetest.register_craft({ + output = 'technic:mv_cable 3', + recipe ={ + {'technic:rubber', 'technic:rubber', 'technic:rubber'}, + {'technic:lv_cable', 'technic:lv_cable', 'technic:lv_cable'}, + {'technic:rubber', 'technic:rubber', 'technic:rubber'}, + } +}) + +technic.register_cable("MV", 2.5/16) + +if minetest.get_modpath("digilines") then + + local S = technic.getter + + if minetest.get_modpath("digistuff") then + minetest.register_craft({ + output = 'technic:mv_digi_cable 1', + type = "shapeless", + recipe = {'digistuff:digimese', 'technic:mv_cable'} + }) + else + minetest.register_craft({ + output = 'technic:mv_digi_cable 1', + recipe = { + {'digilines:wire_std_00000000', 'digilines:wire_std_00000000', 'digilines:wire_std_00000000'}, + {'digilines:wire_std_00000000', 'technic:mv_cable', 'digilines:wire_std_00000000'}, + {'digilines:wire_std_00000000', 'digilines:wire_std_00000000', 'digilines:wire_std_00000000'}, + } + }) + end + + technic.register_cable("MV", 2.5/16, S("MV Cable (digiline)"), "_digi", { + digiline = { + wire = { + rules = { + {x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1} + } + } + } + }) +end diff --git a/mods/technic_plus/technic/machines/MV/centrifuge.lua b/mods/technic_plus/technic/machines/MV/centrifuge.lua new file mode 100644 index 0000000..fdc086f --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/centrifuge.lua @@ -0,0 +1,16 @@ +minetest.register_craft({ + output = "technic:mv_centrifuge", + recipe = { + {"basic_materials:motor", "technic:copper_plate", "technic:diamond_drill_head"}, + {"technic:copper_plate", "technic:machine_casing", "technic:copper_plate" }, + {"pipeworks:one_way_tube", "technic:mv_cable", "pipeworks:mese_filter" }, + } +}) + +technic.register_centrifuge({ + tier = "MV", + demand = { 8000, 7000, 6000 }, + speed = 2, + upgrade = 1, + tube = 1, +}) diff --git a/mods/technic_plus/technic/machines/MV/compressor.lua b/mods/technic_plus/technic/machines/MV/compressor.lua new file mode 100644 index 0000000..d97739e --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/compressor.lua @@ -0,0 +1,12 @@ +-- MV compressor + +minetest.register_craft({ + output = 'technic:mv_compressor', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_compressor', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_compressor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1}) diff --git a/mods/technic_plus/technic/machines/MV/electric_furnace.lua b/mods/technic_plus/technic/machines/MV/electric_furnace.lua new file mode 100644 index 0000000..b1d2dee --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/electric_furnace.lua @@ -0,0 +1,18 @@ +-- MV Electric Furnace +-- This is a faster version of the stone furnace which runs on EUs +-- In addition to this it can be upgraded with microcontrollers and batteries +-- This new version uses the batteries to lower the power consumption of the machine +-- Also in addition this furnace can be attached to the pipe system from the pipeworks mod. + +-- FIXME: kpoppel I'd like to introduce an induction heating element here also +minetest.register_craft({ + output = 'technic:mv_electric_furnace', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_electric_furnace', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_electric_furnace({tier="MV", upgrade=1, tube=1, demand={2000, 1000, 500}, speed=4}) + diff --git a/mods/technic_plus/technic/machines/MV/extractor.lua b/mods/technic_plus/technic/machines/MV/extractor.lua new file mode 100644 index 0000000..9066bca --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/extractor.lua @@ -0,0 +1,12 @@ +-- MV extractor + +minetest.register_craft({ + output = 'technic:mv_extractor', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_extractor', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_extractor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1}) diff --git a/mods/technic_plus/technic/machines/MV/freezer.lua b/mods/technic_plus/technic/machines/MV/freezer.lua new file mode 100644 index 0000000..ab48838 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/freezer.lua @@ -0,0 +1,12 @@ +-- MV freezer + +minetest.register_craft({ + output = 'technic:mv_freezer', + recipe = { + {'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'}, + {'pipeworks:pipe_1_empty', 'technic:mv_transformer', 'pipeworks:pipe_1_empty'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_freezer({tier = "MV", demand = {800, 600, 400}, speed = 0.5, upgrade = 1, tube = 1}) diff --git a/mods/technic_plus/technic/machines/MV/generator.lua b/mods/technic_plus/technic/machines/MV/generator.lua new file mode 100644 index 0000000..db9d59f --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/generator.lua @@ -0,0 +1,13 @@ +minetest.register_alias("generator_mv", "technic:generator_mv") + +minetest.register_craft({ + output = 'technic:mv_generator', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_generator', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_generator({tier="MV", tube=1, supply=600}) + diff --git a/mods/technic_plus/technic/machines/MV/grinder.lua b/mods/technic_plus/technic/machines/MV/grinder.lua new file mode 100644 index 0000000..19ab372 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/grinder.lua @@ -0,0 +1,13 @@ +-- MV grinder + +minetest.register_craft({ + output = 'technic:mv_grinder', + recipe = { + {'technic:stainless_steel_ingot', 'technic:lv_grinder', 'technic:stainless_steel_ingot'}, + {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +technic.register_grinder({tier="MV", demand={600, 450, 300}, speed=2, upgrade=1, tube=1}) + diff --git a/mods/technic_plus/technic/machines/MV/hydro_turbine.lua b/mods/technic_plus/technic/machines/MV/hydro_turbine.lua new file mode 100644 index 0000000..c228824 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/hydro_turbine.lua @@ -0,0 +1,105 @@ +-- A Hydro Turbine produces MV EUs by exploiting flowing water across it +-- It is a MV EU supplier and fairly high yield (max 1800EUs) + +local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" + +minetest.register_alias("hydro_turbine", "technic:hydro_turbine") + +minetest.register_craft({ + output = 'technic:hydro_turbine', + recipe = { + {'technic:stainless_steel_ingot', 'technic:water_mill', 'technic:stainless_steel_ingot'}, + {'technic:water_mill', 'technic:mv_transformer', 'technic:water_mill'}, + {'technic:stainless_steel_ingot', 'technic:mv_cable', 'technic:stainless_steel_ingot'}, + } +}) + +local function get_water_flow(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "water") == 3 then + return node.param2 -- returns approx. water flow, if any + end + return 0 +end + +--- +-- 10 times better than LV hydro because of 2 extra water mills and 4 stainless steel, a transformer and whatnot ;P. +-- Man hydro turbines are tough and long lasting. So, give it some value :) +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local water_flow = 0 + local production_level + local eu_supply + local max_output = 40 * 45 -- Generates 1800EU/s + + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}, + } + + for _, p in pairs(positions) do + water_flow = water_flow + get_water_flow(p) + end + + eu_supply = math.min(40 * water_flow, max_output) + production_level = math.floor(100 * eu_supply / max_output) + + meta:set_int("MV_EU_supply", eu_supply) + + meta:set_string("infotext", + S("Hydro %s Generator"):format("MV").." ("..production_level.."%)") + if production_level > 0 and + minetest.get_node(pos).name == "technic:hydro_turbine" then + technic.swap_node(pos, "technic:hydro_turbine_active") + meta:set_int("MV_EU_supply", 0) + return + end + if production_level == 0 then + technic.swap_node(pos, "technic:hydro_turbine") + end +end + +minetest.register_node("technic:hydro_turbine", { + description = S("Hydro %s Generator"):format("MV"), + tiles = { + "technic_hydro_turbine_top.png", + "technic_machine_bottom.png"..cable_entry, + "technic_hydro_turbine_side.png", + "technic_hydro_turbine_side.png", + "technic_hydro_turbine_side.png", + "technic_hydro_turbine_side.png" + }, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_mv=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Hydro %s Generator"):format("MV")) + meta:set_int("MV_EU_supply", 0) + end, + technic_run = run, +}) + +minetest.register_node("technic:hydro_turbine_active", { + description = S("Hydro %s Generator"):format("MV"), + tiles = {"technic_hydro_turbine_top_active.png", "technic_machine_bottom.png", + "technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png", + "technic_hydro_turbine_side.png", "technic_hydro_turbine_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_mv=1, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + drop = "technic:hydro_turbine", + technic_run = run, + technic_disabled_machine_name = "technic:hydro_turbine", +}) + +technic.register_machine("MV", "technic:hydro_turbine", technic.producer) +technic.register_machine("MV", "technic:hydro_turbine_active", technic.producer) diff --git a/mods/technic_plus/technic/machines/MV/init.lua b/mods/technic_plus/technic/machines/MV/init.lua new file mode 100644 index 0000000..07c44b6 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/init.lua @@ -0,0 +1,35 @@ + +technic.register_tier("MV", "Medium Voltage") + +local path = technic.modpath.."/machines/MV" + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +if technic.config:get_bool("enable_wind_mill") then + dofile(path.."/wind_mill.lua") +end +dofile(path.."/generator.lua") +dofile(path.."/solar_array.lua") +dofile(path.."/hydro_turbine.lua") + +-- Machines +dofile(path.."/alloy_furnace.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/extractor.lua") +dofile(path.."/compressor.lua") +dofile(path.."/centrifuge.lua") + +dofile(path.."/tool_workshop.lua") + +dofile(path.."/freezer.lua") + +-- The power radiator supplies appliances with inductive coupled power: +-- Lighting and associated textures is taken directly from VanessaE's homedecor and made electric. +-- This is currently useless, slow, and mostly copied +--dofile(path.."/power_radiator.lua") +--dofile(path.."/lighting.lua") + diff --git a/mods/technic_plus/technic/machines/MV/lighting.lua b/mods/technic_plus/technic/machines/MV/lighting.lua new file mode 100644 index 0000000..9a8d369 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/lighting.lua @@ -0,0 +1,575 @@ +-- NOTE: The code is takes directly from VanessaE's homedecor mod. +-- I just made it the lights into indictive appliances for this mod. + +-- This file supplies electric powered glowlights + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function (s) return s end +end + +local function technic_homedecor_node_is_owned(pos, placer) + local ownername = false + if type(isprotect) == "function" then -- glomie's protection mod + if not isprotect(5, pos, placer) then + ownername = S("someone") + end + elseif type(protector) == "table" and type(protector.can_dig) == "function" then -- Zeg9's protection mod + if not protector.can_dig(5, pos, placer) then + ownername = S("someone") + end + end + + if ownername ~= false then + minetest.chat_send_player(placer:get_player_name(), S("Sorry, %s owns that spot."):format(ownername) ) + return true + else + return false + end +end + +local dirs2 = {9, 18, 7, 12} + +local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_thing) + if not technic_homedecor_node_is_owned(pointed_thing.under, placer) + and not technic_homedecor_node_is_owned(pointed_thing.above, placer) then + local node = minetest.get_node(pointed_thing.under) + if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].on_rightclick then + + local above = pointed_thing.above + local under = pointed_thing.under + local pitch = placer:get_look_pitch() + local pname = minetest.get_node(under).name + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + local wield_name = itemstack:get_name() + + if not minetest.registered_nodes[pname] + or not minetest.registered_nodes[pname].on_rightclick then + + local iswall = (above.x ~= under.x) or (above.z ~= under.z) + local isceiling = (above.x == under.x) and (above.z == under.z) and (pitch > 0) + local pos1 = above + + if minetest.registered_nodes[pname]["buildable_to"] then + pos1 = under + iswall = false + end + + if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end + + if iswall then + minetest.add_node(pos1, {name = wield_name, param2 = dirs2[fdir+1] }) -- place wall variant + elseif isceiling then + minetest.add_node(pos1, {name = wield_name, param2 = 20 }) -- place upside down variant + else + minetest.add_node(pos1, {name = wield_name, param2 = 0 }) -- place right side up + end + + if not homedecor_expect_infinite_stacks then + itemstack:take_item() + return itemstack + end + end + else + minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) + end + end +end + +-- Yellow -- Half node +minetest.register_node('technic:homedecor_glowlight_half_yellow', { + description = S("Yellow Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_half_yellow_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_half_yellow_active', { + description = S("Yellow Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png', + 'technic_homedecor_glowlight_thick_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = minetest.LIGHT_MAX, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_half_yellow", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_half_yellow") + end +}) + +-- Yellow -- Quarter node +minetest.register_node('technic:homedecor_glowlight_quarter_yellow', { + description = S("Yellow Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_quarter_yellow_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_quarter_yellow_active', { + description = S("Yellow Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_yellow_tb.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png', + 'technic_homedecor_glowlight_thin_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = minetest.LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_quarter_yellow", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_quarter_yellow") + end +}) + + +-- White -- half node +minetest.register_node('technic:homedecor_glowlight_half_white', { + description = S("White Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_half_white_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_half_white_active', { + description = S("White Glowlight (thick)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png', + 'technic_homedecor_glowlight_thick_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = minetest.LIGHT_MAX, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_half_white", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thick)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_half_white") + end +}) + +-- White -- Quarter node +minetest.register_node('technic:homedecor_glowlight_quarter_white', { + description = S("White Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_quarter_white_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_quarter_white_active', { + description = S("White Glowlight (thin)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_white_tb.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png', + 'technic_homedecor_glowlight_thin_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = minetest.LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_quarter_white", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 100, "White Glowlight (thin)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_quarter_white") + end +}) + +-- Glowlight "cubes" - yellow +minetest.register_node('technic:homedecor_glowlight_small_cube_yellow', { + description = S("Yellow Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "Yellow Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 50, "technic:homedecor_glowlight_small_cube_yellow_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_small_cube_yellow_active', { + description = S("Yellow Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_tb.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png', + 'technic_homedecor_glowlight_cube_yellow_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = minetest.LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_small_cube_yellow", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "Yellow Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_small_cube_yellow") + end +}) + +-- Glowlight "cubes" - white +minetest.register_node('technic:homedecor_glowlight_small_cube_white', { + description = S("White Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3 }, + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "White Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_off(pos, 50, "technic:homedecor_glowlight_small_cube_white_active") + end +}) + +minetest.register_node('technic:homedecor_glowlight_small_cube_white_active', { + description = S("White Glowlight (small cube)"), + drawtype = "nodebox", + tiles = { + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_tb.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png', + 'technic_homedecor_glowlight_cube_white_sides.png' + }, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + node_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 } + }, + + sunlight_propagates = false, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + light_source = minetest.LIGHT_MAX-1, + sounds = default.node_sound_wood_defaults(), + + groups = { snappy = 3, not_in_creative_inventory=1}, + drop="technic:homedecor_glowlight_small_cube_white", + on_place = function(itemstack, placer, pointed_thing) + technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing) + return itemstack + end, + on_construct = function(pos) + technic.inductive_on_construct(pos, 50, "White Glowlight (small cube)") + end, + on_punch = function(pos, node, puncher) + technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_small_cube_white") + end +}) + +technic.register_inductive_machine("technic:homedecor_glowlight_half_yellow") +technic.register_inductive_machine("technic:homedecor_glowlight_half_white") +technic.register_inductive_machine("technic:homedecor_glowlight_quarter_yellow") +technic.register_inductive_machine("technic:homedecor_glowlight_quarter_white") +technic.register_inductive_machine("technic:homedecor_glowlight_small_cube_yellow") +technic.register_inductive_machine("technic:homedecor_glowlight_small_cube_white") diff --git a/mods/technic_plus/technic/machines/MV/power_radiator.lua b/mods/technic_plus/technic/machines/MV/power_radiator.lua new file mode 100644 index 0000000..49d81ec --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/power_radiator.lua @@ -0,0 +1,220 @@ +-- The power radiator fuctions like an inductive charger +-- only better in the game setting. +-- The purpose is to allow small appliances to receive power +-- without the overhead of the wiring needed for larger machines. +-- +-- The power radiator will consume power corresponding to the +-- sum(power rating of the attached appliances)/0.06 +-- Using inductive power transfer is very inefficient so this is +-- set to the factor 0.06. +-- +-- Punching the radiator will toggle the power state of all attached appliances. + +local power_radius = 12 + + +minetest.register_craft({ + output = 'technic:power_radiator 1', + recipe = { + {'technic:stainless_steel_ingot', 'technic:mv_transformer', 'technic:stainless_steel_ingot'}, + {'technic:copper_coil', 'technic:machine_casing', 'technic:copper_coil'}, + {'technic:rubber', 'technic:mv_cable', 'technic:rubber'}, + } +}) + +------------------------------------------------------------------ +-- API for inductive powered nodes: +-- Use the functions below to set the corresponding callbacks +-- Also two nodes are needed: The inactive and the active one. The active must be called _active . +------------------------------------------------------------------ +-- Register a new appliance using this function + +technic.inductive_nodes = {} +technic.register_inductive_machine = function(name) + table.insert(technic.inductive_nodes, name) + table.insert(technic.inductive_nodes, name.."_active") +end + +-- Appliances: +-- has_supply: pos of supply node if the appliance has a power radiator near with sufficient power for the demand +-- EU_demand: The power demand of the device. +-- EU_charge: Actual use. set to EU_demand if active==1 +-- active: set to 1 if the device is on +technic.inductive_on_construct = function(pos, eu_demand, infotext) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", infotext) + meta:set_int("technic_inductive_power_machine", 1) + meta:set_int("EU_demand", eu_demand) -- The power demand of this appliance + meta:set_int("EU_charge", 0) -- The actual power draw of this appliance + meta:set_string("has_supply", "") -- Register whether we are powered or not. For use with several radiators. + meta:set_int("active", 0) -- If the appliance can be turned on and off by using it use this. +end + +technic.inductive_on_punch_off = function(pos, eu_charge, swapnode) + local meta = minetest.get_meta(pos) + if meta:get_string("has_supply") ~= "" then + technic.swap_node(pos, swapnode) + meta:set_int("active", 1) + meta:set_int("EU_charge",eu_charge) + --print("-----------") + --print("Turn on:") + --print("EU_charge: "..meta:get_int("EU_charge")) + --print("has_supply: "..meta:get_string("has_supply")) + --print("<----------->") + end +end + +technic.inductive_on_punch_on = function(pos, eu_charge, swapnode) + local meta = minetest.get_meta(pos) + technic.swap_node(pos, swapnode) + meta:set_int("active", 0) + meta:set_int("EU_charge",eu_charge) + --print("-----------") + --print("Turn off:") + --print("EU_charge: "..meta:get_int("EU_charge")) + --print("has_supply: "..meta:get_string("has_supply")) + --print("<---------->") +end + +local shutdown_inductive_appliances = function(pos) + -- The supply radius + local rad = power_radius + -- If the radiator is removed. turn off all appliances in region + -- If another radiator is near it will turn on the appliances again + local positions = minetest.find_nodes_in_area( + {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}, + {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}, + technic.inductive_nodes) + for _, pos1 in pairs(positions) do + local meta1 = minetest.get_meta(pos1) + -- If the appliance is belonging to this node + if meta1:get_string("has_supply") == pos.x..pos.y..pos.z then + local nodename = minetest.get_node(pos1).name + -- Swap the node and make sure it is off and unpowered + if string.sub(nodename, -7) == "_active" then + technic.swap_node(pos1, string.sub(nodename, 1, -8)) + meta1:set_int("active", 0) + meta1:set_int("EU_charge", 0) + end + meta1:set_string("has_supply", "") + end + end +end + +local toggle_on_off_inductive_appliances = function(pos, node, puncher) + if pos == nil then return end + -- The supply radius + local rad = power_radius + local positions = minetest.find_nodes_in_area( + {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}, + {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}, + technic.inductive_nodes) + for _, pos1 in pairs(positions) do + local meta1 = minetest.get_meta(pos1) + if meta1:get_string("has_supply") == pos.x..pos.y..pos.z then + minetest.punch_node(pos1) + end + end +end + +minetest.register_node("technic:power_radiator", { + description = "MV Power Radiator", + tiles = {"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png", + "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + drawtype = "nodebox", + paramtype = "light", + is_ground_content = true, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("MV_EU_demand",1) -- Demand on the primary side when idle + meta:set_int("connected_EU_demand",0) -- Potential demand of connected appliances + meta:set_string("infotext", "MV Power Radiator") + end, + on_dig = function(pos, node, digger) + shutdown_inductive_appliances(pos) + return minetest.node_dig(pos, node, digger) + end, + on_punch = function(pos, node, puncher) + toggle_on_off_inductive_appliances(pos, node, puncher) + end +}) + +minetest.register_abm({ + label = "Machines: run power radiator", + nodenames = {"technic:power_radiator"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local eu_input = meta:get_int("MV_EU_input") + local eu_demand = meta:get_int("MV_EU_demand") + + -- Power off automatically if no longer connected to a switching station + technic.switching_station_timeout_count(pos, "MV") + + if eu_input == 0 then + -- No power + meta:set_string("infotext", "MV Power Radiator is unpowered"); + -- meta:set_int("active", 1) -- used for setting textures someday maybe + shutdown_inductive_appliances(pos) + meta:set_int("connected_EU_demand", 0) + meta:set_int("MV_EU_demand",1) + elseif eu_input == eu_demand then + -- Powered and ready + + -- The maximum EU sourcing a single radiator can provide. + local max_charge = 30000 -- == the max EU demand of the radiator + local connected_EU_demand = meta:get_int("connected_EU_demand") + + -- Efficiency factor + local eff_factor = 0.06 + -- The supply radius + local rad = power_radius + + local used_charge = 0 + + -- Index all nodes within supply range + local positions = minetest.find_nodes_in_area( + {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}, + {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}, + technic.inductive_nodes) + for _, pos1 in pairs(positions) do + local meta1 = minetest.get_meta(pos1) + -- If not supplied see if this node can handle it. + if meta1:get_string("has_supply") == "" then + -- if demand surpasses the capacity of this node, don't bother adding it. + local app_eu_demand = math.floor(meta1:get_int("EU_demand") / eff_factor) + if connected_EU_demand + app_eu_demand <= max_charge then + -- We can power the appliance. Register, and spend power if it is on. + connected_EU_demand = connected_EU_demand + app_eu_demand + + meta1:set_string("has_supply", pos.x..pos.y..pos.z) + --Always 0: used_charge = math.floor(used_charge + meta1:get_int("EU_charge") / eff_factor) + end + elseif meta1:get_string("has_supply") == pos.x..pos.y..pos.z then + -- The appliance has power from this node. Spend power if it is on. + used_charge = used_charge + math.floor(meta1:get_int("EU_charge") / eff_factor) + end + meta:set_string("infotext", "MV Power Radiator is powered (" + ..math.floor(used_charge / max_charge * 100) + .."% of maximum power)"); + if used_charge == 0 then + meta:set_int("MV_EU_demand", 1) -- Still idle + else + meta:set_int("MV_EU_demand", used_charge) + end + end + -- Save state + meta:set_int("connected_EU_demand", connected_EU_demand) + end + end, +}) + +technic.register_machine("MV", "technic:power_radiator", technic.receiver) + diff --git a/mods/technic_plus/technic/machines/MV/solar_array.lua b/mods/technic_plus/technic/machines/MV/solar_array.lua new file mode 100644 index 0000000..4077a5c --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/solar_array.lua @@ -0,0 +1,14 @@ + +minetest.register_craft({ + output = 'technic:solar_array_mv 1', + recipe = { + {'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'}, + {'technic:carbon_steel_ingot', 'technic:mv_transformer', 'technic:carbon_steel_ingot'}, + {'', 'technic:mv_cable', ''}, + } +}) + +technic.register_solar_array({tier="MV", power=30}) + +-- compatibility alias for upgrading from old versions of technic +minetest.register_alias("technic:solar_panel_mv", "technic:solar_array_mv") diff --git a/mods/technic_plus/technic/machines/MV/tool_workshop.lua b/mods/technic_plus/technic/machines/MV/tool_workshop.lua new file mode 100644 index 0000000..e922224 --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/tool_workshop.lua @@ -0,0 +1,126 @@ +-- Tool workshop +-- This machine repairs tools. + +minetest.register_alias("tool_workshop", "technic:tool_workshop") + +local S = technic.getter + +local tube_entry = "^pipeworks_tube_connection_wooden.png" + +minetest.register_craft({ + output = 'technic:tool_workshop', + recipe = { + {'group:wood', 'default:diamond', 'group:wood'}, + {'mesecons_pistons:piston_sticky_off', 'technic:machine_casing', 'technic:carbon_cloth'}, + {'default:obsidian', 'technic:mv_cable', 'default:obsidian'}, + } +}) + +local workshop_demand = {5000, 3500, 2000} + +local workshop_formspec = + "size[8,9;]".. + "list[context;src;3,1;1,1;]".. + "label[0,0;"..S("%s Tool Workshop"):format("MV").."]".. + "list[context;upgrade1;1,3;1,1;]".. + "list[context;upgrade2;2,3;1,1;]".. + "label[1,4;"..S("Upgrade Slots").."]".. + "list[current_player;main;0,5;8,4;]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;upgrade1]".. + "listring[current_player;main]".. + "listring[context;upgrade2]".. + "listring[current_player;main]" + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local eu_input = meta:get_int("MV_EU_input") + local machine_name = S("%s Tool Workshop"):format("MV") + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int("MV_EU_demand", workshop_demand[1]) + meta:set_int("MV_EU_input", 0) + return + end + + local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) + + local repairable = false + local srcstack = inv:get_stack("src", 1) + if not srcstack:is_empty() then + local itemdef = minetest.registered_items[srcstack:get_name()] + if itemdef and + (not itemdef.wear_represents or + itemdef.wear_represents == "mechanical_wear") and + srcstack:get_wear() ~= 0 then + repairable = true + end + end + technic.handle_machine_pipeworks(pos, tube_upgrade, function(pos2, x_velocity, z_velocity) + if not repairable then + technic.send_items(pos2, x_velocity, z_velocity, "src") + end + end) + if not repairable then + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_int("MV_EU_demand", 0) + return + end + + if eu_input < workshop_demand[EU_upgrade+1] then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= workshop_demand[EU_upgrade+1] then + meta:set_string("infotext", S("%s Active"):format(machine_name)) + srcstack:add_wear(-1000) + inv:set_stack("src", 1, srcstack) + end + meta:set_int("MV_EU_demand", workshop_demand[EU_upgrade+1]) +end + +minetest.register_node("technic:tool_workshop", { + description = S("%s Tool Workshop"):format("MV"), + paramtype2 = "facedir", + tiles = { + "technic_workshop_top.png"..tube_entry, + "technic_machine_bottom.png"..tube_entry, + "technic_workshop_side.png"..tube_entry, + "technic_workshop_side.png"..tube_entry, + "technic_workshop_side.png"..tube_entry, + "technic_workshop_side.png" + }, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_mv=1, tubedevice=1, tubedevice_receiver=1}, + connect_sides = {"bottom", "back", "left", "right"}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Tool Workshop"):format("MV")) + meta:set_string("formspec", workshop_formspec) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("upgrade1", 1) + inv:set_size("upgrade2", 1) + end, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + tube = { + can_insert = function (pos, node, stack, direction) + return minetest.get_meta(pos):get_inventory():room_for_item("src", stack) + end, + insert_object = function (pos, node, stack, direction) + return minetest.get_meta(pos):get_inventory():add_item("src", stack) + end, + connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1}, + }, + technic_run = run, + after_place_node = pipeworks.after_place, + after_dig_node = technic.machine_after_dig_node +}) + +technic.register_machine("MV", "technic:tool_workshop", technic.receiver) + diff --git a/mods/technic_plus/technic/machines/MV/wind_mill.lua b/mods/technic_plus/technic/machines/MV/wind_mill.lua new file mode 100644 index 0000000..1baf54c --- /dev/null +++ b/mods/technic_plus/technic/machines/MV/wind_mill.lua @@ -0,0 +1,96 @@ + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:wind_mill_frame 5', + recipe = { + {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'}, + {'', 'technic:carbon_steel_ingot', ''}, + {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'technic:wind_mill', + recipe = { + {'', 'basic_materials:motor', ''}, + {'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'}, + {'', 'technic:mv_cable', ''}, + } +}) + +minetest.register_node("technic:wind_mill_frame", { + description = S("Wind Mill Frame"), + drawtype = "glasslike_framed", + tiles = {"technic_carbon_steel_block.png", "default_glass.png"}, + sunlight_propagates = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + paramtype = "light", +}) + +local function check_wind_mill(pos) + if pos.y < 30 then + return false + end + pos = {x=pos.x, y=pos.y, z=pos.z} + for i = 1, 20 do + pos.y = pos.y - 1 + local node = minetest.get_node_or_nil(pos) + if not node then + -- we reached CONTENT_IGNORE, we can assume, that nothing changed + -- as the user will have to load the block to change it + return + end + if node.name ~= "technic:wind_mill_frame" then + return false + end + end + return true +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local machine_name = S("Wind %s Generator"):format("MV") + + local check = check_wind_mill(pos) + if check == false then + meta:set_int("MV_EU_supply", 0) + meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name)) + elseif check == true then + local power = math.min(pos.y * 100, 5000) + meta:set_int("MV_EU_supply", power) + meta:set_string("infotext", S("@1 (@2)", machine_name, + technic.EU_string(power))) + end + -- check == nil: assume nothing has changed +end + +minetest.register_node("technic:wind_mill", { + description = S("Wind %s Generator"):format("MV"), + tiles = {"technic_carbon_steel_block.png"}, + paramtype2 = "facedir", + groups = {cracky=1, technic_machine=1, technic_mv=1}, + connect_sides = {"top", "bottom", "back", "left", "right"}, + sounds = default.node_sound_stone_defaults(), + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Main box + {-0.1, -0.1, -0.5, 0.1, 0.1, -0.6}, -- Shaft + {-0.1, -1, -0.6, 0.1, 1, -0.7}, -- Vertical blades + {-1, -0.1, -0.6, 1, 0.1, -0.7}, -- Horizontal blades + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Wind %s Generator"):format("MV")) + meta:set_int("MV_EU_supply", 0) + end, + technic_run = run, +}) + +technic.register_machine("MV", "technic:wind_mill", technic.producer) + diff --git a/mods/technic_plus/technic/machines/compat/digtron.lua b/mods/technic_plus/technic/machines/compat/digtron.lua new file mode 100644 index 0000000..c5aeddd --- /dev/null +++ b/mods/technic_plus/technic/machines/compat/digtron.lua @@ -0,0 +1,30 @@ +-- +-- Compatibility hacks for digtron to work well with technic plus new network system +-- +-- More information: +-- https://github.com/mt-mods/technic/issues/100 +-- + +local function power_connector_compat() + local digtron_technic_run = minetest.registered_nodes["digtron:power_connector"].technic_run + minetest.override_item("digtron:power_connector",{ + technic_run = function(pos, node) + local network_id = technic.pos2network(pos) + local sw_pos = network_id and technic.network2sw_pos(network_id) + local meta = minetest.get_meta(pos) + meta:set_string("HV_network", sw_pos and minetest.pos_to_string(sw_pos) or "") + return digtron_technic_run(pos, node) + end, + technic_on_disable = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("HV_network", "") + meta:set_string("HV_EU_input", "") + end, + }) +end + +minetest.register_on_mods_loaded(function() + if minetest.registered_nodes["digtron:power_connector"] then + power_connector_compat() + end +end) diff --git a/mods/technic_plus/technic/machines/init.lua b/mods/technic_plus/technic/machines/init.lua new file mode 100644 index 0000000..ba51587 --- /dev/null +++ b/mods/technic_plus/technic/machines/init.lua @@ -0,0 +1,180 @@ +local path = technic.modpath.."/machines" + +technic.digilines = { + rules = { + -- digilines.rules.default + {x= 1,y= 0,z= 0},{x=-1,y= 0,z= 0}, -- along x beside + {x= 0,y= 0,z= 1},{x= 0,y= 0,z=-1}, -- along z beside + {x= 1,y= 1,z= 0},{x=-1,y= 1,z= 0}, -- 1 node above along x diagonal + {x= 0,y= 1,z= 1},{x= 0,y= 1,z=-1}, -- 1 node above along z diagonal + {x= 1,y=-1,z= 0},{x=-1,y=-1,z= 0}, -- 1 node below along x diagonal + {x= 0,y=-1,z= 1},{x= 0,y=-1,z=-1}, -- 1 node below along z diagonal + -- added rules for digi cable + {x = 0, y = -1, z = 0}, -- along y below + } +} + +-- https://github.com/mt-mods/technic/issues/100 +dofile(path.."/compat/digtron.lua") + +dofile(path.."/network.lua") + +dofile(path.."/register/init.lua") + +-- Tiers +dofile(path.."/LV/init.lua") +dofile(path.."/MV/init.lua") +dofile(path.."/HV/init.lua") + +dofile(path.."/switching_station.lua") +dofile(path.."/switching_station_globalstep.lua") + +dofile(path.."/power_monitor.lua") +dofile(path.."/supply_converter.lua") + +dofile(path.."/other/init.lua") + +-- +-- Technic power network administrative functions +-- + +local active_networks = technic.active_networks +local networks = technic.networks +local cables = technic.cables +-- +-- Enable / disable technic globalstep +-- +technic.powerctrl_state = true +minetest.register_chatcommand("powerctrl", { + params = "[on|off]", + description = "Enables or disables technic network globalstep handler", + privs = { [technic.config:get("admin_priv")] = true }, + func = function(name, state) + if state == "on" then + technic.powerctrl_state = true + elseif state == "off" then + technic.powerctrl_state = false + end + minetest.chat_send_player(name, ("Technic network globalstep %s."):format( + technic.powerctrl_state and "enabled" or "disabled" + )) + end +}) + +-- +-- List all active networks with additional data +-- +minetest.register_chatcommand("technic_get_active_networks", { + params = "[minlag]", + description = "list all active networks with additional network data", + privs = { [technic.config:get("admin_priv")] = true }, + func = function(name, minlag) + minlag = tonumber(minlag) or 0 + local activecount = 0 + local network_info = {} + local netcount = 0 + local nodecount = 0 + local function align(s, w) + s = tostring(s) + return string.rep(' ', w - #s) .. s + end + local function net2str(id) + local p=technic.network2pos(id) + return align(("%s,%s,%s"):format(p.x,p.y,p.z),21) + end + for id,net in pairs(active_networks) do + if minlag == 0 or (net.lag and net.lag >= minlag * 1000) then + activecount = activecount + 1 + table.insert(network_info, ("Pos:%s PR:%s RE:%s BA:%s Skip:%s Lag:%sms"):format( + net2str(id), align(#net.PR_nodes, 4), align(#net.RE_nodes, 4), align(#net.BA_nodes, 4), + align(net.skip, 3), net.lag and align(("%0.2f"):format(net.lag / 1000), 6) or "" + )) + end + end + for _ in pairs(networks) do netcount = netcount + 1 end + for _ in pairs(cables) do nodecount = nodecount + 1 end + minetest.chat_send_player(name, + ("Cached networks: %d active, %d total, %d nodes, %0.2f max lag.\n%s"):format( + activecount, netcount, nodecount, technic.get_max_lag(), table.concat(network_info, "\n") + )) + end +}) + +-- +-- Clear technic active networks +-- +minetest.register_chatcommand("technic_flush_switch_cache", { + description = "removes all active networks from the cache", + privs = { [technic.config:get("admin_priv")] = true }, + func = function(name) + local activecount = 0 + for id in pairs(active_networks) do + activecount = activecount + 1 + active_networks[id] = nil + end + minetest.chat_send_player(name, ("Network data removed: %d active networks deactivated."):format(activecount)) + end +}) + +-- +-- Completely clear all technic network caches +-- +minetest.register_chatcommand("technic_clear_network_data", { + description = "removes all networks and network nodes from the cache", + privs = { [technic.config:get("admin_priv")] = true }, + func = function(name) + -- Clear all network data keeping all reference links intact + local activecount = 0 + local netcount = 0 + local nodecount = 0 + for id in pairs(active_networks) do + activecount = activecount + 1 + active_networks[id] = nil + end + for id in pairs(networks) do + netcount = netcount + 1 + networks[id] = nil + end + for id in pairs(cables) do + nodecount = nodecount + 1 + cables[id] = nil + end + minetest.chat_send_player(name, string.format( + "Network data removed: %d active networks, %d total networks, %d network nodes.", + activecount, netcount, nodecount + )) + end +}) + +-- +-- Metadata cleanup LBM, removes old metadata values from nodes +-- +--luacheck: ignore 511 +if false then + minetest.register_lbm({ + name = "technic:metadata-cleanup", + nodenames = { + "group:technic_machine", + "group:technic_all_tiers", + "technic:switching_station", + "technic:power_monitor", + }, + action = function(pos, node) + -- Delete all listed metadata key/value pairs from technic machines + local keys = { + "LV_EU_timeout", "MV_EU_timeout", "HV_EU_timeout", + "LV_network", "MV_network", "HV_network", + "active_pos", "supply", "demand", + "battery_count", "battery_charge", "battery_charge_max", + } + local meta = minetest.get_meta(pos) + for _,key in ipairs(keys) do + -- Value of `""` will delete the key. + meta:set_string(key, "") + end + if node.name == "technic:switching_station" then + meta:set_string("active", "") + end + end, + }) +end diff --git a/mods/technic_plus/technic/machines/network.lua b/mods/technic_plus/technic/machines/network.lua new file mode 100644 index 0000000..f6df445 --- /dev/null +++ b/mods/technic_plus/technic/machines/network.lua @@ -0,0 +1,586 @@ +-- +-- Power network specific functions and data should live here +-- +local S = technic.getter + +local switch_max_range = tonumber(technic.config:get("switch_max_range")) +local off_delay_seconds = tonumber(technic.config:get("switch_off_delay_seconds")) + +technic.active_networks = {} +local networks = {} +technic.networks = networks +local cables = {} +technic.cables = cables + +local poshash = minetest.hash_node_position +local hashpos = minetest.get_position_from_hash + +function technic.create_network(sw_pos) + local network_id = poshash({x=sw_pos.x,y=sw_pos.y-1,z=sw_pos.z}) + technic.build_network(network_id) + return network_id +end + +function technic.activate_network(network_id, timeout) + -- timeout is optional ttl for network in seconds, if not specified use default + local network = networks[network_id] + if network then + -- timeout is absolute time in microseconds + network.timeout = minetest.get_us_time() + ((timeout or off_delay_seconds) * 1000 * 1000) + technic.active_networks[network_id] = network + end +end + +function technic.sw_pos2tier(pos, use_vm) + -- Get cable tier for switching station or nil if no cable + -- use_vm true to use VoxelManip to load node + local cable_pos = {x=pos.x,y=pos.y-1,z=pos.z} + if use_vm then + technic.get_or_load_node(cable_pos) + end + return technic.get_cable_tier(minetest.get_node(cable_pos).name) +end + +-- Destroy network data +function technic.remove_network(network_id) + for pos_hash,cable_net_id in pairs(cables) do + if cable_net_id == network_id then + cables[pos_hash] = nil + end + end + networks[network_id] = nil + technic.active_networks[network_id] = nil +end + +-- Remove machine or cable from network +local network_node_arrays = {"PR_nodes","BA_nodes","RE_nodes"} +function technic.remove_network_node(network_id, pos) + local network = networks[network_id] + if not network then return end + -- Clear hash tables, cannot use table.remove + local node_id = poshash(pos) + cables[node_id] = nil + network.all_nodes[node_id] = nil + -- TODO: All following things can be skipped if node is not machine + -- check here if it is or is not cable + -- or add separate function to remove cables and move responsibility to caller + -- Clear indexed arrays, do NOT leave holes + local machine_removed = false + for _,tblname in ipairs(network_node_arrays) do + local tbl = network[tblname] + for i=#tbl,1,-1 do + local mpos = tbl[i] + if mpos.x == pos.x and mpos.y == pos.y and mpos.z == pos.z then + table.remove(tbl, i) + machine_removed = true + break + end + end + end + if machine_removed then + -- Machine can still be in world, just not connected to any network. If so then disable it. + local node = minetest.get_node(pos) + technic.disable_machine(pos, node) + end +end + +function technic.sw_pos2network(pos) + return cables[poshash({x=pos.x,y=pos.y-1,z=pos.z})] +end + +function technic.sw_pos2network(pos) + return cables[poshash({x=pos.x,y=pos.y-1,z=pos.z})] +end + +function technic.pos2network(pos) + return cables[poshash(pos)] +end + +function technic.network2pos(network_id) + return hashpos(network_id) +end + +function technic.network2sw_pos(network_id) + -- Return switching station position for network. + -- It is not guaranteed that position actually contains switching station. + local sw_pos = hashpos(network_id) + sw_pos.y = sw_pos.y + 1 + return sw_pos +end + +function technic.network_infotext(network_id, text) + if networks[network_id] == nil then return end + if text then + networks[network_id].infotext = text + else + return networks[network_id].infotext + end +end + +local node_timeout = {} +local default_timeout = 2 + +function technic.set_default_timeout(timeout) + default_timeout = timeout or 2 +end + +function technic.get_timeout(tier, pos) + if node_timeout[tier] == nil then + -- it is normal that some multi tier nodes always drop here when checking all LV, MV and HV tiers + return 0 + end + return node_timeout[tier][poshash(pos)] or 0 +end + +local function touch_node(tier, pos, timeout) + if node_timeout[tier] == nil then + -- this should get built up during registration + node_timeout[tier] = {} + end + node_timeout[tier][poshash(pos)] = timeout or default_timeout +end +technic.touch_node = touch_node + +function technic.disable_machine(pos, node) + local nodedef = minetest.registered_nodes[node.name] + if nodedef and nodedef.technic_disabled_machine_name then + node.name = nodedef.technic_disabled_machine_name + minetest.swap_node(pos, node) + elseif nodedef and nodedef.technic_on_disable then + nodedef.technic_on_disable(pos, node) + end + if nodedef then + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description)) + end + local node_id = poshash(pos) + for _,nodes in pairs(node_timeout) do + nodes[node_id] = nil + end +end + +-- +-- Network overloading (incomplete cheat mitigation) +-- +local overload_reset_time = tonumber(technic.config:get("network_overload_reset_time")) +local overloaded_networks = {} + +local function overload_network(network_id) + local network = networks[network_id] + if network then + network.supply = 0 + network.battery_charge = 0 + end + overloaded_networks[network_id] = minetest.get_us_time() + (overload_reset_time * 1000 * 1000) +end +technic.overload_network = overload_network + +local function reset_overloaded(network_id) + local remaining = math.max(0, overloaded_networks[network_id] - minetest.get_us_time()) + if remaining == 0 then + -- Clear cache, remove overload and restart network + technic.remove_network(network_id) + overloaded_networks[network_id] = nil + end + -- Returns 0 when network reset or remaining time if reset timer has not expired yet + return remaining +end +technic.reset_overloaded = reset_overloaded + +local function is_overloaded(network_id) + return overloaded_networks[network_id] +end +technic.is_overloaded = is_overloaded + +-- +-- Functions to traverse the electrical network +-- + +-- Add a machine node to the LV/MV/HV network +local function add_network_machine(nodes, pos, network_id, all_nodes, multitier) + local node_id = poshash(pos) + local net_id_old = cables[node_id] + if net_id_old == nil or (multitier and net_id_old ~= network_id and all_nodes[node_id] == nil) then + -- Add machine to network only if it is not already added + table.insert(nodes, pos) + -- FIXME: Machines connecting to multiple networks should have way to store multiple network ids + cables[node_id] = network_id + all_nodes[node_id] = pos + return true + elseif not multitier and net_id_old ~= network_id then + -- Do not allow running from multiple networks, trigger overload + overload_network(network_id) + overload_network(net_id_old) + local meta = minetest.get_meta(pos) + meta:set_string("infotext",S("Network Overloaded")) + end +end + +-- Add a wire node to the LV/MV/HV network +local function add_cable_node(nodes, pos, network_id, queue) + local node_id = poshash(pos) + if not cables[node_id] then + cables[node_id] = network_id + nodes[node_id] = pos + table.insert(queue, pos) + end +end + +-- Generic function to add found connected nodes to the right classification array +local function add_network_node(PR_nodes, RE_nodes, BA_nodes, all_nodes, pos, machines, tier, network_id, queue) + technic.get_or_load_node(pos) + local name = minetest.get_node(pos).name + + if technic.is_tier_cable(name, tier) then + add_cable_node(all_nodes, pos, network_id, queue) + elseif machines[name] then + if machines[name] == technic.producer then + add_network_machine(PR_nodes, pos, network_id, all_nodes) + elseif machines[name] == technic.receiver then + add_network_machine(RE_nodes, pos, network_id, all_nodes) + elseif machines[name] == technic.producer_receiver then + if add_network_machine(PR_nodes, pos, network_id, all_nodes, true) then + table.insert(RE_nodes, pos) + end + elseif machines[name] == technic.battery then + add_network_machine(BA_nodes, pos, network_id, all_nodes) + end + end +end + +-- Generic function to add single nodes to the right classification array of existing network +function technic.add_network_node(pos, network) + add_network_node( + network.PR_nodes, + network.RE_nodes, + network.BA_nodes, + network.all_nodes, + pos, + technic.machines[network.tier], + network.tier, + network.id, + {} + ) +end + +-- Traverse a network given a list of machines and a cable type name +local function traverse_network(PR_nodes, RE_nodes, BA_nodes, all_nodes, pos, machines, tier, network_id, queue) + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y+1, z=pos.z}, + {x=pos.x, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}} + for i, cur_pos in pairs(positions) do + if not all_nodes[poshash(cur_pos)] then + add_network_node(PR_nodes, RE_nodes, BA_nodes, all_nodes, cur_pos, machines, tier, network_id, queue) + end + end +end + +local function touch_nodes(list, tier) + for _, pos in ipairs(list) do + touch_node(tier, pos) -- Touch node + end +end + +local function get_network(network_id, tier) + local cached = networks[network_id] + if cached and cached.tier == tier then + touch_nodes(cached.PR_nodes, tier) + touch_nodes(cached.BA_nodes, tier) + touch_nodes(cached.RE_nodes, tier) + return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes + end + return technic.build_network(network_id) +end + +function technic.add_network_branch(queue, network) + -- Adds whole branch to network, queue positions can be used to bypass sub branches + local PR_nodes = network.PR_nodes -- Indexed array + local BA_nodes = network.BA_nodes -- Indexed array + local RE_nodes = network.RE_nodes -- Indexed array + local all_nodes = network.all_nodes -- Hash table + local network_id = network.id + local tier = network.tier + local machines = technic.machines[tier] + local sw_pos = technic.network2sw_pos(network_id) + --print(string.format("technic.add_network_branch(%s, %s, %.17g)",queue,minetest.pos_to_string(sw_pos),network.id)) + while next(queue) do + local to_visit = {} + for _, pos in ipairs(queue) do + if vector.distance(pos, sw_pos) > switch_max_range then + -- max range exceeded + return + end + traverse_network(PR_nodes, RE_nodes, BA_nodes, all_nodes, pos, + machines, tier, network_id, to_visit) + end + queue = to_visit + end +end + +-- Battery charge status updates for network +local function update_battery(self, charge, max_charge, supply, demand) + self.battery_charge = self.battery_charge + charge + self.battery_charge_max = self.battery_charge_max + max_charge + self.battery_supply = self.battery_supply + supply + self.battery_demand = self.battery_demand + demand + if demand ~= 0 then + self.BA_count_active = self.BA_count_active + 1 + self.BA_charge_active = self.BA_charge_active + charge + end +end + +-- Moving average function generator +local function sma(period) + local values = {} + local index = 1 + local sum = 0 + return function(n) + -- Add new value and return average + sum = sum - (values[index] or 0) + n + values[index] = n + index = index ~= period and index + 1 or 1 + return sum / #values + end +end + +function technic.build_network(network_id) + technic.remove_network(network_id) + local sw_pos = technic.network2sw_pos(network_id) + local tier = technic.sw_pos2tier(sw_pos) + if not tier then + return + end + local network = { + -- Basic network data and lookup table for attached nodes (no switching stations) + id = network_id, tier = tier, all_nodes = {}, + -- Indexed arrays for iteration by machine type + PR_nodes = {}, RE_nodes = {}, BA_nodes = {}, + -- Power generation, usage and capacity related variables + supply = 0, demand = 0, battery_charge = 0, battery_charge_max = 0, + BA_count_active = 0, BA_charge_active = 0, battery_supply = 0, battery_demand = 0, + -- Battery status update function + update_battery = update_battery, + -- Network activation and excution control + timeout = 0, skip = 0, lag = 0, average_lag = sma(5) + } + -- Add first cable (one that is holding network id) and build network + local queue = {} + add_cable_node(network.all_nodes, technic.network2pos(network_id), network_id, queue) + technic.add_network_branch(queue, network) + network.battery_count = #network.BA_nodes + -- Add newly built network to cache array + networks[network_id] = network + -- And return producers, batteries and receivers (should this simply return network?) + return network.PR_nodes, network.BA_nodes, network.RE_nodes +end + +-- +-- Execute technic power network +-- +local node_technic_run = {} +minetest.register_on_mods_loaded(function() + for name, _ in pairs(technic.machine_tiers) do + if type(minetest.registered_nodes[name].technic_run) == "function" then + node_technic_run[name] = minetest.registered_nodes[name].technic_run + end + end +end) + +local function run_nodes(list, vm, run_stage, network) + for _, pos in ipairs(list) do + local node = minetest.get_node_or_nil(pos) + if not node then + vm:read_from_map(pos, pos) + node = minetest.get_node_or_nil(pos) + end + if node and node.name and node_technic_run[node.name] then + node_technic_run[node.name](pos, node, run_stage, network) + end + end +end + +local mesecons_path = minetest.get_modpath("mesecons") +local digilines_path = minetest.get_modpath("digilines") + +function technic.network_run(network_id) + -- + -- !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! + -- TODO: This function requires a lot of cleanup + -- It is moved here from switching_station.lua and still + -- contain a lot of switching station specific stuff which + -- should be removed and/or refactored. + -- + + local pos = technic.network2sw_pos(network_id) + local t0 = minetest.get_us_time() + + local PR_nodes + local BA_nodes + local RE_nodes + + local tier = technic.sw_pos2tier(pos) + local network + if tier then + PR_nodes, BA_nodes, RE_nodes = get_network(network_id, tier) + if technic.is_overloaded(network_id) then return end + network = networks[network_id] + else + --dprint("Not connected to a network") + technic.network_infotext(network_id, S("%s Has No Network"):format(S("Switching Station"))) + return + end + + -- Reset battery data for updates + network.battery_charge = 0 + network.battery_charge_max = 0 + network.battery_supply = 0 + network.battery_demand = 0 + network.BA_count_active = 0 + network.BA_charge_active = 0 + + local vm = VoxelManip() + run_nodes(PR_nodes, vm, technic.producer) + run_nodes(RE_nodes, vm, technic.receiver) + run_nodes(BA_nodes, vm, technic.battery, network) + + -- Strings for the meta data + local eu_demand_str = tier.."_EU_demand" + local eu_input_str = tier.."_EU_input" + local eu_supply_str = tier.."_EU_supply" + + -- Distribute charge equally across multiple batteries. + local charge_distributed = math.floor(network.BA_charge_active / network.BA_count_active) + for n, pos1 in pairs(BA_nodes) do + local meta1 = minetest.get_meta(pos1) + if (meta1:get_int(eu_demand_str) ~= 0) then + meta1:set_int("internal_EU_charge", charge_distributed) + end + end + + -- Get all the power from the PR nodes + local PR_eu_supply = 0 -- Total power + for _, pos1 in pairs(PR_nodes) do + local meta1 = minetest.get_meta(pos1) + PR_eu_supply = PR_eu_supply + meta1:get_int(eu_supply_str) + end + --dprint("Total PR supply:"..PR_eu_supply) + + -- Get all the demand from the RE nodes + local RE_eu_demand = 0 + for _, pos1 in pairs(RE_nodes) do + local meta1 = minetest.get_meta(pos1) + RE_eu_demand = RE_eu_demand + meta1:get_int(eu_demand_str) + end + --dprint("Total RE demand:"..RE_eu_demand) + + technic.network_infotext(network_id, S("@1. Supply: @2 Demand: @3", + S("Switching Station"), technic.EU_string(PR_eu_supply), + technic.EU_string(RE_eu_demand))) + + -- If mesecon signal and power supply or demand changed then + -- send them via digilines. + if mesecons_path and digilines_path and mesecon.is_powered(pos) then + if PR_eu_supply ~= network.supply or + RE_eu_demand ~= network.demand then + local meta = minetest.get_meta(pos) + local channel = meta:get_string("channel") + digilines.receptor_send(pos, technic.digilines.rules, channel, { + supply = PR_eu_supply, + demand = RE_eu_demand + }) + end + end + + -- Data that will be used by the power monitor + network.supply = PR_eu_supply + network.demand = RE_eu_demand + network.battery_count = #BA_nodes + + -- If the PR supply is enough for the RE demand supply them all + local BA_eu_demand = network.battery_demand + if PR_eu_supply >= RE_eu_demand then + --dprint("PR_eu_supply"..PR_eu_supply.." >= RE_eu_demand"..RE_eu_demand) + for _, pos1 in pairs(RE_nodes) do + local meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, eu_demand) + end + -- We have a surplus, so distribute the rest equally to the BA nodes + -- Let's calculate the factor of the demand + PR_eu_supply = PR_eu_supply - RE_eu_demand + local charge_factor = 0 -- Assume all batteries fully charged + if BA_eu_demand > 0 then + charge_factor = PR_eu_supply / BA_eu_demand + end + -- TODO: EU input for all batteries: math.floor(BA_eu_demand * charge_factor * #BA_nodes) + for n, pos1 in pairs(BA_nodes) do + local meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, math.floor(eu_demand * charge_factor)) + --dprint("Charging battery:"..math.floor(eu_demand*charge_factor)) + end + local t1 = minetest.get_us_time() + local diff = t1 - t0 + if diff > 50000 then + minetest.log("warning", "[technic] [+supply] technic_run took " .. diff .. " us at " .. minetest.pos_to_string(pos)) + end + + return + end + + -- If the PR supply is not enough for the RE demand we will discharge the batteries too + local BA_eu_supply = network.battery_supply + if PR_eu_supply + BA_eu_supply >= RE_eu_demand then + --dprint("PR_eu_supply "..PR_eu_supply.."+BA_eu_supply "..BA_eu_supply.." >= RE_eu_demand"..RE_eu_demand) + for _, pos1 in pairs(RE_nodes) do + local meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, eu_demand) + end + -- We have a deficit, so distribute to the BA nodes + -- Let's calculate the factor of the supply + local charge_factor = 0 -- Assume all batteries depleted + if BA_eu_supply > 0 then + charge_factor = (PR_eu_supply - RE_eu_demand) / BA_eu_supply + end + for n,pos1 in pairs(BA_nodes) do + local meta1 = minetest.get_meta(pos1) + local eu_supply = meta1:get_int(eu_supply_str) + meta1:set_int(eu_input_str, math.floor(eu_supply * charge_factor)) + --dprint("Discharging battery:"..math.floor(eu_supply*charge_factor)) + end + local t1 = minetest.get_us_time() + local diff = t1 - t0 + if diff > 50000 then + minetest.log("warning", "[technic] [-supply] technic_run took " .. diff .. " us at " .. minetest.pos_to_string(pos)) + end + + return + end + + -- If the PR+BA supply is not enough for the RE demand: Power only the batteries + local charge_factor = 0 -- Assume all batteries fully charged + if BA_eu_demand > 0 then + charge_factor = PR_eu_supply / BA_eu_demand + end + for n, pos1 in pairs(BA_nodes) do + local meta1 = minetest.get_meta(pos1) + local eu_demand = meta1:get_int(eu_demand_str) + meta1:set_int(eu_input_str, math.floor(eu_demand * charge_factor)) + end + for n, pos1 in pairs(RE_nodes) do + local meta1 = minetest.get_meta(pos1) + meta1:set_int(eu_input_str, 0) + end + + local t1 = minetest.get_us_time() + local diff = t1 - t0 + if diff > 50000 then + minetest.log("warning", "[technic] technic_run took " .. diff .. " us at " .. minetest.pos_to_string(pos)) + end + +end diff --git a/mods/technic_plus/technic/machines/other/anchor.lua b/mods/technic_plus/technic/machines/other/anchor.lua new file mode 100644 index 0000000..59a9482 --- /dev/null +++ b/mods/technic_plus/technic/machines/other/anchor.lua @@ -0,0 +1,129 @@ +local S = technic.getter + +local desc = S("Administrative World Anchor") + +local function compute_forceload_positions(pos, meta) + local radius = meta:get_int("radius") + local minpos = vector.subtract(pos, vector.new(radius, radius, radius)) + local maxpos = vector.add(pos, vector.new(radius, radius, radius)) + local minbpos = {} + local maxbpos = {} + for _, coord in ipairs({"x","y","z"}) do + minbpos[coord] = math.floor(minpos[coord] / 16) * 16 + maxbpos[coord] = math.floor(maxpos[coord] / 16) * 16 + end + local flposes = {} + for x = minbpos.x, maxbpos.x, 16 do + for y = minbpos.y, maxbpos.y, 16 do + for z = minbpos.z, maxbpos.z, 16 do + table.insert(flposes, vector.new(x, y, z)) + end + end + end + return flposes +end + +local function currently_forceloaded_positions(meta) + local ser = meta:get_string("forceloaded") + return ser == "" and {} or minetest.deserialize(ser) +end + +local function forceload_off(meta) + local flposes = currently_forceloaded_positions(meta) + meta:set_string("forceloaded", "") + for _, p in ipairs(flposes) do + minetest.forceload_free_block(p) + end +end + +local function forceload_on(pos, meta) + local want_flposes = compute_forceload_positions(pos, meta) + local have_flposes = {} + for _, p in ipairs(want_flposes) do + if minetest.forceload_block(p) then + table.insert(have_flposes, p) + end + end + meta:set_string("forceloaded", #have_flposes == 0 and "" or minetest.serialize(have_flposes)) +end + +local function set_display(pos, meta) + meta:set_string("infotext", S(meta:get_int("enabled") ~= 0 and "%s Enabled" or "%s Disabled"):format(desc)) + meta:set_string("formspec", + "size[5,3.5]".. + "item_image[0,0;1,1;technic:admin_anchor]".. + "label[1,0;"..minetest.formspec_escape(desc).."]".. + "label[0,1;"..minetest.formspec_escape(S("Owner:").." "..meta:get_string("owner")).."]".. + (meta:get_int("locked") == 0 and + "button[3,1;2,1;lock;"..minetest.formspec_escape(S("Unlocked")).."]" or + "button[3,1;2,1;unlock;"..minetest.formspec_escape(S("Locked")).."]").. + "field[0.25,2.3;1,1;radius;"..minetest.formspec_escape(S("Radius:"))..";"..meta:get_int("radius").."]".. + (meta:get_int("enabled") == 0 and + "button[3,2;2,1;enable;"..minetest.formspec_escape(S("Disabled")).."]" or + "button[3,2;2,1;disable;"..minetest.formspec_escape(S("Enabled")).."]").. + "label[0,3;"..minetest.formspec_escape(S("Keeping %d/%d map blocks loaded"):format( + #currently_forceloaded_positions(meta), #compute_forceload_positions(pos, meta))).."]") +end + +minetest.register_node("technic:admin_anchor", { + description = desc, + drawtype = "normal", + tiles = {"technic_admin_anchor.png"}, + is_ground_content = true, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + after_place_node = function (pos, placer) + local meta = minetest.get_meta(pos) + if placer and placer:is_player() then + meta:set_string("owner", placer:get_player_name()) + end + set_display(pos, meta) + end, + can_dig = function (pos, player) + local meta = minetest.get_meta(pos) + return meta:get_int("locked") == 0 or (player and player:is_player() + and player:get_player_name() == meta:get_string("owner")) + end, + on_destruct = function (pos) + local meta = minetest.get_meta(pos) + forceload_off(meta) + end, + on_receive_fields = function (pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + if (meta:get_int("locked") ~= 0 or fields.lock) and + not (sender and sender:is_player() and + sender:get_player_name() == meta:get_string("owner")) then + return + end + if fields.unlock then meta:set_int("locked", 0) end + if fields.lock then meta:set_int("locked", 1) end + if fields.disable or fields.enable or fields.radius then + forceload_off(meta) + if fields.disable then meta:set_int("enabled", 0) end + if fields.enable then meta:set_int("enabled", 1) end + if fields.radius and string.find(fields.radius, "^[0-9]+$") and tonumber(fields.radius) < 256 then + meta:set_int("radius", fields.radius) + end + if meta:get_int("enabled") ~= 0 then + forceload_on(pos, meta) + end + end + set_display(pos, meta) + end, + mesecons = { + effector = { + action_on = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("enabled", 1) + forceload_on(pos, meta) + set_display(pos, meta) + end, + action_off = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("enabled", 0) + forceload_off(meta) + set_display(pos, meta) + end + } + } +}) diff --git a/mods/technic_plus/technic/machines/other/coal_alloy_furnace.lua b/mods/technic_plus/technic/machines/other/coal_alloy_furnace.lua new file mode 100644 index 0000000..55b0c3c --- /dev/null +++ b/mods/technic_plus/technic/machines/other/coal_alloy_furnace.lua @@ -0,0 +1,176 @@ + +-- Fuel driven alloy furnace. This uses no EUs: + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:coal_alloy_furnace', + recipe = { + {'default:brick', 'default:brick', 'default:brick'}, + {'default:brick', '', 'default:brick'}, + {'default:brick', 'default:brick', 'default:brick'}, + } +}) + +local machine_name = S("Fuel-Fired Alloy Furnace") +local formspec = + "size[8,9]".. + "label[0,0;"..machine_name.."]".. + "image[2,2;1,1;default_furnace_fire_bg.png]".. + "list[context;fuel;2,3;1,1;]".. + "list[context;src;2,1;2,1;]".. + "list[context;dst;5,1;2,2;]".. + "list[current_player;main;0,5;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" + +minetest.register_node("technic:coal_alloy_furnace", { + description = machine_name, + tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec) + meta:set_string("infotext", machine_name) + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 2) + inv:set_size("dst", 4) + end, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, +}) + +minetest.register_node("technic:coal_alloy_furnace_active", { + description = machine_name, + tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", + "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front_active.png"}, + paramtype2 = "facedir", + light_source = 8, + drop = "technic:coal_alloy_furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, +}) + +minetest.register_abm({ + label = "Machines: run coal alloy furnace", + nodenames = {"technic:coal_alloy_furnace", "technic:coal_alloy_furnace_active"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:get_size("src") == 1 then -- Old furnace -> convert it + inv:set_size("src", 2) + inv:set_stack("src", 2, inv:get_stack("src2", 1)) + inv:set_size("src2", 0) + end + + for i, name in pairs({ + "fuel_totaltime", + "fuel_time", + "src_totaltime", + "src_time"}) do + if not meta:get_float(name) then + meta:set_float(name, 0.0) + end + end + + -- Get what to cook if anything + local result = technic.get_recipe("alloy", inv:get_list("src")) + + local was_active = false + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + was_active = true + meta:set_int("fuel_time", meta:get_int("fuel_time") + 1) + if result then + meta:set_int("src_time", meta:get_int("src_time") + 1) + if meta:get_int("src_time") >= result.time then + meta:set_int("src_time", 0) + local result_stack = ItemStack(result.output) + if inv:room_for_item("dst", result_stack) then + inv:set_list("src", result.new_input) + inv:add_item("dst", result_stack) + end + end + else + meta:set_int("src_time", 0) + end + end + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + local percent = math.floor(meta:get_float("fuel_time") / + meta:get_float("fuel_totaltime") * 100) + meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..percent.."%)") + technic.swap_node(pos, "technic:coal_alloy_furnace_active") + meta:set_string("formspec", + "size[8,9]".. + "label[0,0;"..machine_name.."]".. + "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100 - percent)..":default_furnace_fire_fg.png]".. + "list[context;fuel;2,3;1,1;]".. + "list[context;src;2,1;2,1;]".. + "list[context;dst;5,1;2,2;]".. + "list[current_player;main;0,5;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]") + return + end + + local recipe = technic.get_recipe("alloy", inv:get_list("src")) + + if not recipe then + if was_active then + meta:set_string("infotext", S("%s is empty"):format(machine_name)) + technic.swap_node(pos, "technic:coal_alloy_furnace") + meta:set_string("formspec", formspec) + end + return + end + + -- Next take a hard look at the fuel situation + local fuel = nil + local afterfuel + local fuellist = inv:get_list("fuel") + + if fuellist then + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + end + + if fuel.time <= 0 then + meta:set_string("infotext", S("%s Out Of Fuel"):format(machine_name)) + technic.swap_node(pos, "technic:coal_alloy_furnace") + meta:set_string("formspec", formspec) + return + end + + meta:set_string("fuel_totaltime", fuel.time) + meta:set_string("fuel_time", 0) + + inv:set_stack("fuel", 1, afterfuel.items[1]) + end, +}) + diff --git a/mods/technic_plus/technic/machines/other/coal_furnace.lua b/mods/technic_plus/technic/machines/other/coal_furnace.lua new file mode 100644 index 0000000..53a0f8b --- /dev/null +++ b/mods/technic_plus/technic/machines/other/coal_furnace.lua @@ -0,0 +1,5 @@ +local S = technic.getter + +if minetest.registered_nodes["default:furnace"].description == "Furnace" then + minetest.override_item("default:furnace", { description = S("Fuel-Fired Furnace") }) +end diff --git a/mods/technic_plus/technic/machines/other/constructor.lua b/mods/technic_plus/technic/machines/other/constructor.lua new file mode 100644 index 0000000..630a6ce --- /dev/null +++ b/mods/technic_plus/technic/machines/other/constructor.lua @@ -0,0 +1,210 @@ + +local S = technic.getter + +local function deploy_node(inv, slot_name, pos, node, machine_node) + if node.param2 > 3 then return end + if node.name ~= "air" then + if node.name == "ignore" or + node.name == "default:chest_open" or + node.name == "default:chest_locked_open" or + node.name == "default:lava_source" or + node.name == "default:lava_flowing" or + node.name == "default:water_source" or + node.name == "default:water_flowing" then + return + end + local drops = minetest.get_node_drops(node.name, "") + local remove_to = false + for i, item in ipairs(drops) do + if not inv:room_for_item(slot_name, item) then + remove_to = i - 1 + break + end + inv:add_item(slot_name, item) + end + if remove_to then + for i = 1, remove_to do + inv:remove_item(slot_name, drops[i]) + end + else + minetest.remove_node(pos) + end + return + end + if not inv:is_empty(slot_name) then + local stack = inv:get_list(slot_name)[1] + local def = stack:get_definition() + if def.type == "node" then + minetest.set_node(pos, { + name = stack:get_name(), + param2 = machine_node.param2 + }) + stack:take_item() + inv:set_stack(slot_name, 1, stack) + elseif def.type == "craft" then + if def.on_place then + -- Use pcall to avoid nil placer errors. + -- TODO: Do without pcall. + local ok, stk = pcall(def.on_place, stack, nil, { + -- Fake pointed_thing + type = "node", + above = pos, + under = {x=pos.x, y=pos.y-1, z=pos.z}, + }) + if ok then + inv:set_stack(slot_name, 1, stk or stack) + return + end + end + minetest.item_place_object(stack, nil, { + -- Fake pointed_thing + type = "node", + above = pos, + under = pos, + }) + inv:set_stack(slot_name, 1, nil) + end + end +end + +minetest.register_craft({ + type = "shapeless", + output = 'technic:constructor_mk1_off 1', + recipe = {'technic:nodebreaker_off', 'technic:deployer_off'}, + +}) +minetest.register_craft({ + type = "shapeless", + output = 'technic:constructor_mk2_off 1', + recipe = {'technic:constructor_mk1_off', 'technic:constructor_mk1_off'}, + +}) + +minetest.register_craft({ + type = "shapeless", + output = 'technic:constructor_mk3_off 1', + recipe = {'technic:constructor_mk2_off', 'technic:constructor_mk2_off'}, + +}) + +local function make_on(mark, length) + return function(pos, node) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local inv = meta:get_inventory() + local dir = vector.new() + if node.param2 == 3 then dir.x = 1 end + if node.param2 == 2 then dir.z = 1 end + if node.param2 == 1 then dir.x = -1 end + if node.param2 == 0 then dir.z = -1 end + + local place_pos = vector.new(pos) + + if node.name == "technic:constructor_mk"..mark.."_off" then + technic.swap_node(pos, "technic:constructor_mk"..mark.."_on") + minetest.check_for_falling(pos) + for i = 1, length do + place_pos = vector.add(place_pos, dir) + if owner ~= "" and minetest.is_protected(place_pos, owner) then + return + end + local place_node = minetest.get_node(place_pos) + deploy_node(inv, "slot"..i, place_pos, place_node, node) + end + end + end +end + +local function make_off(mark) + return function(pos, node) + if node.name == "technic:constructor_mk"..mark.."_on" then + technic.swap_node(pos,"technic:constructor_mk"..mark.."_off") + minetest.check_for_falling(pos) + end + end +end + +local function allow_inventory_put(pos, listname, index, stack, player) + if stack and minetest.get_item_group(stack:get_name(), "technic_constructor") == 1 then + return 0 + end + return technic.machine_inventory_put(pos, listname, index, stack, player) +end + +local function make_constructor(mark, length) + minetest.register_node("technic:constructor_mk"..mark.."_off", { + description = S("Constructor Mk%d"):format(mark), + tiles = {"technic_constructor_mk"..mark.."_top_off.png", + "technic_constructor_mk"..mark.."_bottom_off.png", + "technic_constructor_mk"..mark.."_side2_off.png", + "technic_constructor_mk"..mark.."_side1_off.png", + "technic_constructor_back.png", + "technic_constructor_front_off.png"}, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + mesecon = 2, technic_constructor = 1}, + mesecons = {effector = {action_on = make_on(mark, length)}}, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local formspec = "size[8,9;]".. + "label[0,0;"..S("Constructor Mk%d"):format(mark).."]".. + "list[current_player;main;0,5;8,4;]".. + "listring[current_player;main]" + for i = 1, length do + formspec = formspec.. + "label[5,"..(i - 1)..";"..S("Slot %d"):format(i).."]".. + "list[context;slot"..i..";6,"..(i - 1)..";1,1;]".. + "listring[context;slot"..i.."]" + end + meta:set_string("formspec", formspec) + meta:set_string("infotext", S("Constructor Mk%d"):format(mark)) + local inv = meta:get_inventory() + for i = 1, length do + inv:set_size("slot"..i, 1) + end + meta:set_string("owner", "?") + end, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", (placer and placer:get_player_name() or "?")) + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, length do + if not inv:is_empty("slot"..i) then + return false + end + end + return true + end, + allow_metadata_inventory_put = allow_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + on_rotate = screwdriver.rotate_simple + }) + + minetest.register_node("technic:constructor_mk"..mark.."_on", { + tiles = {"technic_constructor_mk"..mark.."_top_on.png", + "technic_constructor_mk"..mark.."_bottom_on.png", + "technic_constructor_mk"..mark.."_side2_on.png", + "technic_constructor_mk"..mark.."_side1_on.png", + "technic_constructor_back.png", + "technic_constructor_front_on.png"}, + paramtype2 = "facedir", + drop = "technic:constructor_mk"..mark.."_off", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + mesecon=2, not_in_creative_inventory=1, technic_constructor=1}, + mesecons= {effector = {action_off = make_off(mark)}}, + sounds = default.node_sound_stone_defaults(), + allow_metadata_inventory_put = allow_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + on_rotate = false + }) +end + +make_constructor(1, 1) +make_constructor(2, 2) +make_constructor(3, 4) diff --git a/mods/technic_plus/technic/machines/other/frames.lua b/mods/technic_plus/technic/machines/other/frames.lua new file mode 100644 index 0000000..0163a6c --- /dev/null +++ b/mods/technic_plus/technic/machines/other/frames.lua @@ -0,0 +1,1025 @@ +local S = technic.getter + +local infinite_stacks = minetest.settings:get_bool("creative_mode") + and minetest.get_modpath("unified_inventory") == nil + +local frames_pos = {} + +-- Helpers + +local function get_face(pos, ppos, pvect) + -- Raytracer to get which face has been clicked + ppos = { x = ppos.x - pos.x, y = ppos.y - pos.y + 1.5, z = ppos.z - pos.z } + + if pvect.x > 0 then + local t = (-0.5 - ppos.x) / pvect.x + local y_int = ppos.y + t * pvect.y + local z_int = ppos.z + t * pvect.z + if y_int > -0.45 and y_int < 0.45 and z_int > -0.45 and z_int < 0.45 then + return 1 + end + elseif pvect.x < 0 then + local t = (0.5 - ppos.x) / pvect.x + local y_int = ppos.y + t * pvect.y + local z_int = ppos.z + t * pvect.z + if y_int > -0.45 and y_int < 0.45 and z_int > -0.45 and z_int < 0.45 then + return 2 + end + end + + if pvect.y > 0 then + local t = (-0.5 - ppos.y) / pvect.y + local x_int = ppos.x + t * pvect.x + local z_int = ppos.z + t * pvect.z + if x_int > -0.45 and x_int < 0.45 and z_int > -0.45 and z_int < 0.45 then + return 3 + end + elseif pvect.y < 0 then + local t = (0.5 - ppos.y) / pvect.y + local x_int = ppos.x + t * pvect.x + local z_int = ppos.z + t * pvect.z + if x_int > -0.45 and x_int < 0.45 and z_int > -0.45 and z_int < 0.45 then + return 4 + end + end + + if pvect.z > 0 then + local t = (-0.5 - ppos.z) / pvect.z + local x_int = ppos.x + t * pvect.x + local y_int = ppos.y + t * pvect.y + if x_int > -0.45 and x_int < 0.45 and y_int > -0.45 and y_int < 0.45 then + return 5 + end + elseif pvect.z < 0 then + local t = (0.5 - ppos.z) / pvect.z + local x_int = ppos.x + t * pvect.x + local y_int = ppos.y + t * pvect.y + if x_int > -0.45 and x_int < 0.45 and y_int > -0.45 and y_int < 0.45 then + return 6 + end + end +end + +local function lines(str) + local t = {} + local function helper(line) table.insert(t, line) return "" end + helper(str:gsub("(.-)\r?\n", helper)) + return t +end + +local function pos_to_string(pos) + if pos.x == 0 then pos.x = 0 end -- Fix for signed 0 + if pos.y == 0 then pos.y = 0 end -- Fix for signed 0 + if pos.z == 0 then pos.z = 0 end -- Fix for signed 0 + return tostring(pos.x).."\n"..tostring(pos.y).."\n"..tostring(pos.z) +end + +local function pos_from_string(str) + local l = lines(str) + return { x = tonumber(l[1]), y = tonumber(l[2]), z = tonumber(l[3]) } +end + +local function pos_in_list(l, pos) + for _, p in ipairs(l) do + if p.x == pos.x and p.y == pos.y and p.z == pos.z then + return true + end + end + return false +end + +local function add_table(table, toadd) + local i = 1 + while true do + local o = table[i] + if o == toadd then return end + if o == nil then break end + i = i + 1 + end + table[i] = toadd +end + +local function move_nodes_vect(poslist, vect, must_not_move, owner) + if minetest.is_protected then + for _, pos in ipairs(poslist) do + local npos = vector.add(pos, vect) + if minetest.is_protected(pos, owner) or minetest.is_protected(npos, owner) then + return + end + end + end + + for _, pos in ipairs(poslist) do + local npos = vector.add(pos, vect) + local name = minetest.get_node(npos).name + if (name ~= "air" and minetest.registered_nodes[name].liquidtype == "none" or + frames_pos[pos_to_string(npos)]) and not pos_in_list(poslist, npos) then + return + end + end + + local nodelist = {} + for _, pos in ipairs(poslist) do + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos):to_table() + local timer = minetest.get_node_timer(pos) + nodelist[#nodelist + 1] = { + oldpos = pos, + pos = vector.add(pos, vect), + node = node, + meta = meta, + timer = { + timeout = timer:get_timeout(), + elapsed = timer:get_elapsed() + } + } + end + + local objects = {} + for _, pos in ipairs(poslist) do + for _, object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + local entity = object:get_luaentity() + if not entity or not mesecon.is_mvps_unmov(entity.name) then + add_table(objects, object) + end + end + end + + for _, obj in ipairs(objects) do + obj:set_pos(vector.add(obj:get_pos(), vect)) + end + + for _, n in ipairs(nodelist) do + local npos = n.pos + minetest.set_node(npos, n.node) + local meta = minetest.get_meta(npos) + meta:from_table(n.meta) + local timer = minetest.get_node_timer(npos) + if n.timer.timeout ~= 0 or n.timer.elapsed ~= 0 then + timer:set(n.timer.timeout, n.timer.elapsed) + end + for __, pos in ipairs(poslist) do + if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then + table.remove(poslist, __) + break + end + end + end + + for __, pos in ipairs(poslist) do + minetest.remove_node(pos) + end + + for _, callback in ipairs(mesecon.on_mvps_move) do + callback(nodelist) + end +end + +local function is_supported_node(name) + return string.find(name, "tube") and string.find(name, "pipeworks") +end + +-- Frames +for xm = 0, 1 do +for xp = 0, 1 do +for ym = 0, 1 do +for yp = 0, 1 do +for zm = 0, 1 do +for zp = 0, 1 do + + local a = 8 / 16 + local b = 7 / 16 + local nodeboxes = { + { -a, -a, -a, -b, a, -b }, + { -a, -a, b, -b, a, a }, + + { b, -a, b, a, a, a }, + { b, -a, -a, a, a, -b }, + + { -b, b, -a, b, a, -b }, + { -b, -a, -a, b, -b, -b }, + + { -b, b, b, b, a, a }, + { -b, -a, b, b, -b, a }, + + { b, b, -b, a, a, b }, + { b, -a, -b, a, -b, b }, + + { -a, b, -b, -b, a, b }, + { -a, -a, -b, -b, -b, b }, + } + + if yp == 0 then + table.insert(nodeboxes, { -b, b, -b, b, a, b }) + end + if ym == 0 then + table.insert(nodeboxes, { -b, -a, -b, b, -b, b }) + end + if xp == 0 then + table.insert(nodeboxes, { b, b, b, a, -b, -b }) + end + if xm == 0 then + table.insert(nodeboxes, { -a, -b, -b, -b, b, b }) + end + if zp == 0 then + table.insert(nodeboxes, { -b, -b, b, b, b, a }) + end + if zm == 0 then + table.insert(nodeboxes, { -b, -b, -a, b, b, -b }) + end + + local nameext = string.format("%d%d%d%d%d%d", xm, xp, ym, yp, zm, zp) + local groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2 } + if nameext ~= "111111" then groups.not_in_creative_inventory = 1 end + + + minetest.register_node("technic:frame_"..nameext, { + description = S("Frame"), + tiles = { "technic_frame.png" }, + groups = groups, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodeboxes, + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + paramtype = "light", + frame = 1, + drop = "technic:frame_111111", + sunlight_propagates = true, + + frame_connect_all = function(nodename) + local l2 = {} + local l1 = { + { x = -1, y = 0, z = 0 }, { x = 1, y = 0, z = 0 }, + { x = 0, y = -1, z = 0 }, { x = 0, y = 1, z = 0 }, + { x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = 1 } + } + for i, dir in ipairs(l1) do + if string.sub(nodename, -7 + i, -7 + i) == "1" then + l2[#l2 + 1] = dir + end + end + return l2 + end, + + on_punch = function(pos, node, puncher) + local ppos = puncher:get_pos() + local pvect = puncher:get_look_dir() + local pface = get_face(pos, ppos, pvect) + + if pface == nil then return end + + local nodename = node.name + local newstate = tostring(1 - tonumber(string.sub(nodename, pface - 7, pface - 7))) + if pface <= 5 then + nodename = string.sub(nodename, 1, pface - 7 - 1)..newstate..string.sub(nodename, pface - 7 + 1) + else + nodename = string.sub(nodename, 1, -2)..newstate + end + + node.name = nodename + minetest.set_node(pos, node) + end, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + + if minetest.is_protected(pos, placer:get_player_name()) then + minetest.log("action", placer:get_player_name() + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, placer:get_player_name()) + return itemstack + end + + if pos == nil then return end + + local node = minetest.get_node(pos) + if node.name ~= "air" then + if is_supported_node(node.name) then + local obj = minetest.add_entity(pos, "technic:frame_entity") + obj:get_luaentity():set_node({ name = itemstack:get_name() }) + end + else + minetest.set_node(pos, { name = itemstack:get_name() }) + end + + if not infinite_stacks then + itemstack:take_item() + end + return itemstack + end, + + on_rightclick = function(pos, node, placer, itemstack, pointed_thing) + if is_supported_node(itemstack:get_name()) then + if minetest.is_protected(pos, placer:get_player_name()) then + minetest.log("action", placer:get_player_name() + .. " tried to place " .. itemstack:get_name() + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, placer:get_player_name()) + return itemstack + end + + minetest.set_node(pos, { name = itemstack:get_name() }) + + local take_item = true + local def = minetest.registered_items[itemstack:get_name()] + -- Run callback + if def.after_place_node then + -- Copy place_to because callback can modify it + local pos_copy = vector.new(pos) + if def.after_place_node(pos_copy, placer, itemstack) then + take_item = false + end + end + + -- Run script hook + local callback = nil + for _, _ in ipairs(minetest.registered_on_placenodes) do + -- Copy pos and node because callback can modify them + local pos_copy = { x = pos.x, y = pos.y, z = pos.z } + local newnode_copy = { name = def.name, param1 = 0, param2 = 0 } + local oldnode_copy = { name = "air", param1 = 0, param2 = 0 } + if callback(pos_copy, newnode_copy, placer, oldnode_copy, itemstack) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + local obj = minetest.add_entity(pos, "technic:frame_entity") + obj:get_luaentity():set_node({ name = node.name }) + + return itemstack + else + --local pointed_thing = { type = "node", under = pos } + if pointed_thing then + return minetest.item_place_node(itemstack, placer, pointed_thing) + end + end + end, + }) + +end +end +end +end +end +end + +minetest.register_entity("technic:frame_entity", { + initial_properties = { + physical = true, + collisionbox = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + visual = "wielditem", + textures = {}, + visual_size = { x = 0.667, y = 0.667 }, + }, + + node = {}, + + set_node = function(self, node) + self.node = node + local pos = vector.round(self.object:getpos()) + frames_pos[pos_to_string(pos)] = node.name + +-- This code does nothing currently, so it is disabled to stop luacheck warnings +--[[ + local stack = ItemStack(node.name) + local itemtable = stack:to_table() + local itemname = nil + + if itemtable then + itemname = stack:to_table().name + end + + local item_texture = nil + local item_type = "" + if minetest.registered_items[itemname] then + item_texture = minetest.registered_items[itemname].inventory_image + item_type = minetest.registered_items[itemname].type + end +--]] + local prop = { + is_visible = true, + textures = { node.name }, + } + self.object:set_properties(prop) + end, + + get_staticdata = function(self) + return self.node.name + end, + + on_activate = function(self, staticdata) + self.object:set_armor_groups({ immortal = 1 }) + self:set_node({ name = staticdata }) + end, + + dig = function(self) + minetest.handle_node_drops(self.object:get_pos(), { ItemStack("technic:frame_111111") }, self.last_puncher) + local pos = vector.round(self.object:get_pos()) + frames_pos[pos_to_string(pos)] = nil + self.object:remove() + end, + + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + local pos = self.object:get_pos() + if self.damage_object == nil then + self.damage_object = minetest.add_entity(pos, "technic:damage_entity") + self.damage_object:get_luaentity().remaining_time = 0.25 + self.damage_object:get_luaentity().frame_object = self + self.damage_object:get_luaentity().texture_index = 0 + self.damage_object:get_luaentity().texture_change_time = 0.15 + else + self.damage_object:get_luaentity().remaining_time = 0.25 + end + + self.last_puncher = puncher + local ppos = puncher:get_pos() + local pvect = puncher:get_look_dir() + local pface = get_face(pos, ppos, pvect) + if pface == nil then return end + local nodename = self.node.name + local newstate = tostring(1 - tonumber(string.sub(nodename, pface - 7, pface - 7))) + + if pface <= 5 then + nodename = string.sub(nodename, 1, pface - 7 - 1)..newstate..string.sub(nodename, pface - 7 + 1) + else + nodename = string.sub(nodename, 1, -2)..newstate + end + + self.node.name = nodename + self:set_node(self.node) + end, + + on_rightclick = function(self, clicker) + local pos = self.object:get_pos() + local ppos = clicker:get_pos() + local pvect = clicker:get_look_dir() + local pface = get_face(pos, ppos, pvect) + + if pface == nil then + return + end + + local pos_under = vector.round(pos) + local pos_above = { x = pos_under.x, y = pos_under.y, z = pos_under.z } + local index = ({ "x", "y", "z" })[math.floor((pface + 1) / 2)] + pos_above[index] = pos_above[index] + 2 * ((pface + 1)%2) - 1 + local pointed_thing = { type = "node", under = pos_under, above = pos_above } + local itemstack = clicker:get_wielded_item() + local itemdef = minetest.registered_items[itemstack:get_name()] + + if itemdef ~= nil then + itemdef.on_place(itemstack, clicker, pointed_thing) + end + end, +}) + +local crack = "crack_anylength.png^[verticalframe:5:0" +minetest.register_entity("technic:damage_entity", { + initial_properties = { + visual = "cube", + visual_size = { x = 1.01, y = 1.01 }, + textures = { crack, crack, crack, crack, crack, crack }, + collisionbox = { 0, 0, 0, 0, 0, 0 }, + physical = false, + }, + on_step = function(self, dtime) + if self.remaining_time == nil then + self.object:remove() + self.frame_object.damage_object = nil + end + self.remaining_time = self.remaining_time - dtime + if self.remaining_time < 0 then + self.object:remove() + self.frame_object.damage_object = nil + end + self.texture_change_time = self.texture_change_time - dtime + if self.texture_change_time < 0 then + self.texture_change_time = self.texture_change_time + 0.15 + self.texture_index = self.texture_index + 1 + if self.texture_index == 5 then + self.object:remove() + self.frame_object.damage_object = nil + self.frame_object:dig() + end + local ct = "crack_anylength.png^[verticalframe:5:"..self.texture_index + self.object:set_properties({ textures = { ct, ct, ct, ct, ct, ct } }) + end + end, +}) + +mesecon.register_mvps_unmov("technic:frame_entity") +mesecon.register_mvps_unmov("technic:damage_entity") +mesecon.register_on_mvps_move(function(moved_nodes) + local to_move = {} + for _, n in ipairs(moved_nodes) do + if frames_pos[pos_to_string(n.oldpos)] ~= nil then + to_move[#to_move + 1] = { + pos = n.pos, + oldpos = n.oldpos, + name = frames_pos[pos_to_string(n.oldpos)] + } + frames_pos[pos_to_string(n.oldpos)] = nil + end + end + if #to_move > 0 then + for _, t in ipairs(to_move) do + frames_pos[pos_to_string(t.pos)] = t.name + local objects = minetest.get_objects_inside_radius(t.oldpos, 0.1) + for _, obj in ipairs(objects) do + local entity = obj:get_luaentity() + if entity and (entity.name == "technic:frame_entity" or + entity.name == "technic:damage_entity") then + obj:set_pos(t.pos) + end + end + end + end +end) + +minetest.register_on_dignode(function(pos, node) + if frames_pos[pos_to_string(pos)] ~= nil then + minetest.set_node(pos, { name = frames_pos[pos_to_string(pos)] }) + frames_pos[pos_to_string(pos)] = nil + local objects = minetest.get_objects_inside_radius(pos, 0.1) + for _, obj in ipairs(objects) do + local entity = obj:get_luaentity() + if entity and (entity.name == "technic:frame_entity" or entity.name == "technic:damage_entity") then + obj:remove() + end + end + end +end) + +-- Frame motor +local function connected(pos, c, adj) + for _, vect in ipairs(adj) do + local pos1 = vector.add(pos, vect) + local nodename = minetest.get_node(pos1).name + if frames_pos[pos_to_string(pos1)] then + nodename = frames_pos[pos_to_string(pos1)] + end + if not pos_in_list(c, pos1) and nodename ~= "air" and + (minetest.registered_nodes[nodename].frames_can_connect == nil or + minetest.registered_nodes[nodename].frames_can_connect(pos1, vect)) then + c[#c + 1] = pos1 + if minetest.registered_nodes[nodename].frame == 1 then + local adj2 = minetest.registered_nodes[nodename].frame_connect_all(nodename) + connected(pos1, c, adj2) + end + end + end +end + +local function get_connected_nodes(pos) + local c = { pos } + local nodename = minetest.get_node(pos).name + if frames_pos[pos_to_string(pos)] then + nodename = frames_pos[pos_to_string(pos)] + end + connected(pos, c, minetest.registered_nodes[nodename].frame_connect_all(nodename)) + return c +end + +local function frame_motor_on(pos, node) + local dirs = { + { x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = 1 }, + { x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 }, + { x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 } + } + local nnodepos = vector.add(pos, dirs[math.floor(node.param2 / 4) + 1]) + local dir = minetest.facedir_to_dir(node.param2) + local nnode = minetest.get_node(nnodepos) + + if frames_pos[pos_to_string(nnodepos)] then + nnode.name = frames_pos[pos_to_string(nnodepos)] + end + + local meta = minetest.get_meta(pos) + if meta:get_int("last_moved") == minetest.get_gametime() then + return + end + + local owner = meta:get_string("owner") + if minetest.registered_nodes[nnode.name].frame == 1 then + local connected_nodes = get_connected_nodes(nnodepos) + move_nodes_vect(connected_nodes, dir, pos, owner) + end + + minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime()) +end + +minetest.register_node("technic:frame_motor", { + description = S("Frame Motor"), + tiles = { + "pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png", + "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png" + }, + groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2 }, + paramtype2 = "facedir", + mesecons = { effector = { action_on = frame_motor_on } }, + + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + end, + + frames_can_connect = function(pos, dir) + local node = minetest.get_node(pos) + local dir2 = ({ + { x= 0 , y = 1, z = 0 }, { x = 0, y = 0, z = 1 }, + { x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 }, + { x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 } + })[math.floor(node.param2 / 4) + 1] + return dir2.x ~= -dir.x or dir2.y ~= -dir.y or dir2.z ~= -dir.z + end +}) + + + +-- Templates +local function template_connected(pos, c, connectors) + local vects = { + { x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = 1 }, + { x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 }, + { x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 } + } + for _, vect in ipairs(vects) do + local pos1 = vector.add(pos, vect) + local nodename = minetest.get_node(pos1).name + if not pos_in_list(c, pos1) and (nodename == "technic:template" or + nodename == "technic:template_connector") then + local meta = minetest.get_meta(pos1) + if meta:get_string("connected") == "" then + c[#c + 1] = pos1 + template_connected(pos1, c, connectors) + if nodename == "technic:template_connector" then + connectors[#connectors + 1] = pos1 + end + end + end + end +end + +local function get_templates(pos) + local c = { pos } + local connectors + if minetest.get_node(pos).name == "technic:template_connector" then + connectors = { pos } + else + connectors = {} + end + template_connected(pos, c, connectors) + return c, connectors +end + +local function swap_template(pos, new) + local meta = minetest.get_meta(pos) + local saved_node = meta:get_string("saved_node") + meta:set_string("saved_node", "") + technic.swap_node(pos, new) + meta = minetest.get_meta(pos) + meta:set_string("saved_node", saved_node) +end + +local function save_node(pos) + local node = minetest.get_node(pos) + if node.name == "air" then + minetest.set_node(pos, { name = "technic:template" }) + return + end + if node.name == "technic:template" then + swap_template(pos, "technic:template_connector") + local meta = minetest.get_meta(pos) + meta:set_string("connected", "") + return + end + + local meta = minetest.get_meta(pos) + local meta0 = meta:to_table() + for _, list in pairs(meta0.inventory) do + for key, stack in pairs(list) do + list[key] = stack:to_string() + end + end + + node.meta = meta0 + minetest.set_node(pos, { name = "technic:template" }) + return node +end + +local function restore_node(pos, node) + minetest.set_node(pos, node) + local meta = minetest.get_meta(pos) + for _, list in pairs(node.meta.inventory) do + for key, stack in pairs(list) do + list[key] = ItemStack(stack) + end + end + meta:from_table(node.meta) +end + +local function expand_template(pos) + local meta = minetest.get_meta(pos) + local c = meta:get_string("connected") + + if c == "" then return end + c = minetest.deserialize(c) + + for _, vect in ipairs(c) do + local pos1 = vector.add(pos, vect) + local saved_node = save_node(pos1) + local meta1 = minetest.get_meta(pos1) + if saved_node ~= nil then + meta1:set_string("saved_node", minetest.serialize(saved_node)) + end + end +end + +local function compress_templates(pos) + local templates, connectors = get_templates(pos) + + if #connectors == 0 then + connectors = { pos } + end + + for _, cn in ipairs(connectors) do + local meta = minetest.get_meta(cn) + local c = {} + for _, p in ipairs(templates) do + local np = vector.subtract(p, cn) + if not pos_in_list(c, np) then + c[#c + 1] = np + end + end + local cc = {} + for _, p in ipairs(connectors) do + local np = vector.subtract(p, cn) + if np.x ~= 0 or np.y ~= 0 or np.z ~= 0 then + cc[pos_to_string(np)] = true + end + end + swap_template(cn, "technic:template") + meta:set_string("connected", minetest.serialize(c)) + meta:set_string("connectors_connected", minetest.serialize(cc)) + end + + for _, p in ipairs(templates) do + if not pos_in_list(connectors, p) then + minetest.set_node(p, { name = "air" }) + end + end +end + +local function template_drops(pos, node, oldmeta, digger) + local c = oldmeta.fields.connected + local cc = oldmeta.fields.connectors_connected + local drops + + if c == "" or c == nil then + drops = { "technic:template 1" } + else + if cc == "" or cc == nil then + drops = { "technic:template 1" } + else + local dcc = minetest.deserialize(cc) + if next(dcc) ~= nil then + drops = {} + for sp, _ in pairs(dcc) do + local ssp = pos_from_string(sp) + local p = vector.add(ssp, pos) + local meta = minetest.get_meta(p) + local d = minetest.deserialize(meta:get_string("connectors_connected")) + if d ~= nil then + d[pos_to_string({ x = -ssp.x, y = -ssp.y, z = -ssp.z })] = nil + meta:set_string("connectors_connected", minetest.serialize(d)) + end + end + else + local stack_max = 99 + local num = #minetest.deserialize(c) + drops = {} + while num > stack_max do + drops[#drops + 1] = "technic:template "..stack_max + num = num - stack_max + end + drops[#drops + 1] = "technic:template "..num + end + end + end + + minetest.handle_node_drops(pos, drops, digger) +end + +local function template_on_destruct(pos, node) + local meta = minetest.get_meta(pos) + local saved_node = meta:get_string("saved_node") + if saved_node ~= "" then + local nnode = minetest.deserialize(saved_node) + minetest.after(0, restore_node, pos, nnode) + end +end + +minetest.register_node("technic:template", { + description = S("Template"), + tiles = { "technic_mv_cable.png" }, + drop = "", + groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2 }, + on_destruct = template_on_destruct, + after_dig_node = template_drops, + on_punch = function(pos, node, puncher) + swap_template(pos, "technic:template_disabled") + end +}) + +minetest.register_node("technic:template_disabled", { + description = S("Template"), + tiles = { "technic_hv_cable.png" }, + drop = "", + groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1 }, + on_destruct = template_on_destruct, + after_dig_node = template_drops, + on_punch = function(pos, node, puncher) + local _ = minetest.get_meta(pos) + swap_template(pos, "technic:template_connector") + end +}) + +minetest.register_node("technic:template_connector", { + description = S("Template"), + tiles = { "technic_lv_cable.png" }, + drop = "", + groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1 }, + on_destruct = template_on_destruct, + after_dig_node = template_drops, + on_punch = function(pos, node, puncher) + swap_template(pos, "technic:template") + end +}) + +minetest.register_craftitem("technic:template_replacer", { + description = S("Template (replacing)"), + inventory_image = "technic_template_replacer.png", + on_place = function(itemstack, placer, pointed_thing) + local p = pointed_thing.under + if minetest.is_protected and minetest.is_protected(p, placer:get_player_name()) then + return nil + end + local node = minetest.get_node(p) + if node.name == "technic:template" then return end + local saved_node = save_node(p) + itemstack:take_item() + if saved_node ~= nil then + local meta = minetest.get_meta(p) + meta:set_string("saved_node", minetest.serialize(saved_node)) + end + return itemstack + end +}) + +minetest.register_tool("technic:template_tool", { + description = S("Template Tool"), + inventory_image = "technic_template_tool.png", + on_use = function(itemstack, puncher, pointed_thing) + local pos = pointed_thing.under + if pos == nil or minetest.is_protected and minetest.is_protected(pos, puncher:get_player_name()) then + return nil + end + local node = minetest.get_node(pos) + if node.name ~= "technic:template" and node.name ~= "technic:template_connector" then return end + local meta = minetest.get_meta(pos) + local c2 = meta:get_string("connected") + if c2 ~= "" then + expand_template(pos) + else + compress_templates(pos) + end + + end +}) + + + +-- Template motor +local function get_template_nodes(pos) + local meta = minetest.get_meta(pos) + local connected_to = meta:get_string("connected") + if connected_to == "" then return {} end + local adj = minetest.deserialize(connected_to) + local c = {} + for _, vect in ipairs(adj) do + local pos1 = vector.add(pos, vect) + local nodename = minetest.get_node(pos1).name + if not(pos_in_list(c, pos1)) and nodename ~= "air" then + c[#c + 1] = pos1 + end + end + return c +end + +local function template_motor_on(pos, node) + local dirs = { + { x = 0, y = 1, z = 0 }, { x = 0, y = 0, z = 1 }, + { x = 0, y = 0, z = -1 }, { x = 1, y = 0, z = 0 }, + { x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 } + } + local nnodepos = vector.add(pos, dirs[math.floor(node.param2 / 4) + 1]) + local dir = minetest.facedir_to_dir(node.param2) + local nnode = minetest.get_node(nnodepos) + local meta = minetest.get_meta(pos) + if meta:get_int("last_moved") == minetest.get_gametime() then + return + end + local owner = meta:get_string("owner") + if nnode.name == "technic:template" then + local connected_nodes = get_template_nodes(nnodepos) + move_nodes_vect(connected_nodes, dir, pos, owner) + end + minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime()) +end + +minetest.register_node("technic:template_motor", { + description = S("Template Motor"), + tiles = { + "pipeworks_filter_top.png^[transformR90", + "technic_lv_cable.png", + "technic_lv_cable.png", + "technic_lv_cable.png", + "technic_lv_cable.png", + "technic_lv_cable.png" + }, + groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2 }, + paramtype2 = "facedir", + mesecons = { effector = { action_on = template_motor_on } }, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + end, +}) + +-- Crafts +minetest.register_craft({ + output = 'technic:frame_111111', + recipe = { + { '', 'default:stick', '' }, + { 'default:stick', 'basic_materials:brass_ingot', 'default:stick' }, + { '', 'default:stick', '' }, + } +}) + +minetest.register_craft({ + output = 'technic:frame_motor', + recipe = { + { '', 'technic:frame_111111', '' }, + { 'group:mesecon_conductor_craftable', 'basic_materials:motor', 'group:mesecon_conductor_craftable' }, + { '', 'technic:frame_111111', '' }, + } +}) + +minetest.register_craft({ + output = 'technic:template 10', + recipe = { + { '', 'basic_materials:brass_ingot', '' }, + { 'basic_materials:brass_ingot', 'default:mese_crystal', 'basic_materials:brass_ingot' }, + { '', 'basic_materials:brass_ingot', '' }, + } +}) + +minetest.register_craft({ + output = 'technic:template_replacer', + recipe = { { 'technic:template' } } +}) + +minetest.register_craft({ + output = 'technic:template', + recipe = { { 'technic:template_replacer' } } +}) + +minetest.register_craft({ + output = 'technic:template_motor', + recipe = { + { '', 'technic:template', '' }, + { 'group:mesecon_conductor_craftable', 'basic_materials:motor', 'group:mesecon_conductor_craftable' }, + { '', 'technic:template', '' }, + } +}) + +minetest.register_craft({ + output = 'technic:template_tool', + recipe = { + { '', 'technic:template', '' }, + { 'default:mese_crystal', 'default:stick', 'default:mese_crystal' }, + { '', 'default:stick', '' }, + } +}) diff --git a/mods/technic_plus/technic/machines/other/init.lua b/mods/technic_plus/technic/machines/other/init.lua new file mode 100644 index 0000000..f4a82f0 --- /dev/null +++ b/mods/technic_plus/technic/machines/other/init.lua @@ -0,0 +1,15 @@ +local path = technic.modpath.."/machines/other" + +-- mesecons and tubes related +dofile(path.."/injector.lua") +dofile(path.."/constructor.lua") + +if technic.config:get_bool("enable_frames") and minetest.get_modpath("mesecons_mvps") ~= nil then + dofile(path.."/frames.lua") +end + +-- Coal-powered machines +dofile(path.."/coal_alloy_furnace.lua") +dofile(path.."/coal_furnace.lua") + +dofile(path.."/anchor.lua") diff --git a/mods/technic_plus/technic/machines/other/injector.lua b/mods/technic_plus/technic/machines/other/injector.lua new file mode 100644 index 0000000..0c1e7f4 --- /dev/null +++ b/mods/technic_plus/technic/machines/other/injector.lua @@ -0,0 +1,157 @@ + +local S = technic.getter + +local fs_helpers = pipeworks.fs_helpers + +local tube_entry = "^pipeworks_tube_connection_metallic.png" + +local param2_to_under = { + [0] = {x= 0,y=-1,z= 0}, [1] = {x= 0,y= 0,z=-1}, + [2] = {x= 0,y= 0,z= 1}, [3] = {x=-1,y= 0,z= 0}, + [4] = {x= 1,y= 0,z= 0}, [5] = {x= 0,y= 1,z= 0} +} + +local base_formspec = "size[8,9;]".. + "label[0,0;"..S("Self-Contained Injector").."]".. + "list[context;main;0,2;8,2;]".. + "list[current_player;main;0,5;8,4;]".. + "listring[]" + +local function set_injector_formspec(pos) + local meta = minetest.get_meta(pos) + local formspec = base_formspec.. + fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + if meta:get_string("mode") == "whole stacks" then + formspec = formspec.."button[0,1;4,1;mode_item;"..S("Stackwise").."]" + else + formspec = formspec.."button[0,1;4,1;mode_stack;"..S("Itemwise").."]" + end + if minetest.get_node_timer(pos):is_started() then + formspec = formspec.."button[4,1;4,1;disable;"..S("Enabled").."]" + else + formspec = formspec.."button[4,1;4,1;enable;"..S("Disabled").."]" + end + meta:set_string("formspec", formspec) +end + +minetest.register_node("technic:injector", { + description = S("Self-Contained Injector"), + tiles = { + "technic_injector_top.png"..tube_entry, + "technic_injector_bottom.png", + "technic_injector_side.png"..tube_entry, + "technic_injector_side.png"..tube_entry, + "technic_injector_side.png"..tube_entry, + "technic_injector_side.png" + }, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, tubedevice=1, tubedevice_receiver=1}, + tube = { + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + if meta:get_int("splitstacks") == 1 then + stack = stack:peek_item(1) + end + return meta:get_inventory():room_for_item("main", stack) + end, + insert_object = function(pos, node, stack, direction) + return minetest.get_meta(pos):get_inventory():add_item("main", stack) + end, + connect_sides = {left=1, right=1, back=1, top=1, bottom=1}, + }, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Self-Contained Injector")) + meta:set_string("mode", "single items") + meta:get_inventory():set_size("main", 16) + minetest.get_node_timer(pos):start(1) + set_injector_formspec(pos) + end, + can_dig = function(pos, player) + return minetest.get_meta(pos):get_inventory():is_empty("main") + end, + on_receive_fields = function(pos, formanme, fields, sender) + if fields.quit or not pipeworks.may_configure(pos, sender) then + return + end + local meta = minetest.get_meta(pos) + if fields.mode_item then + meta:set_string("mode", "single items") + elseif fields.mode_stack then + meta:set_string("mode", "whole stacks") + elseif fields.disable then + minetest.get_node_timer(pos):stop() + elseif fields.enable then + minetest.get_node_timer(pos):start(1) + end + fs_helpers.on_receive_fields(pos, fields) + set_injector_formspec(pos) + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local dir = param2_to_under[math.floor(node.param2 / 4)] + local node_under = minetest.get_node(vector.add(pos, dir)) + if minetest.get_item_group(node_under.name, "tubedevice") > 0 then + local inv = meta:get_inventory() + local list = inv:get_list("main") + if not list then + return true + end + local stackwise = meta:get_string("mode") == "whole stacks" + for i,stack in ipairs(list) do + if not stack:is_empty() then + if stackwise then + technic.tube_inject_item(pos, pos, dir, stack:to_table()) + stack:clear() + else + technic.tube_inject_item(pos, pos, dir, stack:take_item(1):to_table()) + end + inv:set_stack("main", i, stack) + break + end + end + end + return true + end, + on_rotate = function(pos, node, user, mode, new_param2) + node.param2 = new_param2 + minetest.swap_node(pos, node) + pipeworks.scan_for_tube_objects(pos) + return true + end, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig +}) + +minetest.register_craft({ + output = "technic:injector 1", + recipe = { + {"", "technic:control_logic_unit",""}, + {"", "default:chest",""}, + {"", "pipeworks:tube_1",""}, + } +}) + +minetest.register_lbm({ + label = "Old injector conversion", + name = "technic:old_injector_conversion", + nodenames = {"technic:injector"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_node_timer(pos):start(1) + set_injector_formspec(pos) + end +}) diff --git a/mods/technic_plus/technic/machines/power_monitor.lua b/mods/technic_plus/technic/machines/power_monitor.lua new file mode 100644 index 0000000..7d6ca99 --- /dev/null +++ b/mods/technic_plus/technic/machines/power_monitor.lua @@ -0,0 +1,130 @@ +-- POWER MONITOR +-- The power monitor can be used to monitor how much power is available on a network, +-- similarly to the old "slave" switching stations. + +local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" + +-- Get registered cable or nil, returns nil if area is not loaded +local function get_cable(pos) + local node = minetest.get_node_or_nil(pos) + return (node and technic.get_cable_tier(node.name)) and node +end + +-- return the position of connected cable or nil +-- TODO: Make it support every possible orientation +local function get_connected_cable_network(pos) + local param2 = minetest.get_node(pos).param2 + -- should probably also work sideways or upside down but for now it wont + if param2 > 3 then return end + -- Below? + local checkpos = {x=pos.x,y=pos.y-1,z=pos.z} + local network_id = get_cable(checkpos) and technic.pos2network(checkpos) + if network_id then + return network_id + end + -- Behind? + checkpos = vector.add(minetest.facedir_to_dir(param2),pos) + network_id = get_cable(checkpos) and technic.pos2network(checkpos) + return network_id +end + +-- return the position of the associated switching station or nil +local function get_network(pos) + local network_id = get_connected_cable_network(pos) + local network = network_id and technic.networks[network_id] + local swpos = network and technic.network2sw_pos(network_id) + local is_powermonitor = swpos and minetest.get_node(swpos).name == "technic:switching_station" + return (is_powermonitor and network.all_nodes[network_id]) and network +end + +minetest.register_craft({ + output = "technic:power_monitor", + recipe = { + {"", "", ""}, + {"", "technic:machine_casing", "default:copper_ingot"}, + {"technic:lv_cable", "technic:lv_cable", "technic:lv_cable"} + } +}) + +minetest.register_node("technic:power_monitor",{ + description = S("Power Monitor"), + tiles = { + "technic_power_monitor_sides.png", + "technic_power_monitor_sides.png"..cable_entry, + "technic_power_monitor_sides.png", + "technic_power_monitor_sides.png", + "technic_power_monitor_sides.png"..cable_entry, + "technic_power_monitor_front.png" + }, + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_all_tiers=1}, + connect_sides = {"bottom", "back"}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Power Monitor")) + meta:set_string("channel", "power_monitor"..minetest.pos_to_string(pos)) + meta:set_string("formspec", "field[channel;Channel;${channel}]") + end, + on_receive_fields = function(pos, formname, fields, sender) + if not fields.channel then + return + end + local plname = sender:get_player_name() + if minetest.is_protected(pos, plname) and not minetest.check_player_privs(sender, "protection_bypass") then + minetest.record_protection_violation(pos, plname) + return + end + local meta = minetest.get_meta(pos) + meta:set_string("channel", fields.channel) + end, + digiline = { + receptor = { + rules = technic.digilines.rules, + action = function() end + }, + effector = { + rules = technic.digilines.rules, + action = function(pos, node, channel, msg) + if msg ~= "GET" and msg ~= "get" then + return + end + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + + local network = get_network(pos) + if not network then return end + + digilines.receptor_send(pos, technic.digilines.rules, channel, { + supply = network.supply, + demand = network.demand, + lag = network.lag, + battery_count = network.battery_count, + battery_charge = network.battery_charge, + battery_charge_max = network.battery_charge_max, + }) + end + }, + }, +}) + +minetest.register_abm({ + nodenames = {"technic:power_monitor"}, + label = "Machines: run power monitor", + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local network = get_network(pos) + if network then + meta:set_string("infotext", S("Power Monitor. Supply: @1 Demand: @2", + technic.EU_string(network.supply), technic.EU_string(network.demand))) + else + meta:set_string("infotext",S("Power Monitor Has No Network")) + end + end, +}) diff --git a/mods/technic_plus/technic/machines/register/alloy_furnace.lua b/mods/technic_plus/technic/machines/register/alloy_furnace.lua new file mode 100644 index 0000000..1e3796d --- /dev/null +++ b/mods/technic_plus/technic/machines/register/alloy_furnace.lua @@ -0,0 +1,50 @@ + +local S = technic.getter + +function technic.insert_object_unique_stack(pos, node, incoming_stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local incoming_name = incoming_stack:get_name() + local stack_index = nil + for inv_index, inv_stack in pairs(inv:get_list("src")) do + if inv_stack:get_name() == incoming_name then + stack_index = inv_index + break + end + end + if stack_index == nil then + return inv:add_item("src", incoming_stack) + end + local present_stack = inv:get_stack("src", stack_index) + local leftover = present_stack:add_item(incoming_stack) + inv:set_stack("src", stack_index, present_stack) + return leftover +end + +function technic.can_insert_unique_stack(pos, node, incoming_stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local incoming_name = incoming_stack:get_name() + if meta:get_int("splitstacks") == 0 then + -- avoid looping second time with inv:contains_item("src", incoming_stack) + for _, inv_stack in pairs(inv:get_list("src")) do + if inv_stack:get_name() == incoming_name then + return inv_stack:item_fits(incoming_stack) + end + end + end + + return technic.default_can_insert(pos, node, incoming_stack, direction) +end + +function technic.register_alloy_furnace(data) + data.typename = "alloy" + data.machine_name = "alloy_furnace" + data.machine_desc = S("%s Alloy Furnace") + + data.insert_object = technic.insert_object_unique_stack + data.can_insert = technic.can_insert_unique_stack + + technic.register_base_machine(data) +end + diff --git a/mods/technic_plus/technic/machines/register/alloy_recipes.lua b/mods/technic_plus/technic/machines/register/alloy_recipes.lua new file mode 100644 index 0000000..0165ad9 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/alloy_recipes.lua @@ -0,0 +1,44 @@ + +local S = technic.getter + +technic.register_recipe_type("alloy", { + description = S("Alloying"), + input_size = 2, +}) + +function technic.register_alloy_recipe(data) + data.time = data.time or 6 + technic.register_recipe("alloy", data) +end + +local recipes = { + {"technic:copper_dust 7", "technic:tin_dust", "technic:bronze_dust 8", 12}, + {"default:copper_ingot 7", "default:tin_ingot", "default:bronze_ingot 8", 12}, + {"technic:wrought_iron_dust 2", "technic:coal_dust", "technic:carbon_steel_dust 2", 6}, + {"technic:wrought_iron_ingot 2", "technic:coal_dust", "technic:carbon_steel_ingot 2", 6}, + {"technic:carbon_steel_dust 2", "technic:coal_dust", "technic:cast_iron_dust 2", 6}, + {"technic:carbon_steel_ingot 2", "technic:coal_dust", "technic:cast_iron_ingot 2", 6}, + {"technic:carbon_steel_dust 4", "technic:chromium_dust", "technic:stainless_steel_dust 5", 7.5}, + {"technic:carbon_steel_ingot 4", "technic:chromium_ingot", "technic:stainless_steel_ingot 5", 7.5}, + {"technic:copper_dust 2", "technic:zinc_dust", "technic:brass_dust 3"}, + {"default:copper_ingot 2", "technic:zinc_ingot", "basic_materials:brass_ingot 3"}, + {"default:sand 2", "technic:coal_dust 2", "technic:silicon_wafer"}, + {"technic:silicon_wafer", "technic:gold_dust", "technic:doped_silicon_wafer"}, + -- from https://en.wikipedia.org/wiki/Carbon_black + -- The highest volume use of carbon black is as a reinforcing filler in rubber products, especially tires. + -- "[Compounding a] pure gum vulcanizate … with 50% of its weight of carbon black + -- improves its tensile strength and wear resistance …" + {"technic:raw_latex 4", "technic:coal_dust 2", "technic:rubber 6", 2}, + {"default:ice", "bucket:bucket_empty", "bucket:bucket_water", 1 }, + {"default:obsidian", "bucket:bucket_empty", "bucket:bucket_lava", 1 }, +} + +if minetest.get_modpath("ethereal") then + table.insert(recipes, {"default:clay", "dye:red", "bakedclay:red"}) + table.insert(recipes, {"default:clay", "dye:orange", "bakedclay:orange"}) + table.insert(recipes, {"default:clay", "dye:grey", "bakedclay:grey"}) +end + +for _, data in pairs(recipes) do + technic.register_alloy_recipe({input = {data[1], data[2]}, output = data[3], time = data[4]}) +end diff --git a/mods/technic_plus/technic/machines/register/battery_box.lua b/mods/technic_plus/technic/machines/register/battery_box.lua new file mode 100644 index 0000000..ab01523 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/battery_box.lua @@ -0,0 +1,431 @@ + +local digilines_path = minetest.get_modpath("digilines") + +local S = technic.getter +local tube_entry = "^pipeworks_tube_connection_metallic.png" +local cable_entry = "^technic_cable_connection_overlay.png" + +technic.register_power_tool("technic:battery", 10000) +technic.register_power_tool("technic:red_energy_crystal", 50000) +technic.register_power_tool("technic:green_energy_crystal", 150000) +technic.register_power_tool("technic:blue_energy_crystal", 450000) + +-- Battery recipes: +-- Tin-copper recipe: +minetest.register_craft({ + output = "technic:battery", + recipe = { + {"group:wood", "default:copper_ingot", "group:wood"}, + {"group:wood", "default:tin_ingot", "group:wood"}, + {"group:wood", "default:copper_ingot", "group:wood"}, + } +}) +-- Sulfur-lead-water recipes: +-- With sulfur lumps: +-- With water: +minetest.register_craft({ + output = "technic:battery", + recipe = { + {"group:wood", "technic:sulfur_lump", "group:wood"}, + {"technic:lead_ingot", "bucket:bucket_water", "technic:lead_ingot"}, + {"group:wood", "technic:sulfur_lump", "group:wood"}, + }, + replacements = { + {"bucket:bucket_water", "bucket:bucket_empty"} + } +}) +-- With oil extract: +minetest.register_craft({ + output = "technic:battery", + recipe = { + {"group:wood", "technic:sulfur_lump", "group:wood"}, + {"technic:lead_ingot", "homedecor:oil_extract", "technic:lead_ingot"}, + {"group:wood", "technic:sulfur_lump", "group:wood"}, + } +}) +-- With sulfur dust: +-- With water: +minetest.register_craft({ + output = "technic:battery", + recipe = { + {"group:wood", "technic:sulfur_dust", "group:wood"}, + {"technic:lead_ingot", "bucket:bucket_water", "technic:lead_ingot"}, + {"group:wood", "technic:sulfur_dust", "group:wood"}, + }, + replacements = { + {"bucket:bucket_water", "bucket:bucket_empty"} + } +}) +-- With oil extract: +minetest.register_craft({ + output = "technic:battery", + recipe = { + {"group:wood", "technic:sulfur_dust", "group:wood"}, + {"technic:lead_ingot", "homedecor:oil_extract", "technic:lead_ingot"}, + {"group:wood", "technic:sulfur_dust", "group:wood"}, + } +}) + +minetest.register_tool("technic:battery", { + description = S("RE Battery"), + inventory_image = "technic_battery.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + tool_capabilities = { + charge = 0, + max_drop_level = 0, + groupcaps = { + fleshy = {times={}, uses=10000, maxlevel=0} + } + } +}) + +-- x+2 + (z+2)*2 +local dirtab = { + [4] = 2, + [5] = 3, + [7] = 1, + [8] = 0 +} + +local tube = { + insert_object = function(pos, node, stack, direction) + if direction.y == 1 + or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then + return stack + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 0 then + return inv:add_item("src", stack) + else + return inv:add_item("dst", stack) + end + end, + can_insert = function(pos, node, stack, direction) + if direction.y == 1 + or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 0 then + return inv:room_for_item("src", stack) + else + return inv:room_for_item("dst", stack) + end + end, + connect_sides = {left=1, right=1, back=1, top=1}, +} + +function technic.register_battery_box(data) + local tier = data.tier + local ltier = string.lower(tier) + local formspec = + "size[8,9]".. + "image[1,1;1,2;technic_power_meter_bg.png]".. + "list[context;src;3,1;1,1;]".. + "image[4,1;1,1;technic_battery_reload.png]".. + "list[context;dst;5,1;1,1;]".. + "label[0,0;"..S("%s Battery Box"):format(tier).."]".. + "label[3,0;"..S("Charge").."]".. + "label[5,0;"..S("Discharge").."]".. + "label[1,3;"..S("Power level").."]".. + "list[current_player;main;0,5;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + (data.upgrade and + "list[context;upgrade1;3.5,3;1,1;]".. + "list[context;upgrade2;4.5,3;1,1;]".. + "label[3.5,4;"..S("Upgrade Slots").."]".. + "listring[context;upgrade1]".. + "listring[current_player;main]".. + "listring[context;upgrade2]".. + "listring[current_player;main]" + or "") + + -- + -- Generate formspec with power meter + -- + local function get_formspec(charge_ratio, channel) + return formspec .. "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:" .. + math.floor(charge_ratio * 100) .. ":technic_power_meter_fg.png]" .. + (digilines_path and + ("field[0.3,4;2.2,1;channel;Digiline channel;%s]button[2,3.7;1,1;setchannel;Set]") + :format(minetest.formspec_escape(channel)) + or "") + + end + + -- + -- Update fields not affecting internal network calculations and behavior in any way + -- + local function update_node(pos, update_formspec) + -- Read metadata and calculate actual values based on upgrades + local meta = minetest.get_meta(pos) + local current_charge = meta:get_int("internal_EU_charge") + local EU_upgrade = 0 + if data.upgrade then + EU_upgrade = technic.handle_machine_upgrades(meta) + end + local max_charge = data.max_charge * (1 + EU_upgrade / 10) + -- Select node textures + local charge_ratio = current_charge / max_charge + local charge_count = math.ceil(charge_ratio * 8) + charge_count = math.min(charge_count, 8) + charge_count = math.max(charge_count, 0) + local last_count = meta:get_float("last_side_shown") + if charge_count ~= last_count then + technic.swap_node(pos, "technic:" .. ltier .. "_battery_box" .. charge_count) + meta:set_float("last_side_shown", charge_count) + end + -- Update formspec and infotext + local eu_input = meta:get_int(tier.."_EU_input") + local infotext = S("@1 Battery Box: @2 / @3", tier, + technic.EU_string(current_charge), technic.EU_string(max_charge)) + if eu_input == 0 then + infotext = S("%s Idle"):format(infotext) + end + meta:set_string("infotext", infotext) + if update_formspec then + local channel = meta:get_string("channel") + meta:set_string("formspec", get_formspec(charge_ratio, channel)) + end + end + + local function get_tool(inventory, listname) + -- Get itemstack and check if it is registered tool + if inventory:is_empty(listname) then + return + end + local toolstack = inventory:get_stack(listname, 1) + local toolname = toolstack:get_name() + if technic.power_tools[toolname] == nil then + return + end + local tooldef = toolstack:get_definition() + if not tooldef then + return + end + return toolstack, tooldef + end + + local function charge_tools(meta, batt_charge, charge_step) + if batt_charge <= 0 then + return batt_charge, false + end + -- Get tool stack and definition + local inv = meta:get_inventory() + local toolstack, tooldef = get_tool(inv, "src") + if not toolstack then return batt_charge, false end + -- Do the charging, get and check + local get_charge = tooldef.technic_get_charge or technic.get_charge + local tool_charge, max_charge = get_charge(toolstack) + if tool_charge >= max_charge then + return batt_charge, true + end + -- Do the charging, set charge and replace stack + local set_charge = tooldef.technic_set_charge or technic.set_charge + charge_step = math.min(charge_step, batt_charge) + charge_step = math.min(charge_step, max_charge - tool_charge) + tool_charge = tool_charge + charge_step + set_charge(toolstack, tool_charge) + inv:set_stack("src", 1, toolstack) + return batt_charge - charge_step, (tool_charge == max_charge) + end + + local function discharge_tools(meta, batt_charge, charge_step, batt_max_charge) + if batt_charge >= batt_max_charge then + return batt_charge, false + end + -- Get tool stack and definition + local inv = meta:get_inventory() + local toolstack, tooldef = get_tool(inv, "dst") + if not toolstack then return batt_charge, false end + -- Do the discharging, get and check + local get_charge = tooldef.technic_get_charge or technic.get_charge + local tool_charge = get_charge(toolstack) + if tool_charge <= 0 then + return batt_charge, true + end + -- Do the discharging, set charge and replace stack + local set_charge = tooldef.technic_set_charge or technic.set_charge + charge_step = math.min(charge_step, batt_max_charge - batt_charge) + charge_step = math.min(charge_step, tool_charge) + tool_charge = tool_charge - charge_step + set_charge(toolstack, tool_charge) + inv:set_stack("dst", 1, toolstack) + return batt_charge + charge_step, (tool_charge == 0) + end + + local function run(pos, node, run_state, network) + local meta = minetest.get_meta(pos) + + local eu_input = meta:get_int(tier.."_EU_input") + local current_charge = meta:get_int("internal_EU_charge") + + local EU_upgrade, tube_upgrade = 0, 0 + if data.upgrade then + EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) + end + local max_charge = data.max_charge * (1 + EU_upgrade / 10) + + -- Charge/discharge the battery with the input EUs + if eu_input >= 0 then + current_charge = math.min(current_charge + eu_input, max_charge) + else + current_charge = math.max(current_charge + eu_input, 0) + end + + -- Charging/discharging tools here + local tool_full, tool_empty + current_charge, tool_full = charge_tools(meta, current_charge, data.charge_step) + current_charge, tool_empty = discharge_tools(meta, current_charge, data.discharge_step, max_charge) + + if data.tube and (tool_full or tool_empty) then + technic.handle_machine_pipeworks(pos, tube_upgrade, function(pos2, x_velocity, z_velocity) + if tool_full then + technic.send_items(pos2, x_velocity, z_velocity, "src") + elseif tool_empty then + technic.send_items(pos2, x_velocity, z_velocity, "dst") + end + end) + end + + -- We allow batteries to charge on less than the demand + local supply = math.min(data.discharge_rate, current_charge) + local demand = math.min(data.charge_rate, max_charge - current_charge) + network:update_battery(current_charge, max_charge, supply, demand) + + meta:set_int(tier.."_EU_demand", demand) + meta:set_int(tier.."_EU_supply", supply) + meta:set_int("internal_EU_charge", current_charge) + meta:set_int("internal_EU_charge_max", max_charge) + + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(2) + end + end + + local function on_timer(pos, elapsed) + if not technic.pos2network(pos) then return end + update_node(pos) + return true + end + + for i = 0, 8 do + local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, ["technic_"..ltier]=1} + if i ~= 0 then + groups.not_in_creative_inventory = 1 + end + + if data.tube then + groups.tubedevice = 1 + groups.tubedevice_receiver = 1 + end + + local top_tex = "technic_"..ltier.."_battery_box_top.png"..tube_entry + local front_tex = "technic_"..ltier.."_battery_box_front.png^technic_power_meter"..i..".png" + local side_tex = "technic_"..ltier.."_battery_box_side.png"..tube_entry + local bottom_tex = "technic_"..ltier.."_battery_box_bottom.png"..cable_entry + + if ltier == "lv" then + top_tex = "technic_"..ltier.."_battery_box_top.png" + front_tex = "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png" + side_tex = "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png" + end + + minetest.register_node("technic:"..ltier.."_battery_box"..i, { + description = S("%s Battery Box"):format(tier), + tiles = { + top_tex, + bottom_tex, + side_tex, + side_tex, + side_tex, + front_tex}, + groups = groups, + connect_sides = {"bottom"}, + tube = data.tube and tube or nil, + paramtype2 = "facedir", + sounds = default.node_sound_wood_defaults(), + drop = "technic:"..ltier.."_battery_box0", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Battery Box"):format(tier)) + meta:set_int(tier.."_EU_demand", 0) + meta:set_int(tier.."_EU_supply", 0) + meta:set_int(tier.."_EU_input", 0) + meta:set_float("internal_EU_charge", 0) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 1) + inv:set_size("upgrade1", 1) + inv:set_size("upgrade2", 1) + update_node(pos, true) + end, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, + on_timer = on_timer, + on_rightclick = function(pos) update_node(pos, true) end, + on_rotate = screwdriver.rotate_simple, + after_place_node = data.tube and pipeworks.after_place, + after_dig_node = technic.machine_after_dig_node, + on_receive_fields = function(pos, formname, fields, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + elseif fields.setchannel then + local meta = minetest.get_meta(pos) + meta:set_string("channel", fields.channel or "") + update_node(pos, true) + end + end, + digiline = { + receptor = { + rules = technic.digilines.rules, + action = function() end + }, + effector = { + rules = technic.digilines.rules, + action = function(pos, node, channel, msg) + if msg ~= "GET" and msg ~= "get" then + return + end + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + local inv = meta:get_inventory() + digilines.receptor_send(pos, technic.digilines.rules, channel, { + demand = meta:get_int(tier.."_EU_demand"), + supply = meta:get_int(tier.."_EU_supply"), + input = meta:get_int(tier.."_EU_input"), + charge = meta:get_int("internal_EU_charge"), + max_charge = data.max_charge * (1 + technic.handle_machine_upgrades(meta) / 10), + src = inv:get_stack("src", 1):to_table(), + dst = inv:get_stack("dst", 1):to_table(), + upgrade1 = inv:get_stack("upgrade1", 1):to_table(), + upgrade2 = inv:get_stack("upgrade2", 1):to_table() + }) + end + }, + }, + }) + end + + -- Register as a battery type + -- Battery type machines function as power reservoirs and can both receive and give back power + for i = 0, 8 do + technic.register_machine(tier, "technic:"..ltier.."_battery_box"..i, technic.battery) + end + +end -- End registration diff --git a/mods/technic_plus/technic/machines/register/cables.lua b/mods/technic_plus/technic/machines/register/cables.lua new file mode 100644 index 0000000..f01630f --- /dev/null +++ b/mods/technic_plus/technic/machines/register/cables.lua @@ -0,0 +1,355 @@ + +local S = technic.getter + +local cable_tier = {} + +function technic.is_tier_cable(name, tier) + return cable_tier[name] == tier +end + +function technic.get_cable_tier(name) + return cable_tier[name] +end + +local function match_cable_tier_filter(name, tiers) + -- Helper to check for set of cable tiers + if tiers then + for _, tier in ipairs(tiers) do if cable_tier[name] == tier then return true end end + return false + end + return cable_tier[name] ~= nil +end + +local function get_neighbors(pos, tiers) + -- TODO: Move this to network.lua + local tier_machines = tiers and technic.machines[tiers[1]] + local is_cable = match_cable_tier_filter(minetest.get_node(pos).name, tiers) + local network = is_cable and technic.networks[technic.pos2network(pos)] + local cables = {} + local machines = {} + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y+1, z=pos.z}, + {x=pos.x, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}, + } + for _,connected_pos in ipairs(positions) do + local name = minetest.get_node(connected_pos).name + if tier_machines and tier_machines[name] then + table.insert(machines, connected_pos) + elseif match_cable_tier_filter(name, tiers) then + local cable_network = technic.networks[technic.pos2network(connected_pos)] + table.insert(cables,{ + pos = connected_pos, + network = cable_network, + }) + if not network then network = cable_network end + end + end + return network, cables, machines +end + +local function place_network_node(pos, tiers, name) + -- Get connections and primary network if there's any + local network, cables, machines = get_neighbors(pos, tiers) + if not network then + -- We're evidently not on a network, nothing to add ourselves to + return + end + + -- Attach to primary network, this must be done before building branches from this position + technic.add_network_node(pos, network) + if not match_cable_tier_filter(name, tiers) then + if technic.machines[tiers[1]][name] == technic.producer_receiver then + -- FIXME: Multi tier machine like supply converter should also attach to other networks around pos. + -- Preferably also with connection rules defined for machine. + -- nodedef.connect_sides could be used to generate these rules. + -- For now, assume that all multi network machines belong to technic.producer_receiver group: + -- Get cables and networks around PR_RE machine + local _, machine_cables, _ = get_neighbors(pos) + for _,connection in ipairs(machine_cables) do + if connection.network and connection.network.id ~= network.id then + -- Attach PR_RE machine to secondary networks (last added is primary until above note is resolved) + technic.add_network_node(pos, connection.network) + end + end + else + -- Check connected cables for foreign networks, overload if machine was connected to multiple networks + for _, connection in ipairs(cables) do + if connection.network and connection.network.id ~= network.id then + technic.overload_network(connection.network.id) + technic.overload_network(network.id) + end + end + end + -- Machine added, skip all network building + return + end + + -- Attach neighbor machines if cable was added + for _,machine_pos in ipairs(machines) do + technic.add_network_node(machine_pos, network) + end + + -- Attach neighbor cables + for _,connection in ipairs(cables) do + if connection.network then + if connection.network.id ~= network.id then + -- Remove network if position belongs to another network + -- FIXME: Network requires partial rebuild but avoid doing it here if possible. + -- This might cause problems when merging two active networks into one + technic.remove_network(network.id) + technic.remove_network(connection.network.id) + connection.network = nil + end + else + -- There's cable that does not belong to any network, attach whole branch + technic.add_network_node(connection.pos, network) + technic.add_network_branch({connection.pos}, network) + end + end +end +-- NOTE: Exported for tests but should probably be moved to network.lua +technic.network_node_on_placenode = place_network_node + +local function remove_network_node(pos, tiers, name) + -- Get the network and neighbors + local network, cables, machines = get_neighbors(pos, tiers) + if not network then return end + + if not match_cable_tier_filter(name, tiers) then + -- Machine removed, skip cable checks to prevent unnecessary network cleanups + for _,connection in ipairs(cables) do + if connection.network then + -- Remove machine from all networks around it + technic.remove_network_node(connection.network.id, pos) + end + end + return + end + + if #cables == 1 then + -- Dead end cable removed, remove it from the network + technic.remove_network_node(network.id, pos) + -- Remove neighbor machines from network if cable was removed + if match_cable_tier_filter(name, tiers) then + for _,machine_pos in ipairs(machines) do + local net, _, _ = get_neighbors(machine_pos, tiers) + if not net then + -- Remove machine from network if it does not have other connected cables + technic.remove_network_node(network.id, machine_pos) + end + end + end + else + -- TODO: Check branches around and switching stations for branches: + -- remove branches that do not have switching station. Switching stations not tracked but could be easily tracked. + -- remove branches not connected to another branch. Individual branches not tracked, requires simple AI heuristics. + -- move branches that have switching station to new networks without checking or loading actual nodes in world. + -- To do all this network must be aware of individual branches and switching stations, might not be worth it... + -- For now remove whole network and let ABM rebuild it + technic.remove_network(network.id) + end +end +-- NOTE: Exported for tests but should probably be moved to network.lua +technic.network_node_on_dignode = remove_network_node + +local function item_place_override_node(itemstack, placer, pointed, node) + -- Call the default on_place function with a fake itemstack + local temp_itemstack = ItemStack(itemstack) + temp_itemstack:set_name(node.name) + local original_count = temp_itemstack:get_count() + temp_itemstack = + minetest.item_place(temp_itemstack, placer, pointed, node.param2) or + temp_itemstack + -- Remove the same number of items from the real itemstack + itemstack:take_item(original_count - temp_itemstack:get_count()) + return itemstack +end + +local function override_table(target, source) + if target and source then + for k,v in pairs(source) do + target[k] = v + end + end + return target +end + +function technic.register_cable(tier, size, description, prefix, override_cable, override_cable_plate) + prefix = prefix or "" + override_cable_plate = override_cable_plate or override_cable + local ltier = string.lower(tier) + local node_name = "technic:"..ltier..prefix.."_cable" + cable_tier[node_name] = tier + + local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + ["technic_"..ltier.."_cable"] = 1} + + local node_box = { + type = "connected", + fixed = {-size, -size, -size, size, size, size}, + connect_top = {-size, -size, -size, size, 0.5, size}, -- y+ + connect_bottom = {-size, -0.5, -size, size, size, size}, -- y- + connect_front = {-size, -size, -0.5, size, size, size}, -- z- + connect_back = {-size, -size, size, size, size, 0.5 }, -- z+ + connect_left = {-0.5, -size, -size, size, size, size}, -- x- + connect_right = {-size, -size, -size, 0.5, size, size}, -- x+ + } + + minetest.register_node(node_name, override_table({ + description = S("%s Cable"):format(tier), + tiles = {"technic_"..ltier..prefix.."_cable.png"}, + inventory_image = "technic_"..ltier..prefix.."_cable_wield.png", + wield_image = "technic_"..ltier..prefix.."_cable_wield.png", + groups = groups, + sounds = default.node_sound_wood_defaults(), + drop = node_name, + paramtype = "light", + sunlight_propagates = true, + drawtype = "nodebox", + node_box = node_box, + connects_to = {"group:technic_"..ltier.."_cable", + "group:technic_"..ltier, "group:technic_all_tiers"}, + on_construct = function(pos) place_network_node(pos, {tier}, node_name) end, + on_destruct = function(pos) remove_network_node(pos, {tier}, node_name) end, + }, override_cable)) + + local xyz = { + ["-x"] = 1, + ["-y"] = 2, + ["-z"] = 3, + ["x"] = 4, + ["y"] = 5, + ["z"] = 6, + } + local notconnects = { + [1] = "left", + [2] = "bottom", + [3] = "front", + [4] = "right", + [5] = "top", + [6] = "back", + } + local function s(p) + if p:find("-") then + return p:sub(2) + else + return "-"..p + end + end + -- TODO: Does this really need 6 different nodes? Use single node for cable plate if possible. + for p, i in pairs(xyz) do + local def = { + description = S("%s Cable Plate"):format(tier), + tiles = {"technic_"..ltier..prefix.."_cable.png"}, + groups = table.copy(groups), + sounds = default.node_sound_wood_defaults(), + drop = node_name .. "_plate_1", + paramtype = "light", + sunlight_propagates = true, + drawtype = "nodebox", + node_box = table.copy(node_box), + connects_to = {"group:technic_"..ltier.."_cable", + "group:technic_"..ltier, "group:technic_all_tiers"}, + on_construct = function(pos) place_network_node(pos, {tier}, node_name.."_plate_"..i) end, + on_destruct = function(pos) remove_network_node(pos, {tier}, node_name.."_plate_"..i) end, + } + def.node_box.fixed = { + {-size, -size, -size, size, size, size}, + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + } + def.node_box.fixed[1][xyz[p]] = 7/16 * (i-3.5)/math.abs(i-3.5) + def.node_box.fixed[2][xyz[s(p)]] = 3/8 * (i-3.5)/math.abs(i-3.5) + def.node_box["connect_"..notconnects[i]] = nil + if i == 1 then + def.on_place = function(itemstack, placer, pointed_thing) + local pointed_thing_diff = vector.subtract(pointed_thing.above, pointed_thing.under) + local num = 1 + local changed + for k, v in pairs(pointed_thing_diff) do + if v ~= 0 then + changed = k + num = xyz[s(tostring(v):sub(-2, -2)..k)] + break + end + end + local crtl = placer:get_player_control() + if (crtl.aux1 or crtl.sneak) and not (crtl.aux1 and crtl.sneak) and changed then + local fine_pointed = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + fine_pointed = vector.subtract(fine_pointed, pointed_thing.above) + fine_pointed[changed] = nil + local ps = {} + for p2, _ in pairs(fine_pointed) do + ps[#ps+1] = p2 + end + local bigger = (math.abs(fine_pointed[ps[1]]) > math.abs(fine_pointed[ps[2]]) and ps[1]) or ps[2] + if math.abs(fine_pointed[bigger]) < 0.3 then + num = num + 3 + num = (num <= 6 and num) or num - 6 + else + num = xyz[((fine_pointed[bigger] < 0 and "-") or "") .. bigger] + end + end + if num == nil then num = 1 end + return item_place_override_node( + itemstack, placer, pointed_thing, + {name = node_name.."_plate_"..num} + ) + end + else + def.groups.not_in_creative_inventory = 1 + end + def.on_rotate = function(pos, node, user, mode, new_param2) + local dir = 0 + if mode == screwdriver.ROTATE_FACE then -- left-click + dir = 1 + elseif mode == screwdriver.ROTATE_AXIS then -- right-click + dir = -1 + end + local num = tonumber(node.name:sub(-1)) + num = num + dir + num = (num >= 1 and num) or num + 6 + num = (num <= 6 and num) or num - 6 + minetest.swap_node(pos, {name = node_name.."_plate_"..num}) + end + minetest.register_node(node_name.."_plate_"..i, override_table(def, override_cable_plate)) + cable_tier[node_name.."_plate_"..i] = tier + end + + minetest.register_craft({ + output = node_name.."_plate_1 5", + recipe = { + {"" , "" , node_name}, + {node_name, node_name, node_name}, + {"" , "" , node_name}, + } + }) + + minetest.register_craft({ + output = node_name, + recipe = { + {node_name.."_plate_1"}, + } + }) +end + +minetest.register_on_mods_loaded(function() + -- FIXME: Move this to register.lua or somewhere else where register_on_mods_loaded is not required. + -- Possible better option would be to inject these when machine is registered in register.lua. + for name, tiers in pairs(technic.machine_tiers) do + local nodedef = minetest.registered_nodes[name] + local on_construct = type(nodedef.on_construct) == "function" and nodedef.on_construct + local on_destruct = type(nodedef.on_destruct) == "function" and nodedef.on_destruct + minetest.override_item(name,{ + on_construct = on_construct + and function(pos) on_construct(pos) place_network_node(pos, tiers, name) end + or function(pos) place_network_node(pos, tiers, name) end, + on_destruct = on_destruct + and function(pos) on_destruct(pos) remove_network_node(pos, tiers, name) end + or function(pos) remove_network_node(pos, tiers, name) end, + }) + end +end) diff --git a/mods/technic_plus/technic/machines/register/centrifuge.lua b/mods/technic_plus/technic/machines/register/centrifuge.lua new file mode 100644 index 0000000..dd05977 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/centrifuge.lua @@ -0,0 +1,8 @@ +local S = technic.getter + +function technic.register_centrifuge(data) + data.typename = "separating" + data.machine_name = "centrifuge" + data.machine_desc = S("%s Centrifuge") + technic.register_base_machine(data) +end diff --git a/mods/technic_plus/technic/machines/register/centrifuge_recipes.lua b/mods/technic_plus/technic/machines/register/centrifuge_recipes.lua new file mode 100644 index 0000000..a20b3b1 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/centrifuge_recipes.lua @@ -0,0 +1,48 @@ +local S = technic.getter + +technic.register_recipe_type("separating", { + description = S("Separating"), + output_size = 2, +}) + +function technic.register_separating_recipe(data) + data.time = data.time or 10 + technic.register_recipe("separating", data) +end + +local recipes = { + { "technic:bronze_dust 8", "technic:copper_dust 7", "technic:tin_dust" }, + { "technic:stainless_steel_dust 5", "technic:wrought_iron_dust 4", "technic:chromium_dust" }, + { "technic:brass_dust 3", "technic:copper_dust 2", "technic:zinc_dust" }, + { "technic:chernobylite_dust", "default:sand", "technic:uranium3_dust" }, + { "default:dirt 4", "default:sand", "default:gravel", "default:clay_lump 4" }, +} + +local function uranium_dust(p) + return "technic:uranium"..(p == 7 and "" or p).."_dust" +end +for p = 1, 34 do + table.insert(recipes, { uranium_dust(p).." 2", uranium_dust(p-1), uranium_dust(p+1) }) +end + +if minetest.get_modpath("bushes_classic") then + for _, berry in ipairs({ "blackberry", "blueberry", "gooseberry", "raspberry", "strawberry" }) do + table.insert(recipes, { "bushes:"..berry.."_bush", "default:stick 20", "bushes:"..berry.." 4" }) + end +end + +if minetest.get_modpath("farming") then + if minetest.get_modpath("cottages") then + -- work as a mechanized threshing floor + table.insert(recipes, { "farming:wheat", "farming:seed_wheat", "cottages:straw_mat" }) + table.insert(recipes, { "farming:barley", "farming:seed_barley", "cottages:straw_mat" }) + else + -- work in a less fancy and less efficient manner + table.insert(recipes, { "farming:wheat 4", "farming:seed_wheat 3", "default:dry_shrub 1" }) + table.insert(recipes, { "farming:barley 4", "farming:seed_barley 3", "default:dry_shrub 1" }) + end +end + +for _, data in pairs(recipes) do + technic.register_separating_recipe({ input = { data[1] }, output = { data[2], data[3], data[4] } }) +end diff --git a/mods/technic_plus/technic/machines/register/common.lua b/mods/technic_plus/technic/machines/register/common.lua new file mode 100644 index 0000000..b7917f4 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/common.lua @@ -0,0 +1,211 @@ + +local S = technic.getter + +-- handles the machine upgrades every tick +function technic.handle_machine_upgrades(meta) + -- Get the names of the upgrades + local inv = meta:get_inventory() + + local srcstack = inv:get_stack("upgrade1", 1) + local upg_item1 = srcstack and srcstack:get_name() + + srcstack = inv:get_stack("upgrade2", 1) + local upg_item2 = srcstack and srcstack:get_name() + + -- Save some power by installing battery upgrades. + -- Tube loading speed can be upgraded using control logic units. + local EU_upgrade = 0 + local tube_upgrade = 0 + + if upg_item1 == "technic:control_logic_unit" then + tube_upgrade = tube_upgrade + 1 + elseif upg_item1 == "technic:battery" then + EU_upgrade = EU_upgrade + 1 + end + + if upg_item2 == "technic:control_logic_unit" then + tube_upgrade = tube_upgrade + 1 + elseif upg_item2 == "technic:battery" then + EU_upgrade = EU_upgrade + 1 + end + + return EU_upgrade, tube_upgrade +end + +-- handles the machine upgrades when set or removed +local function on_machine_upgrade(meta, stack) + local stack_name = stack:get_name() + if stack_name == "default:chest" then + meta:set_int("public", 1) + return 1 + elseif stack_name ~= "technic:control_logic_unit" + and stack_name ~= "technic:battery" then + return 0 + end + return 1 +end + +-- something is about to be removed +local function on_machine_downgrade(meta, stack, list) + if stack:get_name() == "default:chest" then + local inv = meta:get_inventory() + local upg1, upg2 = inv:get_stack("upgrade1", 1), inv:get_stack("upgrade2", 1) + + -- only set 0 if theres not a nother chest in the other list too + if (not upg1 or not upg2 or upg1:get_name() ~= upg2:get_name()) then + meta:set_int("public", 0) + end + end + return 1 +end + + +function technic.send_items(pos, x_velocity, z_velocity, output_name) + -- Send items on their way in the pipe system. + if output_name == nil then + output_name = "dst" + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local i = 0 + for _, stack in ipairs(inv:get_list(output_name)) do + i = i + 1 + if stack then + local item0 = stack:to_table() + if item0 then + item0["count"] = 1 + technic.tube_inject_item(pos, pos, vector.new(x_velocity, 0, z_velocity), item0) + stack:take_item(1) + inv:set_stack(output_name, i, stack) + return + end + end + end +end + +-- FIXME: This funtion is never used anywhere, what is it for? +function technic.smelt_item(meta, result, speed) + local inv = meta:get_inventory() + meta:set_int("cook_time", meta:get_int("cook_time") + 1) + if meta:get_int("cook_time") < result.time / speed then + return + end + local afterfuel + result, afterfuel = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")}) + + if result and result.item then + meta:set_int("cook_time", 0) + -- check if there's room for output in "dst" list + if inv:room_for_item("dst", result.item) then + inv:set_stack("src", 1, afterfuel.items[1]) + inv:add_item("dst", result.item) + end + end +end + +function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function) + if send_function == nil then + send_function = technic.send_items + end + + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local pos1 = vector.new(pos) + local x_velocity = 0 + local z_velocity = 0 + + -- Output is on the left side of the furnace + if node.param2 == 3 then pos1.z = pos1.z - 1 z_velocity = -1 end + if node.param2 == 2 then pos1.x = pos1.x - 1 x_velocity = -1 end + if node.param2 == 1 then pos1.z = pos1.z + 1 z_velocity = 1 end + if node.param2 == 0 then pos1.x = pos1.x + 1 x_velocity = 1 end + + local output_tube_connected = false + local node1 = minetest.get_node(pos1) + if minetest.get_item_group(node1.name, "tubedevice") > 0 then + output_tube_connected = true + end + local tube_time = meta:get_int("tube_time") + tube_upgrade + if tube_time >= 2 then + tube_time = 0 + if output_tube_connected then + send_function(pos, x_velocity, z_velocity) + end + end + meta:set_int("tube_time", tube_time) +end + +function technic.machine_can_dig(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("src") or not inv:is_empty("dst") then + if player then + minetest.chat_send_player(player:get_player_name(), + S("Machine cannot be removed because it is not empty")) + end + return false + end + + return true +end + +function technic.machine_after_dig_node(pos, oldnode, oldmetadata, player) + if oldmetadata.inventory then + if oldmetadata.inventory.upgrade1 and oldmetadata.inventory.upgrade1[1] then + local stack = ItemStack(oldmetadata.inventory.upgrade1[1]) + if not stack:is_empty() then + minetest.add_item(pos, stack) + end + end + if oldmetadata.inventory.upgrade2 and oldmetadata.inventory.upgrade2[1] then + local stack = ItemStack(oldmetadata.inventory.upgrade2[1]) + if not stack:is_empty() then + minetest.add_item(pos, stack) + end + end + end + + if minetest.registered_nodes[oldnode.name].tube then + pipeworks.after_dig(pos, oldnode, oldmetadata, player) + end +end + +local function inv_change(pos, player, count, from_list, to_list, stack) + local playername = player:get_player_name() + local meta = minetest.get_meta(pos); + local public = (meta:get_int("public") == 1) + local to_upgrade = to_list == "upgrade1" or to_list == "upgrade2" + local from_upgrade = from_list == "upgrade1" or from_list == "upgrade2" + + if (not public or to_upgrade or from_upgrade) and minetest.is_protected(pos, playername) then + minetest.chat_send_player(playername, S("Inventory move disallowed due to protection")) + return 0 + end + if to_upgrade then + -- only place a single item into it, if it's empty + local empty = meta:get_inventory():is_empty(to_list) + if empty then + return on_machine_upgrade(meta, stack) + end + return 0 + elseif from_upgrade then + -- only called on take (not move) + on_machine_downgrade(meta, stack, from_list) + end + return count +end + +function technic.machine_inventory_put(pos, listname, index, stack, player) + return inv_change(pos, player, stack:get_count(), nil, listname, stack) +end + +function technic.machine_inventory_take(pos, listname, index, stack, player) + return inv_change(pos, player, stack:get_count(), listname, nil, stack) +end + +function technic.machine_inventory_move(pos, from_list, from_index, + to_list, to_index, count, player) + local stack = minetest.get_meta(pos):get_inventory():get_stack(from_list, from_index) + return inv_change(pos, player, count, from_list, to_list, stack) +end diff --git a/mods/technic_plus/technic/machines/register/compressor.lua b/mods/technic_plus/technic/machines/register/compressor.lua new file mode 100644 index 0000000..49830d7 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/compressor.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_compressor(data) + data.typename = "compressing" + data.machine_name = "compressor" + data.machine_desc = S("%s Compressor") + technic.register_base_machine(data) +end diff --git a/mods/technic_plus/technic/machines/register/compressor_recipes.lua b/mods/technic_plus/technic/machines/register/compressor_recipes.lua new file mode 100644 index 0000000..1946a26 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/compressor_recipes.lua @@ -0,0 +1,54 @@ + +local S = technic.getter + +technic.register_recipe_type("compressing", { description = S("Compressing") }) + +function technic.register_compressor_recipe(data) + data.time = data.time or 4 + technic.register_recipe("compressing", data) +end + +local recipes = { + {"default:snowblock", "default:ice"}, + {"default:sand 2", "default:sandstone"}, + {"default:desert_sand 2", "default:desert_sandstone"}, + {"default:silver_sand 2", "default:silver_sandstone"}, + {"default:desert_sandstone", "default:desert_stone"}, + {"technic:mixed_metal_ingot", "technic:composite_plate"}, + {"default:copper_ingot 5", "technic:copper_plate"}, + {"technic:coal_dust 4", "technic:graphite"}, + {"technic:carbon_cloth", "technic:carbon_plate"}, + {"technic:uranium35_ingot 5", "technic:uranium_fuel"}, + {"technic:graphite 25", "default:diamond"} +} + +if minetest.get_modpath("ethereal") then + -- the density of charcoal is ~1/10 of coal, otherwise it's pure carbon + table.insert(recipes, {"ethereal:charcoal_lump 10", "default:coal_lump 1"}) +end + + +-- defuse the default sandstone recipe, since we have the compressor to take over in a more realistic manner +minetest.clear_craft({ + recipe = { + {"default:sand", "default:sand"}, + {"default:sand", "default:sand"}, + }, +}) +minetest.clear_craft({ + recipe = { + {"default:desert_sand", "default:desert_sand"}, + {"default:desert_sand", "default:desert_sand"}, + }, +}) +minetest.clear_craft({ + recipe = { + {"default:silver_sand", "default:silver_sand"}, + {"default:silver_sand", "default:silver_sand"}, + }, +}) + +for _, data in pairs(recipes) do + technic.register_compressor_recipe({input = {data[1]}, output = data[2]}) +end + diff --git a/mods/technic_plus/technic/machines/register/electric_furnace.lua b/mods/technic_plus/technic/machines/register/electric_furnace.lua new file mode 100644 index 0000000..44de16c --- /dev/null +++ b/mods/technic_plus/technic/machines/register/electric_furnace.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_electric_furnace(data) + data.typename = "cooking" + data.machine_name = "electric_furnace" + data.machine_desc = S("%s Furnace") + technic.register_base_machine(data) +end diff --git a/mods/technic_plus/technic/machines/register/extractor.lua b/mods/technic_plus/technic/machines/register/extractor.lua new file mode 100644 index 0000000..eeef9ff --- /dev/null +++ b/mods/technic_plus/technic/machines/register/extractor.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_extractor(data) + data.typename = "extracting" + data.machine_name = "extractor" + data.machine_desc = S("%s Extractor") + technic.register_base_machine(data) +end diff --git a/mods/technic_plus/technic/machines/register/extractor_recipes.lua b/mods/technic_plus/technic/machines/register/extractor_recipes.lua new file mode 100644 index 0000000..6f8dd25 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/extractor_recipes.lua @@ -0,0 +1,117 @@ + +local S = technic.getter + +technic.register_recipe_type("extracting", { description = S("Extracting") }) + +function technic.register_extractor_recipe(data) + data.time = data.time or 4 + technic.register_recipe("extracting", data) +end + +if minetest.get_modpath("dye") then + -- check if we are using dye or unifieddyes + local unifieddyes = minetest.get_modpath("unifieddyes") + + -- register recipes with the same crafting ratios as `dye` provides + local dye_recipes = { + {"technic:coal_dust", "dye:black 2"}, + {"default:blueberries", "dye:violet 2"}, + {"default:grass_1", "dye:green 1"}, + {"default:dry_shrub", "dye:brown 4"}, + {"default:junglegrass", "dye:green 2"}, + {"default:cactus", "dye:green 4"}, + {"flowers:chrysanthemum_green", "dye:green 4"}, + {"flowers:geranium", "dye:blue 4"}, + {"flowers:dandelion_white", "dye:white 4"}, + {"flowers:dandelion_yellow", "dye:yellow 4"}, + {"flowers:tulip", "dye:orange 4"}, + {"flowers:tulip_black", "dye:black 8"}, + {"flowers:rose", "dye:red 4"}, + {"flowers:viola", "dye:violet 4"}, + {"bushes:blackberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:violet 4"}, + {"bushes:blueberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:magenta 4"}, + } + + if minetest.get_modpath("hunger") and minetest.get_modpath("ethereal") then + table.insert(dye_recipes, {"ethereal:willow_twig 12", "technic:aspirin_pill"}) + end + + if minetest.get_modpath("farming") then + -- Dyes --- + -- better recipes for farming's crafting methods (twice the output) + table.insert(dye_recipes, {"farming:chili_pepper", "dye:red 4"}) + table.insert(dye_recipes, {"farming:beans", "dye:green 4"}) + table.insert(dye_recipes, {"farming:grapes", "dye:violet 4"}) + table.insert(dye_recipes, {"farming:cocoa_beans", "dye:brown 4"}) + -- Some extra recipes: + -- Himalayan rhubarb root can give yellow dye IRL + table.insert(dye_recipes, {"farming:rhubarb", "dye:yellow 4"}) + table.insert(dye_recipes, {"farming:onion", "dye:yellow 4"}) + table.insert(dye_recipes, {"farming:blueberries", "dye:blue 4"}) + table.insert(dye_recipes, {"farming:raspberries", "dye:red 4"}) + end + + if minetest.get_modpath("ethereal") then + table.insert(dye_recipes, {"ethereal:seaweed", "dye:dark_green 6"}) + table.insert(dye_recipes, {"ethereal:coral2", "dye:cyan 6"}) + table.insert(dye_recipes, {"ethereal:coral3", "dye:orange 6"}) + table.insert(dye_recipes, {"ethereal:coral4", "dye:pink 6"}) + table.insert(dye_recipes, {"ethereal:coral5", "dye:green 6"}) + table.insert(dye_recipes, {"ethereal:fern", "dye:dark_green 4"}) + table.insert(dye_recipes, {"ethereal:snowygrass", "dye:grey 4"}) + table.insert(dye_recipes, {"ethereal:crystalgrass", "dye:blue 4"}) + end + + if minetest.get_modpath("bakedclay") then + table.insert(dye_recipes, {"bakedclay:delphinium", "dye:cyan 8"}) + table.insert(dye_recipes, {"bakedclay:thistle", "dye:magenta 8"}) + table.insert(dye_recipes, {"bakedclay:lazarus", "dye:pink 8"}) + table.insert(dye_recipes, {"bakedclay:mannagrass", "dye:dark_green 8"}) + end + + + if minetest.get_modpath("bonemeal") then + table.insert(dye_recipes, {"bonemeal:bone", "dye:white 8"}) + table.insert(dye_recipes, {"bonemeal:bonemeal", "dye:white 4"}) + end + + for _, data in ipairs(dye_recipes) do + technic.register_extractor_recipe({input = {data[1]}, output = data[2]}) + end + + -- overwrite the existing crafting recipes + local dyes = {"white", "red", "yellow", "blue", "violet", "orange"} + for _, color in ipairs(dyes) do + minetest.clear_craft({ + type = "shapeless", + recipe = {"group:flower,color_"..color}, + }) + minetest.register_craft({ + type = "shapeless", + output = "dye:"..color.." 1", + recipe = {"group:flower,color_"..color}, + }) + end + + minetest.clear_craft({ + type = "shapeless", + recipe = {"group:coal"}, + }) + minetest.register_craft({ + type = "shapeless", + output = "dye:black 1", + recipe = {"group:coal"}, + }) + + if unifieddyes then + minetest.clear_craft({ + type = "shapeless", + recipe = {"default:cactus"}, + }) + minetest.register_craft({ + type = "shapeless", + output = "dye:green 1", + recipe = {"default:cactus"}, + }) + end +end diff --git a/mods/technic_plus/technic/machines/register/freezer.lua b/mods/technic_plus/technic/machines/register/freezer.lua new file mode 100644 index 0000000..b4da6d9 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/freezer.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_freezer(data) + data.typename = "freezing" + data.machine_name = "freezer" + data.machine_desc = S("%s Freezer") + technic.register_base_machine(data) +end diff --git a/mods/technic_plus/technic/machines/register/freezer_recipes.lua b/mods/technic_plus/technic/machines/register/freezer_recipes.lua new file mode 100644 index 0000000..641b28a --- /dev/null +++ b/mods/technic_plus/technic/machines/register/freezer_recipes.lua @@ -0,0 +1,21 @@ + +local S = technic.getter + +technic.register_recipe_type("freezing", { description = S("Freezing") }) + +function technic.register_freezer_recipe(data) + data.time = data.time or 5 + technic.register_recipe("freezing", data) +end + +local recipes = { + {"bucket:bucket_water", { "default:ice", "bucket:bucket_empty" } }, + {"bucket:bucket_river_water", { "default:ice", "bucket:bucket_empty" } }, + {"default:dirt", "default:dirt_with_snow" }, + {"bucket:bucket_lava", { "default:obsidian", "bucket:bucket_empty" } } +} + +for _, data in pairs(recipes) do + technic.register_freezer_recipe({input = {data[1]}, output = data[2]}) +end + diff --git a/mods/technic_plus/technic/machines/register/generator.lua b/mods/technic_plus/technic/machines/register/generator.lua new file mode 100644 index 0000000..112bf78 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/generator.lua @@ -0,0 +1,292 @@ +local S = technic.getter + +local fs_helpers = pipeworks.fs_helpers +local tube_entry = "^pipeworks_tube_connection_metallic.png" + +local tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("src", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if meta:get_int("splitstacks") == 1 then + stack = stack:peek_item(1) + end + return inv:room_for_item("src", stack) + end, + connect_sides = {left=1, right=1, back=1, top=1, bottom=1}, +} + +function technic.register_generator(data) + + local tier = data.tier + local ltier = string.lower(tier) + + local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, ["technic_"..ltier]=1} + if data.tube then + groups.tubedevice = 1 + groups.tubedevice_receiver = 1 + end + local active_groups = {not_in_creative_inventory = 1} + for k, v in pairs(groups) do active_groups[k] = v end + + local generator_formspec = + "size[8,9;]".. + "label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]".. + "list[context;src;3,1;1,1;]".. + "image[4,1;1,1;default_furnace_fire_bg.png]".. + "list[current_player;main;0,5;8,4;]".. + "listring[]" + + local desc = S("Fuel-Fired %s Generator"):format(tier) + + local run = function(pos, node) + local meta = minetest.get_meta(pos) + local burn_time = meta:get_int("burn_time") + local burn_totaltime = meta:get_int("burn_totaltime") + -- If more to burn and the energy produced was used: produce some more + if burn_time > 0 then + meta:set_int(tier.."_EU_supply", data.supply) + burn_time = burn_time - 1 + meta:set_int("burn_time", burn_time) + end + -- Burn another piece of fuel + if burn_time == 0 then + local inv = meta:get_inventory() + if not inv:is_empty("src") then + local fuellist = inv:get_list("src") + local fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result( + {method = "fuel", width = 1, + items = fuellist}) + if not fuel or fuel.time == 0 then + meta:set_string("infotext", S("%s Out Of Fuel"):format(desc)) + technic.swap_node(pos, "technic:"..ltier.."_generator") + meta:set_int(tier.."_EU_supply", 0) + return + end + meta:set_int("burn_time", fuel.time) + meta:set_int("burn_totaltime", fuel.time) + inv:set_stack("src", 1, afterfuel.items[1]) + technic.swap_node(pos, "technic:"..ltier.."_generator_active") + meta:set_int(tier.."_EU_supply", data.supply) + else + technic.swap_node(pos, "technic:"..ltier.."_generator") + meta:set_int(tier.."_EU_supply", 0) + end + end + if burn_totaltime == 0 then burn_totaltime = 1 end + local percent = math.floor((burn_time / burn_totaltime) * 100) + meta:set_string("infotext", desc.." ("..percent.."%)") + + local form_buttons = "" + if ltier ~= "lv" then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + meta:set_string("formspec", + "size[8, 9]".. + "label[0, 0;"..minetest.formspec_escape(desc).."]".. + "list[context;src;3, 1;1, 1;]".. + "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:".. + (percent)..":default_furnace_fire_fg.png]".. + "list[current_player;main;0, 5;8, 4;]".. + "listring[]".. + form_buttons + ) + end + + local tentry = tube_entry + if ltier == "lv" then tentry = "" end + + minetest.register_node("technic:"..ltier.."_generator", { + description = desc, + tiles = { + "technic_"..ltier.."_generator_top.png"..tentry, + "technic_machine_bottom.png"..tentry, + "technic_"..ltier.."_generator_side.png"..tentry, + "technic_"..ltier.."_generator_side.png"..tentry, + "technic_"..ltier.."_generator_side.png"..tentry, + "technic_"..ltier.."_generator_front.png" + }, + paramtype2 = "facedir", + groups = groups, + connect_sides = {"bottom", "back", "left", "right"}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + tube = data.tube and tube or nil, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + meta:set_string("infotext", desc) + meta:set_int(data.tier.."_EU_supply", 0) + meta:set_int("burn_time", 0) + meta:set_int("tube_time", 0) + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + meta:set_string("formspec", generator_formspec..form_buttons) + local inv = meta:get_inventory() + inv:set_size("src", 1) + end, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, + after_place_node = data.tube and pipeworks.after_place, + after_dig_node = technic.machine_after_dig_node, + on_receive_fields = function(pos, formname, fields, sender) + if not pipeworks.may_configure(pos, sender) then return end + fs_helpers.on_receive_fields(pos, fields) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + meta:set_string("formspec", generator_formspec..form_buttons) + end, + }) + + minetest.register_node("technic:"..ltier.."_generator_active", { + description = desc, + tiles = { + "technic_"..ltier.."_generator_top.png"..tube_entry, + "technic_machine_bottom.png"..tube_entry, + "technic_"..ltier.."_generator_side.png"..tube_entry, + "technic_"..ltier.."_generator_side.png"..tube_entry, + "technic_"..ltier.."_generator_side.png"..tube_entry, + "technic_"..ltier.."_generator_front_active.png" + }, + paramtype2 = "facedir", + groups = active_groups, + connect_sides = {"bottom"}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + tube = data.tube and tube or nil, + drop = "technic:"..ltier.."_generator", + can_dig = technic.machine_can_dig, + after_dig_node = technic.machine_after_dig_node, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, + technic_on_disable = function(pos, node) + local timer = minetest.get_node_timer(pos) + timer:start(1) + end, + on_timer = function(pos) + -- Connected back? + if technic.get_timeout(tier, pos) > 0 then return false end + + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + + local burn_time = meta:get_int("burn_time") or 0 + + if burn_time <= 0 then + meta:set_int(tier.."_EU_supply", 0) + meta:set_int("burn_time", 0) + technic.swap_node(pos, "technic:"..ltier.."_generator") + return false + end + + local burn_totaltime = meta:get_int("burn_totaltime") or 0 + if burn_totaltime == 0 then burn_totaltime = 1 end + burn_time = burn_time - 1 + meta:set_int("burn_time", burn_time) + local percent = math.floor(burn_time / burn_totaltime * 100) + + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + meta:set_string("formspec", + "size[8, 9]".. + "label[0, 0;"..minetest.formspec_escape(desc).."]".. + "list[context;src;3, 1;1, 1;]".. + "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:".. + (percent)..":default_furnace_fire_fg.png]".. + "list[current_player;main;0, 5;8, 4;]".. + "listring[]".. + form_buttons + ) + return true + end, + on_receive_fields = function(pos, formname, fields, sender) + if not pipeworks.may_configure(pos, sender) then return end + fs_helpers.on_receive_fields(pos, fields) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + + local burn_totaltime = meta:get_int("burn_totaltime") or 0 + local burn_time = meta:get_int("burn_time") + local percent = math.floor(burn_time / burn_totaltime * 100) + + meta:set_string("formspec", + "size[8, 9]".. + "label[0, 0;"..minetest.formspec_escape(desc).."]".. + "list[context;src;3, 1;1, 1;]".. + "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:".. + (percent)..":default_furnace_fire_fg.png]".. + "list[current_player;main;0, 5;8, 4;]".. + "listring[]".. + form_buttons + ) + end, + }) + + technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer) + technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer) +end + diff --git a/mods/technic_plus/technic/machines/register/grinder.lua b/mods/technic_plus/technic/machines/register/grinder.lua new file mode 100644 index 0000000..19ea094 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/grinder.lua @@ -0,0 +1,9 @@ + +local S = technic.getter + +function technic.register_grinder(data) + data.typename = "grinding" + data.machine_name = "grinder" + data.machine_desc = S("%s Grinder") + technic.register_base_machine(data) +end diff --git a/mods/technic_plus/technic/machines/register/grinder_recipes.lua b/mods/technic_plus/technic/machines/register/grinder_recipes.lua new file mode 100644 index 0000000..670372f --- /dev/null +++ b/mods/technic_plus/technic/machines/register/grinder_recipes.lua @@ -0,0 +1,176 @@ + +local S = technic.getter + +technic.register_recipe_type("grinding", { description = S("Grinding") }) + +function technic.register_grinder_recipe(data) + data.time = data.time or 3 + technic.register_recipe("grinding", data) +end + +local recipes = { + -- Dusts + {"default:coal_lump", "technic:coal_dust 2"}, + {"default:copper_lump", "technic:copper_dust 2"}, + {"default:desert_stone", "default:desert_sand"}, + {"default:gold_lump", "technic:gold_dust 2"}, + {"default:iron_lump", "technic:wrought_iron_dust 2"}, + {"default:tin_lump", "technic:tin_dust 2"}, + {"technic:chromium_lump", "technic:chromium_dust 2"}, + {"technic:uranium_lump", "technic:uranium_dust 2"}, + {"technic:zinc_lump", "technic:zinc_dust 2"}, + {"technic:lead_lump", "technic:lead_dust 2"}, + {"technic:sulfur_lump", "technic:sulfur_dust 2"}, + {"default:stone", "technic:stone_dust"}, + {"default:sand", "technic:stone_dust"}, + + -- Other + {"default:cobble", "default:gravel"}, + {"default:gravel", "default:sand"}, + {"default:sandstone", "default:sand 2"}, -- reverse recipe can be found in the compressor + {"default:desert_sandstone", "default:desert_sand 2"}, -- reverse recipe can be found in the compressor + {"default:silver_sandstone", "default:silver_sand 2"}, -- reverse recipe can be found in the compressor + + {"default:ice", "default:snowblock"}, +} + +if minetest.get_modpath("ethereal") then + -- the density of charcoal is ~1/10 of coal, otherwise it's the same graphitic carbon + table.insert(recipes, {"ethereal:charcoal_lump 5", "technic:coal_dust 1"}) +end + +-- defuse the sandstone -> 4 sand recipe to avoid infinite sand bugs (also consult the inverse compressor recipe) +minetest.clear_craft({ + recipe = { + {"default:sandstone"} + }, +}) +minetest.clear_craft({ + recipe = { + {"default:desert_sandstone"} + }, +}) +minetest.clear_craft({ + recipe = { + {"default:silver_sandstone"} + }, +}) + +if minetest.get_modpath("farming") then + table.insert(recipes, {"farming:seed_wheat", "farming:flour 1"}) +end + +if minetest.get_modpath("moreores") then + table.insert(recipes, {"moreores:mithril_lump", "technic:mithril_dust 2"}) + table.insert(recipes, {"moreores:silver_lump", "technic:silver_dust 2"}) +end + +if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then + table.insert(recipes, {"gloopores:alatro_lump", "technic:alatro_dust 2"}) + table.insert(recipes, {"gloopores:kalite_lump", "technic:kalite_dust 2"}) + table.insert(recipes, {"gloopores:arol_lump", "technic:arol_dust 2"}) + table.insert(recipes, {"gloopores:talinite_lump", "technic:talinite_dust 2"}) + table.insert(recipes, {"gloopores:akalin_lump", "technic:akalin_dust 2"}) +end + +if minetest.get_modpath("homedecor") then + table.insert(recipes, {"home_decor:brass_ingot", "technic:brass_dust 1"}) +end + +for _, data in pairs(recipes) do + technic.register_grinder_recipe({input = {data[1]}, output = data[2]}) +end + +-- dusts +local function register_dust(name, ingot) + local lname = string.lower(name) + lname = string.gsub(lname, ' ', '_') + minetest.register_craftitem("technic:"..lname.."_dust", { + description = S("%s Dust"):format(S(name)), + inventory_image = "technic_"..lname.."_dust.png", + }) + if ingot then + minetest.register_craft({ + type = "cooking", + recipe = "technic:"..lname.."_dust", + output = ingot, + }) + technic.register_grinder_recipe({ input = {ingot}, output = "technic:"..lname.."_dust 1" }) + end +end + +-- Sorted alphibeticaly +register_dust("Brass", "basic_materials:brass_ingot") +register_dust("Bronze", "default:bronze_ingot") +register_dust("Carbon Steel", "technic:carbon_steel_ingot") +register_dust("Cast Iron", "technic:cast_iron_ingot") +register_dust("Chernobylite", "technic:chernobylite_block") +register_dust("Chromium", "technic:chromium_ingot") +register_dust("Coal", nil) +register_dust("Copper", "default:copper_ingot") +register_dust("Lead", "technic:lead_ingot") +register_dust("Gold", "default:gold_ingot") +register_dust("Mithril", "moreores:mithril_ingot") +register_dust("Silver", "moreores:silver_ingot") +register_dust("Stainless Steel", "technic:stainless_steel_ingot") +register_dust("Stone", "default:stone") +register_dust("Sulfur", nil) +register_dust("Tin", "default:tin_ingot") +register_dust("Wrought Iron", "technic:wrought_iron_ingot") +register_dust("Zinc", "technic:zinc_ingot") +if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then + register_dust("Akalin", "glooptest:akalin_ingot") + register_dust("Alatro", "glooptest:alatro_ingot") + register_dust("Arol", "glooptest:arol_ingot") + register_dust("Kalite", nil) + register_dust("Talinite", "glooptest:talinite_ingot") +end + +for p = 0, 35 do + local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil + local psuffix = p == 7 and "" or p + local ingot = "technic:uranium"..psuffix.."_ingot" + local dust = "technic:uranium"..psuffix.."_dust" + minetest.register_craftitem(dust, { + description = S("%s Dust"):format(string.format(S("%.1f%%-Fissile Uranium"), p/10)), + inventory_image = "technic_uranium_dust.png", + on_place_on_ground = minetest.craftitem_place_item, + groups = {uranium_dust=1, not_in_creative_inventory=nici}, + }) + minetest.register_craft({ + type = "cooking", + recipe = dust, + output = ingot, + }) + technic.register_grinder_recipe({ input = {ingot}, output = dust }) +end + +local function uranium_dust(p) + return "technic:uranium"..(p == 7 and "" or p).."_dust" +end +for pa = 0, 34 do + for pb = pa+1, 35 do + local pc = (pa+pb)/2 + if pc == math.floor(pc) then + minetest.register_craft({ + type = "shapeless", + recipe = { uranium_dust(pa), uranium_dust(pb) }, + output = uranium_dust(pc).." 2", + }) + end + end +end + +minetest.register_craft({ + type = "fuel", + recipe = "technic:coal_dust", + burntime = 50, +}) + +if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then + minetest.register_craft({ + type = "fuel", + recipe = "technic:kalite_dust", + burntime = 37.5, + }) +end diff --git a/mods/technic_plus/technic/machines/register/grindings.lua b/mods/technic_plus/technic/machines/register/grindings.lua new file mode 100644 index 0000000..f4c7e27 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/grindings.lua @@ -0,0 +1,73 @@ +local S = technic.getter +local moretrees = minetest.get_modpath("moretrees") +local dye = minetest.get_modpath("dye") + +-- sawdust, the finest wood/tree grinding +local sawdust = "technic:sawdust" +minetest.register_craftitem(sawdust, { + description = S("Sawdust"), + inventory_image = "technic_sawdust.png", +}) +minetest.register_craft({ type = "fuel", recipe = sawdust, burntime = 6 }) +technic.register_compressor_recipe({ input = {sawdust .. " 4"}, output = "default:wood" }) + +-- tree/wood grindings +local function register_tree_grinding(name, tree, wood, extract, grinding_color) + local lname = string.lower(name) + lname = string.gsub(lname, ' ', '_') + local grindings_name = "technic:"..lname.."_grindings" + if not minetest.registered_craftitems[grindings_name] then + local inventory_image = "technic_"..lname.."_grindings.png" + if grinding_color then + inventory_image = inventory_image .. "^[colorize:" .. grinding_color + end + minetest.register_craftitem(grindings_name, { + description = S("%s Grinding"):format(S(name)), + inventory_image = inventory_image, + }) + minetest.register_craft({ + type = "fuel", + recipe = grindings_name, + burntime = 8, + }) + end + technic.register_grinder_recipe({ input = { tree }, output = grindings_name .. " 4" }) + technic.register_grinder_recipe({ input = { grindings_name }, output = sawdust .. " 4" }) + if wood then + technic.register_grinder_recipe({ input = { wood }, output = grindings_name }) + end + if extract then + technic.register_extractor_recipe({ input = { grindings_name .. " 4" }, output = extract}) + technic.register_separating_recipe({ + input = { grindings_name .. " 4" }, + output = { sawdust .. " 4", extract } + }) + end +end + +local rubber_tree_planks = moretrees and "moretrees:rubber_tree_planks" +local default_extract = dye and "dye:brown 2" + +-- https://en.wikipedia.org/wiki/Catechu ancient brown dye from the wood of acacia trees +local acacia_extract = dye and "dye:brown 8" + +-- technic recipes don't support groups yet :/ +--register_tree_grinding("Common Tree", "group:tree", "group:wood", default_extract) + +register_tree_grinding("Acacia", "default:acacia_tree", "default:acacia_wood", acacia_extract) +register_tree_grinding("Common Tree", "default:tree", "default:wood", default_extract) +register_tree_grinding("Common Tree", "default:aspen_tree", "default:aspen_wood", default_extract) +register_tree_grinding("Common Tree", "default:jungletree", "default:junglewood", default_extract) +register_tree_grinding("Common Tree", "default:pine_tree", "default:pine_wood", default_extract) +register_tree_grinding("Rubber Tree", "moretrees:rubber_tree_trunk", rubber_tree_planks, "technic:raw_latex") +register_tree_grinding("Rubber Tree", "moretrees:rubber_tree_trunk_empty", nil, "technic:raw_latex") + +if moretrees then + local trees = { + "beech", "apple_tree", "oak", "sequoia", "birch", "palm", + "date_palm", "spruce", "cedar", "poplar", "willow", "fir" + } + for _,tree in pairs(trees) do + register_tree_grinding("Common Tree", "moretrees:"..tree.."_trunk", "moretrees:"..tree.."_planks", default_extract) + end +end diff --git a/mods/technic_plus/technic/machines/register/init.lua b/mods/technic_plus/technic/machines/register/init.lua new file mode 100644 index 0000000..29ec2ea --- /dev/null +++ b/mods/technic_plus/technic/machines/register/init.lua @@ -0,0 +1,35 @@ +local path = technic.modpath.."/machines/register" + +dofile(path.."/common.lua") + +-- Wiring stuff +dofile(path.."/cables.lua") +dofile(path.."/battery_box.lua") + +-- Generators +dofile(path.."/solar_array.lua") +dofile(path.."/generator.lua") + +-- API for machines +dofile(path.."/recipes.lua") +dofile(path.."/machine_base.lua") + +-- Recipes +dofile(path.."/alloy_recipes.lua") +dofile(path.."/grinder_recipes.lua") +dofile(path.."/extractor_recipes.lua") +dofile(path.."/compressor_recipes.lua") +dofile(path.."/centrifuge_recipes.lua") +dofile(path.."/freezer_recipes.lua") + +-- Multi-Machine Recipes +dofile(path.."/grindings.lua") + +-- Machines +dofile(path.."/alloy_furnace.lua") +dofile(path.."/electric_furnace.lua") +dofile(path.."/grinder.lua") +dofile(path.."/extractor.lua") +dofile(path.."/compressor.lua") +dofile(path.."/centrifuge.lua") +dofile(path.."/freezer.lua") diff --git a/mods/technic_plus/technic/machines/register/machine_base.lua b/mods/technic_plus/technic/machines/register/machine_base.lua new file mode 100644 index 0000000..6d644a8 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/machine_base.lua @@ -0,0 +1,282 @@ + +local S = technic.getter + +local fs_helpers = pipeworks.fs_helpers +local tube_entry = "^pipeworks_tube_connection_metallic.png" + +function technic.default_can_insert(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if meta:get_int("splitstacks") == 1 then + stack = stack:peek_item(1) + end + return inv:room_for_item("src", stack) +end + +function technic.new_default_tube() + return { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("src", stack) + end, + can_insert = technic.default_can_insert, + connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1}, + } +end + +local connect_default = {"bottom", "back", "left", "right"} + +local function round(v) + return math.floor(v + 0.5) +end + +function technic.register_base_machine(data) + local typename = data.typename + local input_size = technic.recipes[typename].input_size + local machine_name = data.machine_name + local machine_desc = data.machine_desc + local tier = data.tier + local ltier = string.lower(tier) + + data.modname = data.modname or minetest.get_current_modname() + + local groups = {cracky = 2, technic_machine = 1, ["technic_"..ltier] = 1} + if data.tube then + groups.tubedevice = 1 + groups.tubedevice_receiver = 1 + end + local active_groups = {not_in_creative_inventory = 1} + for k, v in pairs(groups) do active_groups[k] = v end + + local formspec = + "size[8,9;]".. + "list[context;src;"..(4-input_size)..",1;"..input_size..",1;]".. + "list[context;dst;5,1;2,2;]".. + "list[current_player;main;0,5;8,4;]".. + "label[0,0;"..machine_desc:format(tier).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]" + if data.upgrade then + formspec = formspec.. + "list[context;upgrade1;1,3;1,1;]".. + "list[context;upgrade2;2,3;1,1;]".. + "label[1,4;"..S("Upgrade Slots").."]".. + "listring[context;upgrade1]".. + "listring[current_player;main]".. + "listring[context;upgrade2]".. + "listring[current_player;main]" + end + + local tube = technic.new_default_tube() + if data.can_insert then + tube.can_insert = data.can_insert + end + if data.insert_object then + tube.insert_object = data.insert_object + end + + local run = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local eu_input = meta:get_int(tier.."_EU_input") + + local machine_desc_tier = machine_desc:format(tier) + local machine_node = data.modname..":"..ltier.."_"..machine_name + local machine_demand = data.demand + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int(tier.."_EU_demand", machine_demand[1]) + meta:set_int(tier.."_EU_input", 0) + return + end + + local EU_upgrade, tube_upgrade = 0, 0 + if data.upgrade then + EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta) + end + if data.tube then + technic.handle_machine_pipeworks(pos, tube_upgrade) + end + + local powered = eu_input >= machine_demand[EU_upgrade+1] + if powered then + meta:set_int("src_time", meta:get_int("src_time") + round(data.speed*10)) + end + while true do + local result = inv:get_list("src") and technic.get_recipe(typename, inv:get_list("src")) + if not result then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier)) + meta:set_int(tier.."_EU_demand", 0) + meta:set_int("src_time", 0) + return + end + meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1]) + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_desc_tier)) + if meta:get_int("src_time") < round(result.time*10) then + if not powered then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier)) + end + return + end + local output = result.output + if type(output) ~= "table" then output = { output } end + local output_stacks = {} + for _, o in ipairs(output) do + table.insert(output_stacks, ItemStack(o)) + end + local room_for_output = true + inv:set_size("dst_tmp", inv:get_size("dst")) + inv:set_list("dst_tmp", inv:get_list("dst")) + for _, o in ipairs(output_stacks) do + if not inv:room_for_item("dst_tmp", o) then + room_for_output = false + break + end + inv:add_item("dst_tmp", o) + end + if not room_for_output then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier)) + meta:set_int(tier.."_EU_demand", 0) + meta:set_int("src_time", round(result.time*10)) + return + end + meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10)) + inv:set_list("src", result.new_input) + inv:set_list("dst", inv:get_list("dst_tmp")) + end + end + + local tentry = tube_entry + if ltier == "lv" then + tentry = "" + end + + minetest.register_node(data.modname..":"..ltier.."_"..machine_name, { + description = machine_desc:format(tier), + tiles = { + data.modname.."_"..ltier.."_"..machine_name.."_top.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_bottom.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_front.png" + }, + paramtype2 = "facedir", + groups = groups, + tube = data.tube and tube or nil, + connect_sides = data.connect_sides or connect_default, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + + meta:set_string("infotext", machine_desc:format(tier)) + meta:set_int("tube_time", 0) + meta:set_string("formspec", formspec..form_buttons) + local inv = meta:get_inventory() + inv:set_size("src", input_size) + inv:set_size("dst", 4) + inv:set_size("upgrade1", 1) + inv:set_size("upgrade2", 1) + end, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, + after_place_node = data.tube and pipeworks.after_place, + after_dig_node = technic.machine_after_dig_node, + on_receive_fields = function(pos, formname, fields, sender) + if fields.quit then return end + if not pipeworks.may_configure(pos, sender) then return end + fs_helpers.on_receive_fields(pos, fields) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + meta:set_string("formspec", formspec..form_buttons) + end, + }) + + minetest.register_node(data.modname..":"..ltier.."_"..machine_name.."_active",{ + description = machine_desc:format(tier), + tiles = { + data.modname.."_"..ltier.."_"..machine_name.."_top.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_bottom.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_side.png"..tentry, + data.modname.."_"..ltier.."_"..machine_name.."_front_active.png" + }, + paramtype2 = "facedir", + drop = data.modname..":"..ltier.."_"..machine_name, + groups = active_groups, + connect_sides = data.connect_sides or connect_default, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + tube = data.tube and tube or nil, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + allow_metadata_inventory_move = technic.machine_inventory_move, + technic_run = run, + technic_disabled_machine_name = data.modname..":"..ltier.."_"..machine_name, + on_receive_fields = function(pos, formname, fields, sender) + if fields.quit then return end + if not pipeworks.may_configure(pos, sender) then return end + fs_helpers.on_receive_fields(pos, fields) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local form_buttons = "" + if not string.find(node.name, ":lv_") then + form_buttons = fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label + end + meta:set_string("formspec", formspec..form_buttons) + end, + }) + + technic.register_machine(tier, data.modname..":"..ltier.."_"..machine_name, technic.receiver) + technic.register_machine(tier, data.modname..":"..ltier.."_"..machine_name.."_active", technic.receiver) + +end -- End registration + diff --git a/mods/technic_plus/technic/machines/register/recipes.lua b/mods/technic_plus/technic/machines/register/recipes.lua new file mode 100644 index 0000000..3afe765 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/recipes.lua @@ -0,0 +1,113 @@ +local have_ui = minetest.get_modpath("unified_inventory") + +technic.recipes = { cooking = { input_size = 1, output_size = 1 } } +function technic.register_recipe_type(typename, origdata) + local data = {} + for k, v in pairs(origdata) do data[k] = v end + data.input_size = data.input_size or 1 + data.output_size = data.output_size or 1 + if have_ui and unified_inventory.register_craft_type and data.output_size == 1 then + unified_inventory.register_craft_type(typename, { + description = data.description, + width = data.input_size, + height = 1, + }) + end + data.recipes = {} + technic.recipes[typename] = data +end + +local function get_recipe_index(items) + if not items or type(items) ~= "table" then return false end + local l = {} + for i, stack in ipairs(items) do + l[i] = ItemStack(stack):get_name() + end + table.sort(l) + return table.concat(l, "/") +end + +local function register_recipe(typename, data) + -- Handle aliases + for i, stack in ipairs(data.input) do + data.input[i] = ItemStack(stack):to_string() + end + if type(data.output) == "table" then + for i, v in ipairs(data.output) do + data.output[i] = ItemStack(data.output[i]):to_string() + end + else + data.output = ItemStack(data.output):to_string() + end + + local recipe = {time = data.time, input = {}, output = data.output} + local index = get_recipe_index(data.input) + if not index then + print("[Technic] ignored registration of garbage recipe!") + return + end + for _, stack in ipairs(data.input) do + recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count() + end + + technic.recipes[typename].recipes[index] = recipe + if have_ui and technic.recipes[typename].output_size == 1 then + unified_inventory.register_craft({ + type = typename, + output = data.output, + items = data.input, + width = 0, + }) + end +end + +function technic.register_recipe(typename, data) + minetest.after(0.01, register_recipe, typename, data) -- Handle aliases +end + +function technic.get_recipe(typename, items) + if typename == "cooking" then -- Already builtin in Minetest, so use that + local result, new_input = minetest.get_craft_result({ + method = "cooking", + width = 1, + items = items}) + -- Compatibility layer + if not result or result.time == 0 then + return nil + -- Workaround for recipes with replacements + elseif not new_input.items[1]:is_empty() and new_input.items[1]:get_name() ~= items[1]:get_name() then + items[1]:take_item(1) + return {time = result.time, + new_input = {items[1]}, + output = {new_input.items[1], result.item}} + else + return {time = result.time, + new_input = new_input.items, + output = result.item} + end + end + local index = get_recipe_index(items) + if not index then + print("[Technic] ignored registration of garbage recipe!") + return + end + local recipe = technic.recipes[typename].recipes[index] + if recipe then + local new_input = {} + for i, stack in ipairs(items) do + if stack:get_count() < recipe.input[stack:get_name()] then + return nil + else + new_input[i] = ItemStack(stack) + new_input[i]:take_item(recipe.input[stack:get_name()]) + end + end + return {time = recipe.time, + new_input = new_input, + output = recipe.output} + else + return nil + end +end + + diff --git a/mods/technic_plus/technic/machines/register/solar_array.lua b/mods/technic_plus/technic/machines/register/solar_array.lua new file mode 100644 index 0000000..443ac90 --- /dev/null +++ b/mods/technic_plus/technic/machines/register/solar_array.lua @@ -0,0 +1,66 @@ + +local S = technic.getter + +function technic.register_solar_array(data) + local tier = data.tier + local ltier = string.lower(tier) + + local run = function(pos, node) + -- The action here is to make the solar array produce power + -- Power is dependent on the light level and the height above ground + -- There are many ways to cheat by using other light sources like lamps. + -- As there is no way to determine if light is sunlight that is just a shame. + -- To take care of some of it solar panels do not work outside daylight hours or if + -- built below 0m + local pos1 = {} + local machine_name = S("Arrayed Solar %s Generator"):format(tier) + pos1.y = pos.y + 1 + pos1.x = pos.x + pos1.z = pos.z + + technic.get_or_load_node(pos1) + local light = minetest.get_node_light(pos1, nil) + local time_of_day = minetest.get_timeofday() + local meta = minetest.get_meta(pos) + light = light or 0 + + -- turn on array only during day time and if sufficient light + -- I know this is counter intuitive when cheating by using other light sources. + if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > 0 then + local charge_to_give = math.floor((light + pos.y) * data.power) + charge_to_give = math.max(charge_to_give, 0) + charge_to_give = math.min(charge_to_give, data.power * 50) + meta:set_string("infotext", S("@1 Active (@2)", machine_name, + technic.EU_string(charge_to_give))) + meta:set_int(tier.."_EU_supply", charge_to_give) + else + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_int(tier.."_EU_supply", 0) + end + end + + minetest.register_node("technic:solar_array_"..ltier, { + tiles = {"technic_"..ltier.."_solar_array_top.png", "technic_"..ltier.."_solar_array_bottom.png", + "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png", + "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, ["technic_"..ltier]=1}, + connect_sides = {"bottom"}, + sounds = default.node_sound_wood_defaults(), + description = S("Arrayed Solar %s Generator"):format(tier), + active = false, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int(tier.."_EU_supply", 0) + end, + technic_run = run, + }) + + technic.register_machine(tier, "technic:solar_array_"..ltier, technic.producer) +end + diff --git a/mods/technic_plus/technic/machines/supply_converter.lua b/mods/technic_plus/technic/machines/supply_converter.lua new file mode 100644 index 0000000..ad006a7 --- /dev/null +++ b/mods/technic_plus/technic/machines/supply_converter.lua @@ -0,0 +1,219 @@ +-- The supply converter is a generic device which can convert from +-- LV to MV and back, and HV to MV and back. +-- The machine is configured by the wiring below and above it. +-- +-- It works like this: +-- The top side is setup as the receiver side, the bottom as the producer side. +-- Once the receiver side is powered it will deliver power to the other side. +-- Unused power is wasted just like any other producer! + +local digilines_path = minetest.get_modpath("digilines") + +local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" + +local function set_supply_converter_formspec(meta) + local formspec = "size[5,2.25]".. + "field[0.3,0.5;2,1;power;"..S("Input Power")..";"..meta:get_int("power").."]" + if digilines_path then + formspec = formspec.. + "field[2.3,0.5;3,1;channel;Digiline Channel;"..meta:get_string("channel").."]" + end + -- The names for these toggle buttons are explicit about which + -- state they'll switch to, so that multiple presses (arising + -- from the ambiguity between lag and a missed press) only make + -- the single change that the user expects. + if meta:get_int("mesecon_mode") == 0 then + formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]" + else + formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]" + end + if meta:get_int("enabled") == 0 then + formspec = formspec.."button[0,1.75;5,1;enable;"..S("%s Disabled"):format(S("Supply Converter")).."]" + else + formspec = formspec.."button[0,1.75;5,1;disable;"..S("%s Enabled"):format(S("Supply Converter")).."]" + end + meta:set_string("formspec", formspec) +end + +local supply_converter_receive_fields = function(pos, formname, fields, sender) + if not sender or minetest.is_protected(pos, sender:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local power = nil + if fields.power then + power = tonumber(fields.power) or 0 + power = math.max(power, 0) + power = math.min(power, 10000) + power = 100 * math.floor(power / 100) + if power == meta:get_int("power") then power = nil end + end + if power then meta:set_int("power", power) end + if fields.channel then meta:set_string("channel", fields.channel) end + if fields.enable then meta:set_int("enabled", 1) end + if fields.disable then meta:set_int("enabled", 0) end + if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end + if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end + set_supply_converter_formspec(meta) +end + +local mesecons = { + effector = { + action_on = function(pos, node) + minetest.get_meta(pos):set_int("mesecon_effect", 1) + end, + action_off = function(pos, node) + minetest.get_meta(pos):set_int("mesecon_effect", 0) + end + } +} + + +local digiline_def = { + receptor = { + rules = technic.digilines.rules, + action = function() end + }, + effector = { + rules = technic.digilines.rules, + action = function(pos, node, channel, msg) + if type(msg) ~= "string" then + return + end + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + msg = msg:lower() + if msg == "get" then + digilines.receptor_send(pos, technic.digilines.rules, channel, { + enabled = meta:get_int("enabled"), + power = meta:get_int("power"), + mesecon_mode = meta:get_int("mesecon_mode") + }) + return + elseif msg == "off" then + meta:set_int("enabled", 0) + elseif msg == "on" then + meta:set_int("enabled", 1) + elseif msg == "toggle" then + local onn = meta:get_int("enabled") + onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0. + meta:set_int("enabled", onn) + elseif msg:sub(1, 5) == "power" then + local power = tonumber(msg:sub(7)) + if not power then + return + end + power = math.max(power, 0) + power = math.min(power, 10000) + power = 100 * math.floor(power / 100) + meta:set_int("power", power) + elseif msg:sub(1, 12) == "mesecon_mode" then + meta:set_int("mesecon_mode", tonumber(msg:sub(14))) + else + return + end + set_supply_converter_formspec(meta) + end + }, +} + +local run = function(pos, node, run_stage) + -- run only in producer stage. + if run_stage == technic.receiver then + return + end + + local remain = 0.9 + -- Machine information + local machine_name = S("Supply Converter") + local meta = minetest.get_meta(pos) + local enabled = meta:get_int("enabled") == 1 and + (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0) + + local demand = enabled and meta:get_int("power") or 0 + + local pos_up = {x=pos.x, y=pos.y+1, z=pos.z} + local pos_down = {x=pos.x, y=pos.y-1, z=pos.z} + local name_up = minetest.get_node(pos_up).name + local name_down = minetest.get_node(pos_down).name + + local from = technic.get_cable_tier(name_up) + local to = technic.get_cable_tier(name_down) + + if from and to then + local input = meta:get_int(from.."_EU_input") + if (technic.get_timeout(from, pos) <= 0) or (technic.get_timeout(to, pos) <= 0) then + -- Supply converter timed out, either RE or PR network is not running anymore + input = 0 + end + meta:set_int(from.."_EU_demand", demand) + meta:set_int(from.."_EU_supply", 0) + meta:set_int(to.."_EU_demand", 0) + meta:set_int(to.."_EU_supply", input * remain) + meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, + technic.EU_string(input), from, + technic.EU_string(input * remain), to)) + else + meta:set_string("infotext", S("%s Has Bad Cabling"):format(machine_name)) + if to then + meta:set_int(to.."_EU_supply", 0) + end + if from then + meta:set_int(from.."_EU_demand", 0) + end + return + end + +end + +minetest.register_node("technic:supply_converter", { + description = S("Supply Converter"), + tiles = { + "technic_supply_converter_tb.png"..cable_entry, + "technic_supply_converter_tb.png"..cable_entry, + "technic_supply_converter_side.png", + "technic_supply_converter_side.png", + "technic_supply_converter_side.png", + "technic_supply_converter_side.png" + }, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, + technic_machine=1, technic_all_tiers=1}, + connect_sides = {"top", "bottom"}, + sounds = default.node_sound_wood_defaults(), + on_receive_fields = supply_converter_receive_fields, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Supply Converter")) + if digilines_path then + meta:set_string("channel", "supply_converter"..minetest.pos_to_string(pos)) + end + meta:set_int("power", 10000) + meta:set_int("enabled", 1) + meta:set_int("mesecon_mode", 0) + meta:set_int("mesecon_effect", 0) + set_supply_converter_formspec(meta) + end, + mesecons = mesecons, + digiline = digiline_def, + technic_run = run, + technic_on_disable = run, +}) + +minetest.register_craft({ + output = 'technic:supply_converter 1', + recipe = { + {'basic_materials:gold_wire', 'technic:rubber', 'technic:doped_silicon_wafer'}, + {'technic:mv_transformer', 'technic:machine_casing', 'technic:lv_transformer'}, + {'technic:mv_cable', 'technic:rubber', 'technic:lv_cable'}, + }, + replacements = { {"basic_materials:gold_wire", "basic_materials:empty_spool"}, }, +}) + +for tier, machines in pairs(technic.machines) do + technic.register_machine(tier, "technic:supply_converter", technic.producer_receiver) +end + diff --git a/mods/technic_plus/technic/machines/switching_station.lua b/mods/technic_plus/technic/machines/switching_station.lua new file mode 100644 index 0000000..884bc97 --- /dev/null +++ b/mods/technic_plus/technic/machines/switching_station.lua @@ -0,0 +1,174 @@ +-- See also technic/doc/api.md + +local mesecons_path = minetest.get_modpath("mesecons") + +local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" + +minetest.register_craft({ + output = "technic:switching_station", + recipe = { + {"", "technic:lv_transformer", ""}, + {"default:copper_ingot", "technic:machine_casing", "default:copper_ingot"}, + {"technic:lv_cable", "technic:lv_cable", "technic:lv_cable"} + } +}) + +local function start_network(pos) + local tier = technic.sw_pos2tier(pos) + if not tier then + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s Has No Network"):format(S("Switching Station"))) + return + end + local network_id = technic.sw_pos2network(pos) or technic.create_network(pos) + technic.activate_network(network_id) +end + +local mesecon_def +if mesecons_path then + mesecon_def = {effector = { + rules = mesecon.rules.default, + }} +end + +minetest.register_node("technic:switching_station",{ + description = S("Switching Station"), + tiles = { + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png"..cable_entry, + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png"}, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_all_tiers=1}, + connect_sides = {"bottom"}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Switching Station")) + meta:set_string("channel", "switching_station"..minetest.pos_to_string(pos)) + meta:set_string("formspec", "field[channel;Channel;${channel}]") + start_network(pos) + end, + on_destruct = function(pos) + -- Remove network when switching station is removed, if + -- there's another switching station network will be rebuilt. + local network_id = technic.sw_pos2network(pos) + if technic.networks[network_id] then + technic.remove_network(network_id) + end + end, + on_receive_fields = function(pos, formname, fields, sender) + if not fields.channel then + return + end + local plname = sender:get_player_name() + if minetest.is_protected(pos, plname) then + minetest.record_protection_violation(pos, plname) + return + end + local meta = minetest.get_meta(pos) + meta:set_string("channel", fields.channel) + end, + mesecons = mesecon_def, + digiline = { + receptor = { + rules = technic.digilines.rules, + action = function() end + }, + effector = { + rules = technic.digilines.rules, + action = function(pos, node, channel, msg) + if msg ~= "GET" and msg ~= "get" then + return + end + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + local network_id = technic.sw_pos2network(pos) + local network = network_id and technic.networks[network_id] + if network then + digilines.receptor_send(pos, technic.digilines.rules, channel, { + supply = network.supply, + demand = network.demand, + lag = network.lag + }) + else + digilines.receptor_send(pos, technic.digilines.rules, channel, { + error = "No network", + }) + end + end + }, + }, +}) + +----------------------------------------------- +-- The action code for the switching station -- +----------------------------------------------- + +-- Timeout ABM +-- Timeout for a node in case it was disconnected from the network +-- A node must be touched by the station continuously in order to function +minetest.register_abm({ + label = "Machines: timeout check", + nodenames = {"group:technic_machine"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + if not technic.machine_tiers[node.name] then + -- https://github.com/mt-mods/technic/issues/123 + return + end + -- Check for machine timeouts for all tiers + local tiers = technic.machine_tiers[node.name] + local timed_out = true + for _, tier in ipairs(tiers) do + local timeout = technic.get_timeout(tier, pos) + if timeout > 0 then + technic.touch_node(tier, pos, timeout - 1) + timed_out = false + end + end + -- If all tiers for machine timed out take action + if timed_out then + technic.disable_machine(pos, node) + end + end, +}) + +--Re-enable network of switching station if necessary, similar to the timeout above +minetest.register_abm({ + label = "Machines: re-enable check", + nodenames = {"technic:switching_station"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local network_id = technic.sw_pos2network(pos) + -- Check if network is overloaded / conflicts with another network + if network_id then + local infotext + local meta = minetest.get_meta(pos) + if technic.is_overloaded(network_id) then + local remaining = technic.reset_overloaded(network_id) + if remaining > 0 then + infotext = S("%s Network Overloaded, Restart in %dms"):format(S("Switching Station"), remaining / 1000) + else + infotext = S("%s Restarting Network"):format(S("Switching Station")) + end + technic.network_infotext(network_id, infotext) + else + -- Network exists and is not overloaded, reactivate network + technic.activate_network(network_id) + infotext = technic.network_infotext(network_id) + end + meta:set_string("infotext", infotext) + else + -- Network does not exist yet, attempt to create new network here + start_network(pos) + end + end, +}) diff --git a/mods/technic_plus/technic/machines/switching_station_globalstep.lua b/mods/technic_plus/technic/machines/switching_station_globalstep.lua new file mode 100644 index 0000000..0a8d51c --- /dev/null +++ b/mods/technic_plus/technic/machines/switching_station_globalstep.lua @@ -0,0 +1,118 @@ + +local has_monitoring_mod = minetest.get_modpath("monitoring") + +local active_switching_stations_metric, switching_stations_usage_metric + +if has_monitoring_mod then + active_switching_stations_metric = monitoring.gauge( + "technic_active_switching_stations", + "Number of active switching stations" + ) + + switching_stations_usage_metric = monitoring.counter( + "technic_switching_stations_usage", + "usage in microseconds cpu time" + ) +end + +-- the interval between technic_run calls +local technic_run_interval = 1.0 +local set_default_timeout = technic.set_default_timeout + +-- iterate over all collected switching stations and execute the technic_run function +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < technic_run_interval or not technic.powerctrl_state then + return + end + timer = 0 + + local max_lag = technic.get_max_lag() + -- slow down technic execution if the lag is higher than usual + if max_lag > 5.0 then + technic_run_interval = 5.0 + elseif max_lag > 2.0 then + technic_run_interval = 4.0 + elseif max_lag > 1.5 then + technic_run_interval = 3.0 + elseif max_lag > 1.0 then + technic_run_interval = 1.5 + else + -- normal run_interval + technic_run_interval = 1.0 + end + set_default_timeout(math.ceil(technic_run_interval) + 1) + + local now = minetest.get_us_time() + + local active_switches = 0 + + for network_id, network in pairs(technic.active_networks) do + local pos = technic.network2sw_pos(network_id) + + local node = technic.get_or_load_node(pos) or minetest.get_node(pos) + + if node.name ~= "technic:switching_station" then + -- station vanished + technic.remove_network(network_id) + + elseif network.timeout > now and not technic.is_overloaded(network_id) then + -- station active + active_switches = active_switches + 1 + + if network.skip > 0 then + network.skip = network.skip - 1 + else + local start = minetest.get_us_time() + technic.network_run(network_id) + local switch_diff = network.average_lag(minetest.get_us_time() - start) + + -- set lag in microseconds into the "lag" meta field + network.lag = switch_diff + + -- overload detection + if switch_diff > 250000 then + network.skip = 30 + elseif switch_diff > 150000 then + network.skip = 20 + elseif switch_diff > 75000 then + network.skip = 10 + elseif switch_diff > 50000 then + network.skip = 2 + end + + if network.skip > 0 then + -- calculate efficiency in percent and display it + local efficiency = math.floor(1/network.skip*100) + technic.network_infotext(network_id, "Polyfuse triggered, current efficiency: " .. + efficiency .. "% generated lag : " .. math.floor(switch_diff/1000) .. " ms") + + -- remove laggy network from active index + -- it will be reactivated when a player is near it + technic.active_networks[network_id] = nil + end + end + + else + -- station timed out + technic.active_networks[network_id] = nil + + end + end + + if has_monitoring_mod then + local time_usage = minetest.get_us_time() - now + active_switching_stations_metric.set(active_switches) + switching_stations_usage_metric.inc(time_usage) + end + +end) + +minetest.register_chatcommand("technic_flush_switch_cache", { + description = "removes all loaded networks from the cache", + privs = { server = true }, + func = function() + technic.active_networks = {} + end +}) diff --git a/mods/technic_plus/technic/max_lag.lua b/mods/technic_plus/technic/max_lag.lua new file mode 100644 index 0000000..f7307a3 --- /dev/null +++ b/mods/technic_plus/technic/max_lag.lua @@ -0,0 +1,23 @@ + +local multiplier = tonumber(technic.config:get("max_lag_reduction_multiplier")) + +local last_step = minetest.get_us_time() + +local max_lag = 0 + +minetest.register_globalstep(function() + -- Calculate own dtime as a workaround to 2 second limit + local now = minetest.get_us_time() + local dtime = now - last_step + last_step = now + + max_lag = max_lag * multiplier -- Decrease slowly + + if dtime > max_lag then + max_lag = dtime + end +end) + +function technic.get_max_lag() + return max_lag / 1000000 +end diff --git a/mods/technic_plus/technic/mod.conf b/mods/technic_plus/technic/mod.conf new file mode 100644 index 0000000..986b2e7 --- /dev/null +++ b/mods/technic_plus/technic/mod.conf @@ -0,0 +1,3 @@ +name = technic +depends = default, pipeworks, technic_worldgen, basic_materials +optional_depends = bucket, screwdriver, mesecons, mesecons_mvps, digilines, digiline_remote, intllib, unified_inventory, vector_extras, dye, monitoring diff --git a/mods/technic_plus/technic/models/technic_reactor.obj b/mods/technic_plus/technic/models/technic_reactor.obj new file mode 100644 index 0000000..c71374c --- /dev/null +++ b/mods/technic_plus/technic/models/technic_reactor.obj @@ -0,0 +1,362 @@ +# Blender v2.78 (sub 0) OBJ File: 'technic-reactor.blend' +# www.blender.org +o Cube.002 +v 0.249998 -0.500500 -0.249998 +v 0.249998 -0.500500 0.249998 +v -0.249999 -0.500500 -0.249998 +v -0.249999 -0.500500 0.249998 +v 0.283224 0.283132 0.423876 +v 0.283224 -0.283316 0.423876 +v -0.283224 0.283132 0.423875 +v -0.283224 -0.283316 0.423875 +v 0.195088 -0.195188 0.470985 +v 0.195088 0.194988 0.470985 +v -0.195088 -0.195188 0.470985 +v -0.195088 0.194988 0.470985 +v 0.099454 -0.099560 0.499495 +v 0.099454 0.099349 0.499495 +v -0.099455 -0.099560 0.499495 +v -0.099455 0.099349 0.499495 +v -0.360476 -0.360431 -0.360476 +v -0.195088 -0.195024 -0.470985 +v -0.195088 0.195153 -0.470985 +v 0.195089 -0.195024 -0.470985 +v 0.195089 0.195153 -0.470985 +v 0.283225 -0.283168 -0.423875 +v 0.283225 0.283281 -0.423875 +v -0.283224 -0.283168 -0.423875 +v -0.283224 0.283281 -0.423875 +v 0.099455 -0.099386 -0.499495 +v 0.099455 0.099525 -0.499495 +v -0.099455 -0.099386 -0.499495 +v -0.099455 0.099525 -0.499495 +v -0.360492 0.360411 0.360457 +v -0.099717 0.499491 0.099455 +v 0.099194 0.499491 0.099456 +v -0.195335 0.470933 0.195089 +v 0.195097 0.470933 0.195089 +v 0.194842 0.471069 0.194640 +v -0.283446 0.423808 0.283224 +v 0.283003 0.424005 0.282855 +v 0.360288 0.360647 0.360170 +v -0.099717 0.499526 -0.099455 +v 0.099194 0.499526 -0.099455 +v -0.194886 0.471001 -0.195088 +v 0.194842 0.471001 -0.195088 +v -0.195335 0.470865 -0.195343 +v -0.283076 0.423907 -0.283224 +v 0.283003 0.423907 -0.283224 +v -0.360358 0.360522 -0.360476 +v 0.360429 0.360474 -0.360515 +v 0.360664 -0.360306 -0.360247 +v -0.423875 -0.283187 0.283224 +v -0.423875 0.283165 0.283224 +v -0.423727 -0.283464 -0.283405 +v -0.423875 0.283165 -0.283224 +v 0.283446 -0.423844 -0.283224 +v -0.283244 -0.423843 -0.283224 +v -0.470985 0.195015 -0.195088 +v -0.470985 -0.195016 -0.195088 +v -0.360287 -0.360683 0.360323 +v 0.283446 -0.423745 0.283465 +v -0.283002 -0.423942 0.283224 +v 0.360664 -0.360306 0.360247 +v 0.423875 0.283152 0.283225 +v 0.423727 0.283428 -0.283405 +v 0.424023 -0.283021 0.282947 +v -0.470985 -0.195017 0.195088 +v 0.470985 0.195317 0.195089 +v 0.424023 -0.283021 -0.282948 +v 0.470985 -0.194860 -0.195088 +v 0.470883 0.195317 -0.195279 +v 0.471087 -0.194860 0.194752 +v -0.471087 0.194824 0.194751 +v -0.499495 0.099176 0.099455 +v -0.499495 -0.099735 0.099455 +v -0.499495 0.099175 -0.099455 +v -0.499495 -0.099735 -0.099455 +v 0.499495 -0.099212 0.099456 +v 0.499495 0.099699 0.099456 +v 0.499495 -0.099212 -0.099455 +v 0.499495 0.099699 -0.099455 +v 0.254894 -0.439053 0.254894 +v 0.254894 -0.438992 -0.254894 +v -0.254894 -0.439019 -0.254894 +v -0.254664 -0.439081 0.254894 +vt 0.2500 0.0000 +vt 0.2451 0.0610 +vt 0.7549 0.0609 +vt 0.7500 0.0000 +vt 0.2500 0.0000 +vt 0.2451 0.0609 +vt 0.7547 0.0609 +vt 0.7500 0.0000 +vt 0.2500 0.0000 +vt 0.2451 0.0609 +vt 0.7549 0.0610 +vt 0.7500 0.0000 +vt 0.2498 0.0000 +vt 0.2449 0.0610 +vt 0.7547 0.0610 +vt 0.7498 0.0000 +vt 0.2168 0.2167 +vt 0.1393 0.1397 +vt 0.1397 0.8606 +vt 0.2168 0.7831 +vt 0.4004 0.4006 +vt 0.3047 0.3050 +vt 0.3047 0.6952 +vt 0.4004 0.5995 +vt 0.7830 0.2168 +vt 0.8605 0.1397 +vt 0.1393 0.1396 +vt 0.2166 0.2168 +vt 0.3049 0.3048 +vt 0.3049 0.6950 +vt 0.6949 0.3050 +vt 0.5993 0.4006 +vt 0.5993 0.5995 +vt 0.6949 0.6952 +vt 0.7830 0.7833 +vt 0.2166 0.7833 +vt 0.7832 0.7831 +vt 0.6951 0.6950 +vt 0.8602 0.8605 +vt 0.1395 0.8605 +vt 0.4005 0.5993 +vt 0.5995 0.5993 +vt 0.6951 0.3048 +vt 0.7832 0.2167 +vt 0.5995 0.4004 +vt 0.8605 0.1396 +vt 0.7834 0.2165 +vt 0.7832 0.7832 +vt 0.8605 0.8605 +vt 0.4005 0.4004 +vt 0.8605 0.8604 +vt 0.1396 0.1395 +vt 0.2170 0.2168 +vt 0.2170 0.7829 +vt 0.1397 0.8602 +vt 0.2168 0.2168 +vt 0.1397 0.1393 +vt 0.1396 0.8604 +vt 0.2168 0.7832 +vt 0.6951 0.6950 +vt 0.3053 0.6948 +vt 0.6953 0.3047 +vt 0.7831 0.2168 +vt 0.7834 0.7832 +vt 0.6953 0.6951 +vt 0.8604 0.1395 +vt 0.3052 0.3049 +vt 0.6949 0.3049 +vt 0.8602 0.1397 +vt 0.7829 0.2170 +vt 0.7832 0.7832 +vt 0.8602 0.8606 +vt 0.3052 0.6946 +vt 0.3049 0.6951 +vt 0.2171 0.2170 +vt 0.1398 0.1397 +vt 0.1395 0.8605 +vt 0.2166 0.7834 +vt 0.4005 0.4008 +vt 0.3049 0.3051 +vt 0.3047 0.6953 +vt 0.4005 0.5997 +vt 0.6951 0.6953 +vt 0.4006 0.4003 +vt 0.4006 0.5992 +vt 0.5995 0.5992 +vt 0.5995 0.4003 +vt 0.6948 0.3051 +vt 0.5995 0.4008 +vt 0.5995 0.5997 +vt 0.5997 0.4005 +vt 0.5997 0.5995 +vt 0.6951 0.3050 +vt 0.3049 0.3050 +vt 0.4008 0.4005 +vt 0.4008 0.5995 +vt 0.8603 0.1393 +vt 0.2169 0.2168 +vt 0.1397 0.1395 +vt 0.1395 0.8605 +vt 0.2166 0.7832 +vt 0.8605 0.8605 +vt 0.1393 0.1398 +vt 0.2166 0.2168 +vt 0.7832 0.2168 +vt 0.8605 0.1395 +vt 0.1393 0.8602 +vt 0.2166 0.7835 +vt 0.7830 0.7832 +vt 0.8603 0.8603 +vt 0.2451 0.2451 +vt 0.7549 0.2451 +vt 0.7547 0.7549 +vt 0.2451 0.7549 +vt 0.2500 0.7500 +vt 0.7500 0.7500 +vt 0.7500 0.2500 +vt 0.2500 0.2500 +vn 0.9968 -0.0794 -0.0000 +vn 0.0000 -0.0794 0.9968 +vn -0.9970 -0.0776 0.0002 +vn 0.0000 -0.0794 -0.9968 +vn 0.6360 0.0002 0.7717 +vn -0.2857 0.0000 -0.9583 +vn 0.0002 -0.6353 -0.7722 +vn 0.4714 -0.0000 0.8819 +vn 0.2857 0.0000 -0.9583 +vn 0.0000 -0.2857 -0.9583 +vn 0.0000 0.4714 -0.8819 +vn -0.0000 0.4714 0.8819 +vn 0.6346 -0.0000 -0.7728 +vn -0.6347 0.0001 -0.7728 +vn -0.0000 0.2857 0.9583 +vn -0.0000 -0.4714 0.8819 +vn -0.2857 -0.0000 0.9583 +vn -0.7727 0.0001 -0.6347 +vn -0.0000 -0.2857 0.9583 +vn -0.4714 0.0000 -0.8819 +vn 0.2857 -0.0000 0.9583 +vn -0.4714 -0.0000 0.8819 +vn 0.4714 0.0000 -0.8819 +vn 0.0001 0.6347 0.7728 +vn 0.0000 -0.4714 -0.8819 +vn 0.0000 0.2857 -0.9583 +vn 0.6339 0.7734 -0.0001 +vn -0.7722 -0.0002 0.6353 +vn -0.8820 0.4713 0.0000 +vn -0.4717 0.8817 -0.0002 +vn 0.0000 0.7730 -0.6344 +vn 0.0000 0.8820 -0.4713 +vn 0.7721 0.0002 0.6355 +vn 0.4711 0.8821 -0.0002 +vn 0.0000 0.0000 -1.0000 +vn 0.7732 -0.0000 -0.6342 +vn -0.0000 -0.0000 1.0000 +vn 0.9583 0.0001 -0.2859 +vn -0.7730 0.6345 -0.0000 +vn 0.8815 0.4723 -0.0001 +vn -1.0000 -0.0000 0.0000 +vn 0.9583 0.0000 0.2857 +vn 0.0000 0.6344 -0.7730 +vn -0.2867 0.9580 -0.0001 +vn -0.9580 -0.2867 0.0000 +vn 0.0000 0.9583 -0.2858 +vn 0.7733 -0.6340 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.8818 -0.0000 -0.4716 +vn 0.9585 -0.2852 -0.0002 +vn 0.2853 0.9584 -0.0001 +vn 0.9582 0.2862 -0.0002 +vn -0.0000 0.8819 0.4715 +vn 0.0002 -0.6359 0.7718 +vn -0.7728 -0.6346 0.0000 +vn -0.9586 0.2849 -0.0001 +vn -0.6353 -0.0002 0.7722 +vn -0.0000 0.9582 0.2861 +vn -0.9583 0.0000 -0.2857 +vn 0.8821 -0.0001 0.4711 +vn -0.6348 0.7727 -0.0001 +vn -0.8821 0.0001 0.4711 +vn 0.8818 0.0000 -0.4716 +vn -0.9583 -0.0000 0.2857 +vn -0.8820 -0.4713 -0.0000 +vn 0.0000 1.0000 0.0002 +vn 0.8824 -0.4705 -0.0001 +vn 0.7729 0.6346 0.0000 +vn 0.0001 0.7732 0.6342 +vn 0.0002 -0.7722 -0.6354 +vn 0.6351 -0.7724 0.0001 +vn -0.6340 -0.7733 0.0000 +vn 0.0000 -0.8817 -0.4719 +vn -0.4716 -0.8818 0.0001 +vn 0.0003 -0.7720 0.6356 +vn 0.4706 -0.8823 0.0000 +vn 0.0001 -0.8817 0.4718 +vn 0.0000 -1.0000 0.0000 +g Cube.002_Cube.002_allsides +s off +f 1/1/1 80/2/1 79/3/1 2/4/1 +f 2/5/2 79/6/2 82/7/2 4/8/2 +f 4/9/3 82/10/3 81/11/3 3/12/3 +f 3/13/4 81/14/4 80/15/4 1/16/4 +f 6/17/5 60/18/5 38/19/5 5/20/5 +f 28/21/6 18/22/6 19/23/6 29/24/6 +f 22/25/7 48/26/7 17/27/7 24/28/7 +f 9/29/8 6/17/8 5/20/8 10/30/8 +f 20/31/9 26/32/9 27/33/9 21/34/9 +f 26/32/10 20/31/10 18/22/10 28/21/10 +f 23/35/11 21/34/11 19/23/11 25/36/11 +f 10/30/12 5/20/12 7/37/12 12/38/12 +f 48/26/13 22/25/13 23/35/13 47/39/13 +f 24/28/14 17/27/14 46/40/14 25/36/14 +f 14/41/15 10/30/15 12/38/15 16/42/15 +f 6/17/16 9/29/16 11/43/16 8/44/16 +f 11/43/17 15/45/17 16/42/17 12/38/17 +f 17/46/18 51/47/18 52/48/18 46/49/18 +f 9/29/19 13/50/19 15/45/19 11/43/19 +f 18/22/20 24/28/20 25/36/20 19/23/20 +f 13/50/21 9/29/21 10/30/21 14/41/21 +f 8/44/22 11/43/22 12/38/22 7/37/22 +f 22/25/23 20/31/23 21/34/23 23/35/23 +f 5/20/24 38/19/24 30/51/24 7/37/24 +f 20/31/25 22/25/25 24/28/25 18/22/25 +f 21/34/26 27/33/26 29/24/26 19/23/26 +f 47/52/27 45/53/27 37/54/27 38/55/27 +f 49/56/28 57/57/28 30/58/28 50/59/28 +f 52/48/29 55/60/29 70/61/29 50/59/29 +f 43/62/30 44/63/30 36/64/30 33/65/30 +f 45/53/31 47/52/31 46/66/31 44/63/31 +f 42/67/32 45/53/32 44/63/32 43/62/32 41/68/32 +f 60/69/33 63/70/33 61/71/33 38/72/33 +f 45/53/34 42/67/34 35/73/34 34/74/34 37/54/34 +f 28/21/35 29/24/35 27/33/35 26/32/35 +f 66/75/36 48/76/36 47/77/36 62/78/36 +f 13/50/37 14/41/37 16/42/37 15/45/37 +f 77/79/38 67/80/38 68/81/38 78/82/38 +f 46/49/39 52/48/39 50/59/39 30/58/39 +f 68/81/40 62/78/40 61/71/40 65/83/40 +f 72/84/41 71/85/41 73/86/41 74/87/41 +f 69/88/42 75/89/42 76/90/42 65/83/42 +f 47/39/43 23/35/43 25/36/43 46/40/43 +f 39/91/44 41/68/44 43/62/44 33/65/44 31/92/44 +f 74/87/45 56/93/45 64/94/45 72/84/45 +f 40/95/46 42/67/46 41/68/46 39/91/46 +f 48/76/47 66/75/47 63/70/47 60/69/47 +f 77/79/48 78/82/48 76/90/48 75/89/48 +f 51/47/49 56/93/49 55/60/49 52/48/49 +f 67/80/50 77/79/50 75/89/50 69/88/50 +f 42/67/51 40/95/51 32/96/51 35/73/51 +f 78/82/52 68/81/52 65/83/52 76/90/52 +f 37/54/53 34/74/53 33/65/53 36/64/53 +f 60/18/54 6/17/54 8/44/54 57/97/54 +f 51/47/55 17/46/55 57/57/55 49/56/55 +f 55/60/56 73/86/56 71/85/56 70/61/56 +f 57/97/57 8/44/57 7/37/57 30/51/57 +f 34/74/58 35/73/58 32/96/58 31/92/58 33/65/58 +f 56/93/59 74/87/59 73/86/59 55/60/59 +f 63/70/60 69/88/60 65/83/60 61/71/60 +f 44/98/61 46/99/61 30/100/61 36/101/61 +f 64/94/62 49/56/62 50/59/62 70/61/62 +f 67/80/63 66/75/63 62/78/63 68/81/63 +f 72/84/64 64/94/64 70/61/64 71/85/64 +f 56/93/65 51/47/65 49/56/65 64/94/65 +f 40/95/66 39/91/66 31/92/66 32/96/66 +f 66/75/67 67/80/67 69/88/67 63/70/67 +f 62/78/68 47/77/68 38/72/68 61/71/68 +f 30/102/69 38/55/69 37/54/69 36/64/69 +g Cube.002_Cube.002_bottom +f 48/103/70 53/104/70 54/105/70 17/106/70 +f 53/104/71 48/103/71 60/107/71 58/108/71 +f 17/106/72 54/105/72 59/109/72 57/110/72 +f 53/104/73 80/111/73 81/112/73 54/105/73 +f 54/105/74 81/112/74 82/113/74 59/109/74 +f 58/108/75 60/107/75 57/110/75 59/109/75 +f 79/114/76 80/111/76 53/104/76 58/108/76 +f 82/113/77 79/114/77 58/108/77 59/109/77 +f 2/115/78 4/116/78 3/117/78 1/118/78 diff --git a/mods/technic_plus/technic/radiation.lua b/mods/technic_plus/technic/radiation.lua new file mode 100644 index 0000000..abc9f49 --- /dev/null +++ b/mods/technic_plus/technic/radiation.lua @@ -0,0 +1,553 @@ +--[[ +Radioactivity + +Radiation resistance represents the extent to which a material +attenuates radiation passing through it; i.e., how good a radiation +shield it is. This is identified per node type. For materials that +exist in real life, the radiation resistance value that this system +uses for a node type consisting of a solid cube of that material is the +(approximate) number of halvings of ionising radiation that is achieved +by a meter of the material in real life. This is approximately +proportional to density, which provides a good way to estimate it. +Homogeneous mixtures of materials have radiation resistance computed +by a simple weighted mean. Note that the amount of attenuation that +a material achieves in-game is not required to be (and is not) the +same as the attenuation achieved in real life. + +Radiation resistance for a node type may be specified in the node +definition, under the key "radiation_resistance". As an interim +measure, until node definitions widely include this, this code +knows a bunch of values for particular node types in several mods, +and values for groups of node types. The node definition takes +precedence if it specifies a value. Nodes for which no value at +all is known are taken to provide no radiation resistance at all; +this is appropriate for the majority of node types. Only node types +consisting of a fairly homogeneous mass of material should report +non-zero radiation resistance; anything with non-uniform geometry +or complex internal structure should show no radiation resistance. +Fractional resistance values are permitted. +--]] + +local MP = minetest.get_modpath("technic") +local throttle = dofile(MP .. "/util/throttle.lua") + +local S = technic.getter + +local rad_resistance_node = { + ["default:brick"] = 13, + ["default:bronzeblock"] = 45, + ["default:clay"] = 15, + ["default:coalblock"] = 9.6, + ["default:cobble"] = 15, + ["default:copperblock"] = 46, + ["default:desert_cobble"] = 15, + ["default:desert_sand"] = 10, + ["default:desert_stone"] = 17, + ["default:desert_stonebrick"] = 17, + ["default:diamondblock"] = 24, + ["default:dirt"] = 8.2, + ["default:dirt_with_grass"] = 8.2, + ["default:dirt_with_grass_footsteps"] = 8.2, + ["default:dirt_with_snow"] = 8.2, + ["default:glass"] = 17, + ["default:goldblock"] = 170, + ["default:gravel"] = 10, + ["default:ice"] = 5.6, + ["default:lava_flowing"] = 8.5, + ["default:lava_source"] = 17, + ["default:mese"] = 21, + ["default:mossycobble"] = 15, + ["default:tinblock"] = 37, + ["pbj_pup:pbj_pup"] = 10000, + ["pbj_pup:pbj_pup_candies"] = 10000, + ["gloopblocks:rainbow_block_diagonal"] = 5000, + ["gloopblocks:rainbow_block_horizontal"] = 10000, + ["default:nyancat"] = 10000, + ["default:nyancat_rainbow"] = 10000, + ["nyancat:nyancat"] = 10000, + ["nyancat:nyancat_rainbow"] = 10000, + ["default:obsidian"] = 18, + ["default:obsidian_glass"] = 18, + ["default:sand"] = 10, + ["default:sandstone"] = 15, + ["default:sandstonebrick"] = 15, + ["default:snowblock"] = 1.7, + ["default:steelblock"] = 40, + ["default:stone"] = 17, + ["default:stone_with_coal"] = 16, + ["default:stone_with_copper"] = 20, + ["default:stone_with_diamond"] = 18, + ["default:stone_with_gold"] = 34, + ["default:stone_with_iron"] = 20, + ["default:stone_with_mese"] = 17, + ["default:stone_with_tin"] = 19, + ["default:stonebrick"] = 17, + ["default:water_flowing"] = 2.8, + ["default:water_source"] = 5.6, + ["farming:desert_sand_soil"] = 10, + ["farming:desert_sand_soil_wet"] = 10, + ["farming:soil"] = 8.2, + ["farming:soil_wet"] = 8.2, + ["glooptest:akalin_crystal_glass"] = 21, + ["glooptest:akalinblock"] = 40, + ["glooptest:alatro_crystal_glass"] = 21, + ["glooptest:alatroblock"] = 40, + ["glooptest:amethystblock"] = 18, + ["glooptest:arol_crystal_glass"] = 21, + ["glooptest:crystal_glass"] = 21, + ["glooptest:emeraldblock"] = 19, + ["glooptest:heavy_crystal_glass"] = 21, + ["glooptest:mineral_akalin"] = 20, + ["glooptest:mineral_alatro"] = 20, + ["glooptest:mineral_amethyst"] = 17, + ["glooptest:mineral_arol"] = 20, + ["glooptest:mineral_desert_coal"] = 16, + ["glooptest:mineral_desert_iron"] = 20, + ["glooptest:mineral_emerald"] = 17, + ["glooptest:mineral_kalite"] = 20, + ["glooptest:mineral_ruby"] = 18, + ["glooptest:mineral_sapphire"] = 18, + ["glooptest:mineral_talinite"] = 20, + ["glooptest:mineral_topaz"] = 18, + ["glooptest:reinforced_crystal_glass"] = 21, + ["glooptest:rubyblock"] = 27, + ["glooptest:sapphireblock"] = 27, + ["glooptest:talinite_crystal_glass"] = 21, + ["glooptest:taliniteblock"] = 40, + ["glooptest:topazblock"] = 24, + ["mesecons_extrawires:mese_powered"] = 21, + ["moreblocks:cactus_brick"] = 13, + ["moreblocks:cactus_checker"] = 8.5, + ["moreblocks:circle_stone_bricks"] = 17, + ["moreblocks:clean_glass"] = 17, + ["moreblocks:coal_checker"] = 9.0, + ["moreblocks:coal_glass"] = 17, + ["moreblocks:coal_stone"] = 17, + ["moreblocks:coal_stone_bricks"] = 17, + ["moreblocks:glow_glass"] = 17, + ["moreblocks:grey_bricks"] = 15, + ["moreblocks:iron_checker"] = 11, + ["moreblocks:iron_glass"] = 17, + ["moreblocks:iron_stone"] = 17, + ["moreblocks:iron_stone_bricks"] = 17, + ["moreblocks:plankstone"] = 9.3, + ["moreblocks:split_stone_tile"] = 15, + ["moreblocks:split_stone_tile_alt"] = 15, + ["moreblocks:stone_tile"] = 15, + ["moreblocks:super_glow_glass"] = 17, + ["moreblocks:tar"] = 7.0, + ["moreblocks:wood_tile"] = 1.7, + ["moreblocks:wood_tile_center"] = 1.7, + ["moreblocks:wood_tile_down"] = 1.7, + ["moreblocks:wood_tile_flipped"] = 1.7, + ["moreblocks:wood_tile_full"] = 1.7, + ["moreblocks:wood_tile_left"] = 1.7, + ["moreblocks:wood_tile_right"] = 1.7, + ["moreblocks:wood_tile_up"] = 1.7, + ["moreores:mineral_mithril"] = 18, + ["moreores:mineral_silver"] = 21, + ["moreores:mithril_block"] = 26, + ["moreores:silver_block"] = 53, + ["snow:snow_brick"] = 2.8, + ["basic_materials:brass_block"] = 43, + ["technic:carbon_steel_block"] = 40, + ["technic:cast_iron_block"] = 40, + ["technic:chernobylite_block"] = 40, + ["technic:chromium_block"] = 37, + ["technic:corium_flowing"] = 40, + ["technic:corium_source"] = 80, + ["technic:granite"] = 18, + ["technic:lead_block"] = 80, + ["technic:marble"] = 18, + ["technic:marble_bricks"] = 18, + ["technic:mineral_chromium"] = 19, + ["technic:mineral_uranium"] = 71, + ["technic:mineral_zinc"] = 19, + ["technic:stainless_steel_block"] = 40, + ["technic:zinc_block"] = 36, + ["tnt:tnt"] = 11, + ["tnt:tnt_burning"] = 11, +} +local rad_resistance_group = { + concrete = 16, + tree = 3.4, + uranium_block = 500, + wood = 1.7, +} +local cache_radiation_resistance = {} +local function node_radiation_resistance(node_name) + local resistance = cache_radiation_resistance[node_name] + if resistance then + return resistance + end + local def = minetest.registered_nodes[node_name] + if not def then + cache_radiation_resistance[node_name] = 0 + return 0 + end + resistance = def.radiation_resistance or + rad_resistance_node[node_name] + if not resistance then + resistance = 0 + for g, v in pairs(def.groups) do + if v > 0 and rad_resistance_group[g] then + resistance = resistance + rad_resistance_group[g] + end + end + end + resistance = math.sqrt(resistance) + cache_radiation_resistance[node_name] = resistance + return resistance +end + + +--[[ +Radioactive nodes cause damage to nearby players. The damage +effect depends on the intrinsic strength of the radiation source, +the distance between the source and the player, and the shielding +effect of the intervening material. These determine a rate of damage; +total damage caused is the integral of this over time. + +In the absence of effective shielding, for a specific source the +damage rate varies realistically in inverse proportion to the square +of the distance. (Distance is measured to the player's abdomen, +not to the nominal player position which corresponds to the foot.) +However, if the player is inside a non-walkable (liquid or gaseous) +radioactive node, the nominal distance could go to zero, yielding +infinite damage. In that case, the player's body is displacing the +radioactive material, so the effective distance should remain non-zero. +We therefore apply a lower distance bound of sqrt(0.75), which is +the maximum distance one can get from the node center within the node. + +A radioactive node is identified by being in the "radioactive" group, +and the group value signifies the strength of the radiation source. +The group value is the distance from a node at which an unshielded +player will be damaged by 1 HP/s. Or, equivalently, it is the square +root of the damage rate in HP/s that an unshielded player one node +away will take. + +Shielding is assessed by adding the shielding values of all nodes +between the source node and the player, ignoring the source node itself. +As in reality, shielding causes exponential attenuation of radiation. +However, the effect is scaled down relative to real life. A node with +radiation resistance value R yields attenuation of sqrt(R) * 0.1 nepers. +(In real life it would be about R * 0.69 nepers, by the definition +of the radiation resistance values.) The sqrt part of this formula +scales down the differences between shielding types, reflecting the +game's simplification of making expensive materials such as gold +readily available in cubes. The multiplicative factor in the +formula scales down the difference between shielded and unshielded +safe distances, avoiding the latter becoming impractically large. + +Damage is processed at rates down to 0.2 HP/s, which in the absence of +shielding is attained at the distance specified by the "radioactive" +group value. Computed damage rates below 0.2 HP/s result in no +damage at all to the player. This gives the player an opportunity +to be safe, and limits the range at which source/player interactions +need to be considered. +--]] +local abdomen_offset = 1 +local rad_dmg_cutoff = 0.2 +local radiated_players = {} + +-- radiation callback function for external use +-- (radiation counters, etc) +-- parameters: object / damage (before armor calculations) +function technic.radiation_callback(object, damage) +end + +local armor_enabled = technic.config:get_bool("enable_radiation_protection") +local entity_damage = technic.config:get_bool("enable_entity_radiation_damage") +local longterm_damage = technic.config:get_bool("enable_longterm_radiation_damage") + +local function apply_fractional_damage(o, dmg) + local dmg_int = math.floor(dmg) + -- The closer you are to getting one more damage point, + -- the more likely it will be added. + if math.random() < dmg - dmg_int then + dmg_int = dmg_int + 1 + end + if dmg_int > 0 then + local new_hp = math.max(o:get_hp() - dmg_int, 0) + o:set_hp(new_hp) + return new_hp == 0 + end + return false +end + +local function calculate_base_damage(node_pos, object_pos, strength) + local shielding = 0 + local dist = vector.distance(node_pos, object_pos) + + for ray_pos in technic.trace_node_ray(node_pos, + vector.direction(node_pos, object_pos), dist) do + local shield_name = minetest.get_node(ray_pos).name + shielding = shielding + node_radiation_resistance(shield_name) * 0.025 + end + + local dmg = (strength * strength) / + (math.max(0.75, dist * dist) * math.exp(shielding)) + + if dmg < rad_dmg_cutoff then return end + return dmg +end + +local function calculate_damage_multiplier(object) + local ag = object.get_armor_groups and object:get_armor_groups() + if not ag then + return 0 + end + if ag.immortal then + return 0 + end + if ag.radiation then + return 0.01 * ag.radiation + elseif armor_enabled then + return 0 + end + if ag.fleshy then + return math.sqrt(0.01 * ag.fleshy) + end + return 0 +end + +local function calculate_object_center(object) + if object:is_player() then + return {x=0, y=abdomen_offset, z=0} + end + return {x=0, y=0, z=0} +end + +local function dmg_object(pos, object, strength) + local obj_pos = vector.add(object:get_pos(), calculate_object_center(object)) + local mul + if armor_enabled or entity_damage then + -- we need to check may the object be damaged even if armor is disabled + mul = calculate_damage_multiplier(object) + if mul == 0 then + return + end + end + local dmg = calculate_base_damage(pos, obj_pos, strength) + if not dmg then + return + end + + -- execute radiation callback + technic.radiation_callback(object, dmg) + + if armor_enabled then + dmg = dmg * mul + end + apply_fractional_damage(object, dmg) + if longterm_damage and object:is_player() then + local pn = object:get_player_name() + radiated_players[pn] = (radiated_players[pn] or 0) + dmg + end +end + +local enable_radiation_throttling = technic.config:get_bool("enable_radiation_throttling") + +-- max lag tracker +local last_max_lag = 0 + +if enable_radiation_throttling then + local function trackMaxLag() + last_max_lag = technic.get_max_lag() + minetest.after(5, trackMaxLag) + end + + -- kick off lag tracking function + trackMaxLag() +end + +local rad_dmg_mult_sqrt = math.sqrt(1 / rad_dmg_cutoff) +local function dmg_abm(pos, node) + if enable_radiation_throttling and last_max_lag > 1.5 then + -- too much lag, skip radiation check entirely + return + end + + local strength = minetest.get_item_group(node.name, "radioactive") + local max_dist = strength * rad_dmg_mult_sqrt + for _, o in pairs(minetest.get_objects_inside_radius(pos, + max_dist + abdomen_offset)) do + if (entity_damage or o:is_player()) and o:get_hp() > 0 then + dmg_object(pos, o, strength) + end + end +end + +if minetest.settings:get_bool("enable_damage") then + if enable_radiation_throttling then + dmg_abm = throttle(100, dmg_abm) + end + + minetest.register_abm({ + label = "Radiation damage", + nodenames = {"group:radioactive"}, + interval = 1, + chance = 2, + action = dmg_abm, + }) + + if longterm_damage then + minetest.register_globalstep(function(dtime) + for pn, dmg in pairs(radiated_players) do + dmg = dmg - (dtime / 8) + local player = minetest.get_player_by_name(pn) + local killed + if player and dmg > rad_dmg_cutoff then + killed = apply_fractional_damage(player, (dmg * dtime) / 8) + else + dmg = nil + end + -- on_dieplayer will have already set this if the player died + if not killed then + radiated_players[pn] = dmg + end + end + end) + + minetest.register_on_dieplayer(function(player) + radiated_players[player:get_player_name()] = nil + end) + end +end + +-- Radioactive materials that can result from destroying a reactor +local griefing = technic.config:get_bool("enable_corium_griefing") + +for _, state in pairs({"flowing", "source"}) do + minetest.register_node("technic:corium_"..state, { + description = S(state == "source" and "Corium Source" or "Flowing Corium"), + drawtype = (state == "source" and "liquid" or "flowingliquid"), + tiles = {{ + name = "technic_corium_"..state.."_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }}, + special_tiles = { + { + name = "technic_corium_"..state.."_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + { + name = "technic_corium_"..state.."_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + paramtype = "light", + paramtype2 = (state == "flowing" and "flowingliquid" or nil), + light_source = (state == "source" and 8 or 5), + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 1, + liquidtype = state, + liquid_alternative_flowing = "technic:corium_flowing", + liquid_alternative_source = "technic:corium_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 6, + post_effect_color = {a=192, r=80, g=160, b=80}, + groups = { + liquid = 2, + hot = 3, + igniter = (griefing and 1 or 0), + radioactive = (state == "source" and 12 or 6), + not_in_creative_inventory = (state == "flowing" and 1 or nil), + }, + }) +end + +if rawget(_G, "bucket") and bucket.register_liquid then + bucket.register_liquid( + "technic:corium_source", + "technic:corium_flowing", + "technic:bucket_corium", + "technic_bucket_corium.png", + "Corium Bucket" + ) +end + +minetest.register_node("technic:chernobylite_block", { + description = S("Chernobylite Block"), + tiles = {"technic_chernobylite_block.png"}, + is_ground_content = true, + groups = {cracky=1, radioactive=4, level=2}, + sounds = default.node_sound_stone_defaults(), + light_source = 2, +}) + +minetest.register_abm({ + label = "Corium: boil-off water (sources)", + nodenames = {"group:water"}, + neighbors = {"technic:corium_source"}, + interval = 1, + chance = 3, + action = function(pos, node) + minetest.remove_node(pos) + end, +}) + +minetest.register_abm({ + label = "Corium: boil-off water (flowing)", + nodenames = {"technic:corium_flowing"}, + neighbors = {"group:water"}, + interval = 1, + chance = 3, + action = function(pos, node) + minetest.set_node(pos, {name="technic:chernobylite_block"}) + end, +}) + +minetest.register_abm({ + label = "Corium: become chernobylite", + nodenames = {"technic:corium_flowing"}, + interval = 5, + chance = (griefing and 10 or 1), + action = function(pos, node) + minetest.set_node(pos, {name="technic:chernobylite_block"}) + end, +}) + +if griefing then + minetest.register_abm({ + label = "Corium: griefing", + nodenames = {"technic:corium_source", "technic:corium_flowing"}, + interval = 4, + chance = 4, + action = function(pos, node) + for _, offset in ipairs({ + vector.new(1,0,0), + vector.new(-1,0,0), + vector.new(0,0,1), + vector.new(0,0,-1), + vector.new(0,-1,0), + }) do + if math.random(8) == 1 then + minetest.dig_node(vector.add(pos, offset)) + end + end + end, + }) +end diff --git a/mods/technic_plus/technic/register.lua b/mods/technic_plus/technic/register.lua new file mode 100644 index 0000000..cc60cd5 --- /dev/null +++ b/mods/technic_plus/technic/register.lua @@ -0,0 +1,67 @@ +-- This file includes the functions and data structures for registering machines and tools for LV, MV, HV types. +-- We use the technic namespace for these functions and data to avoid eventual conflict. + +technic.receiver = "RE" +technic.producer = "PR" +technic.producer_receiver = "PR_RE" +technic.battery = "BA" + +technic.machines = {} +technic.power_tools = {} +technic.networks = {} +technic.machine_tiers = {} + +function technic.register_tier(tier, description) + technic.machines[tier] = {} +end + +function technic.register_machine(tier, nodename, machine_type) + -- Lookup table to get compatible node names and machine type by tier + if not technic.machines[tier] then + return + end + technic.machines[tier][nodename] = machine_type + -- Lookup table to get compatible tiers by node name + if not technic.machine_tiers[nodename] then + technic.machine_tiers[nodename] = {} + end + table.insert(technic.machine_tiers[nodename], tier) +end + +function technic.register_power_tool(craftitem, max_charge) + technic.power_tools[craftitem] = max_charge +end + + +-- Utility functions. Not sure exactly what they do.. water.lua uses the two first. +function technic.get_RE_item_load(load1, max_load) + if load1 == 0 then load1 = 65535 end + local temp = 65536 - load1 + temp = temp / 65535 * max_load + return math.floor(temp + 0.5) +end + +function technic.set_RE_item_load(load1, max_load) + if load1 == 0 then return 65535 end + local temp = load1 / max_load * 65535 + temp = 65536 - temp + return math.floor(temp) +end + +-- Wear down a tool depending on the remaining charge. +function technic.set_RE_wear(itemstack, item_load, max_load) + if (minetest.registered_items[itemstack:get_name()].wear_represents + or "mechanical_wear") ~= "technic_RE_charge" then + return itemstack + end + local temp + if item_load == 0 then + temp = 0 + else + temp = 65536 - math.floor(item_load / max_load * 65535) + if temp > 65535 then temp = 65535 end + if temp < 1 then temp = 1 end + end + itemstack:set_wear(temp) + return itemstack +end diff --git a/mods/technic_plus/technic/sounds/chainsaw.ogg b/mods/technic_plus/technic/sounds/chainsaw.ogg new file mode 100644 index 0000000..5fe7552 Binary files /dev/null and b/mods/technic_plus/technic/sounds/chainsaw.ogg differ diff --git a/mods/technic_plus/technic/sounds/item_drop_pickup.1.ogg b/mods/technic_plus/technic/sounds/item_drop_pickup.1.ogg new file mode 100644 index 0000000..2ae432d Binary files /dev/null and b/mods/technic_plus/technic/sounds/item_drop_pickup.1.ogg differ diff --git a/mods/technic_plus/technic/sounds/item_drop_pickup.2.ogg b/mods/technic_plus/technic/sounds/item_drop_pickup.2.ogg new file mode 100644 index 0000000..f58bf08 Binary files /dev/null and b/mods/technic_plus/technic/sounds/item_drop_pickup.2.ogg differ diff --git a/mods/technic_plus/technic/sounds/item_drop_pickup.3.ogg b/mods/technic_plus/technic/sounds/item_drop_pickup.3.ogg new file mode 100644 index 0000000..cf57c94 Binary files /dev/null and b/mods/technic_plus/technic/sounds/item_drop_pickup.3.ogg differ diff --git a/mods/technic_plus/technic/sounds/item_drop_pickup.4.ogg b/mods/technic_plus/technic/sounds/item_drop_pickup.4.ogg new file mode 100644 index 0000000..bfe99d9 Binary files /dev/null and b/mods/technic_plus/technic/sounds/item_drop_pickup.4.ogg differ diff --git a/mods/technic_plus/technic/sounds/mining_drill.ogg b/mods/technic_plus/technic/sounds/mining_drill.ogg new file mode 100644 index 0000000..1493544 Binary files /dev/null and b/mods/technic_plus/technic/sounds/mining_drill.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg b/mods/technic_plus/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg new file mode 100644 index 0000000..3332deb Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg b/mods/technic_plus/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg new file mode 100644 index 0000000..1f21a16 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk1.0.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk1.0.ogg new file mode 100644 index 0000000..19be080 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk1.0.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk1.1.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk1.1.ogg new file mode 100644 index 0000000..7792be1 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk1.1.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk2.0.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk2.0.ogg new file mode 100644 index 0000000..2cf1548 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk2.0.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk2.1.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk2.1.ogg new file mode 100644 index 0000000..b3f9afb Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk2.1.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk2.2.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk2.2.ogg new file mode 100644 index 0000000..a4ee091 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk2.2.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk3.1.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk3.1.ogg new file mode 100644 index 0000000..f948913 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk3.1.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_laser_mk3.2.ogg b/mods/technic_plus/technic/sounds/technic_laser_mk3.2.ogg new file mode 100644 index 0000000..636c306 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_laser_mk3.2.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_prospector_hit.ogg b/mods/technic_plus/technic/sounds/technic_prospector_hit.ogg new file mode 100644 index 0000000..3a8ad2d Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_prospector_hit.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_prospector_miss.ogg b/mods/technic_plus/technic/sounds/technic_prospector_miss.ogg new file mode 100644 index 0000000..0f050d0 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_prospector_miss.ogg differ diff --git a/mods/technic_plus/technic/sounds/technic_sonic_screwdriver.ogg b/mods/technic_plus/technic/sounds/technic_sonic_screwdriver.ogg new file mode 100644 index 0000000..471bb72 Binary files /dev/null and b/mods/technic_plus/technic/sounds/technic_sonic_screwdriver.ogg differ diff --git a/mods/technic_plus/technic/sounds/vacuumcleaner.ogg b/mods/technic_plus/technic/sounds/vacuumcleaner.ogg new file mode 100644 index 0000000..39d72de Binary files /dev/null and b/mods/technic_plus/technic/sounds/vacuumcleaner.ogg differ diff --git a/mods/technic_plus/technic/textures/blueparticle.png b/mods/technic_plus/technic/textures/blueparticle.png new file mode 100644 index 0000000..8fb679b Binary files /dev/null and b/mods/technic_plus/technic/textures/blueparticle.png differ diff --git a/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png new file mode 100644 index 0000000..9ebdb18 Binary files /dev/null and b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png differ diff --git a/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png new file mode 100644 index 0000000..05baf76 Binary files /dev/null and b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png differ diff --git a/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png new file mode 100644 index 0000000..538c637 Binary files /dev/null and b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png differ diff --git a/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png new file mode 100644 index 0000000..127946b Binary files /dev/null and b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png differ diff --git a/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png new file mode 100644 index 0000000..4a46b3d Binary files /dev/null and b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png differ diff --git a/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png new file mode 100644 index 0000000..d04e5fc Binary files /dev/null and b/mods/technic_plus/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png differ diff --git a/mods/technic_plus/technic/textures/power_meter.png b/mods/technic_plus/technic/textures/power_meter.png new file mode 100644 index 0000000..07a7f6a Binary files /dev/null and b/mods/technic_plus/technic/textures/power_meter.png differ diff --git a/mods/technic_plus/technic/textures/technic_acacia_grindings.png b/mods/technic_plus/technic/textures/technic_acacia_grindings.png new file mode 100644 index 0000000..58c49b6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_acacia_grindings.png differ diff --git a/mods/technic_plus/technic/textures/technic_admin_anchor.png b/mods/technic_plus/technic/textures/technic_admin_anchor.png new file mode 100644 index 0000000..0e8b31d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_admin_anchor.png differ diff --git a/mods/technic_plus/technic/textures/technic_akalin_dust.png b/mods/technic_plus/technic/textures/technic_akalin_dust.png new file mode 100644 index 0000000..42d6fff Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_akalin_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_alatro_dust.png b/mods/technic_plus/technic/textures/technic_alatro_dust.png new file mode 100644 index 0000000..0046b22 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_alatro_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_arol_dust.png b/mods/technic_plus/technic/textures/technic_arol_dust.png new file mode 100644 index 0000000..b841465 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_arol_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_battery.png b/mods/technic_plus/technic/textures/technic_battery.png new file mode 100644 index 0000000..cb3418c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_battery.png differ diff --git a/mods/technic_plus/technic/textures/technic_battery_meter_fg.png b/mods/technic_plus/technic/textures/technic_battery_meter_fg.png new file mode 100644 index 0000000..3d2698b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_battery_meter_fg.png differ diff --git a/mods/technic_plus/technic/textures/technic_battery_reload.png b/mods/technic_plus/technic/textures/technic_battery_reload.png new file mode 100644 index 0000000..a8de376 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_battery_reload.png differ diff --git a/mods/technic_plus/technic/textures/technic_bronze_dust.png b/mods/technic_plus/technic/textures/technic_bronze_dust.png new file mode 100644 index 0000000..5946dc5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_bronze_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_bucket_corium.png b/mods/technic_plus/technic/textures/technic_bucket_corium.png new file mode 100644 index 0000000..bb52895 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_bucket_corium.png differ diff --git a/mods/technic_plus/technic/textures/technic_cable_connection_overlay.png b/mods/technic_plus/technic/textures/technic_cable_connection_overlay.png new file mode 100644 index 0000000..85f5f5b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_cable_connection_overlay.png differ diff --git a/mods/technic_plus/technic/textures/technic_carbon_cloth.png b/mods/technic_plus/technic/textures/technic_carbon_cloth.png new file mode 100644 index 0000000..9a3a0da Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_carbon_cloth.png differ diff --git a/mods/technic_plus/technic/textures/technic_carbon_plate.png b/mods/technic_plus/technic/textures/technic_carbon_plate.png new file mode 100644 index 0000000..360ab9b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_carbon_plate.png differ diff --git a/mods/technic_plus/technic/textures/technic_carbon_steel_dust.png b/mods/technic_plus/technic/textures/technic_carbon_steel_dust.png new file mode 100644 index 0000000..1111068 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_carbon_steel_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_cast_iron_dust.png b/mods/technic_plus/technic/textures/technic_cast_iron_dust.png new file mode 100644 index 0000000..c5c50e4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_cast_iron_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_chainsaw.png b/mods/technic_plus/technic/textures/technic_chainsaw.png new file mode 100644 index 0000000..dbb6581 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_chainsaw.png differ diff --git a/mods/technic_plus/technic/textures/technic_chernobylite_block.png b/mods/technic_plus/technic/textures/technic_chernobylite_block.png new file mode 100644 index 0000000..a837c66 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_chernobylite_block.png differ diff --git a/mods/technic_plus/technic/textures/technic_chernobylite_dust.png b/mods/technic_plus/technic/textures/technic_chernobylite_dust.png new file mode 100644 index 0000000..70982b3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_chernobylite_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_chromium_dust.png b/mods/technic_plus/technic/textures/technic_chromium_dust.png new file mode 100644 index 0000000..7af7a9e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_chromium_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_bottom.png b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_bottom.png new file mode 100644 index 0000000..972848c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_front.png b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_front.png new file mode 100644 index 0000000..2ae2ee4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_front_active.png b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_front_active.png new file mode 100644 index 0000000..16db883 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_side.png b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_side.png new file mode 100644 index 0000000..0922b91 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_top.png b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_top.png new file mode 100644 index 0000000..0922b91 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_coal_alloy_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_coal_dust.png b/mods/technic_plus/technic/textures/technic_coal_dust.png new file mode 100644 index 0000000..a749a51 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_coal_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_common_tree_grindings.png b/mods/technic_plus/technic/textures/technic_common_tree_grindings.png new file mode 100644 index 0000000..88efee6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_common_tree_grindings.png differ diff --git a/mods/technic_plus/technic/textures/technic_composite_plate.png b/mods/technic_plus/technic/textures/technic_composite_plate.png new file mode 100644 index 0000000..e5673b0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_composite_plate.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_back.png b/mods/technic_plus/technic/textures/technic_constructor_back.png new file mode 100644 index 0000000..4311b2d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_back.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_front_off.png b/mods/technic_plus/technic/textures/technic_constructor_front_off.png new file mode 100644 index 0000000..0a7af8c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_front_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_front_on.png b/mods/technic_plus/technic/textures/technic_constructor_front_on.png new file mode 100644 index 0000000..9716a4a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_front_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_bottom_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_bottom_off.png new file mode 100644 index 0000000..f3c5bee Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_bottom_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_bottom_on.png new file mode 100644 index 0000000..6164f93 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_side1_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_side1_off.png new file mode 100644 index 0000000..7448470 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_side1_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_side1_on.png new file mode 100644 index 0000000..8cf88cb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_side2_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_side2_off.png new file mode 100644 index 0000000..2a49fe7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_side2_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_side2_on.png new file mode 100644 index 0000000..533bb42 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_top_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_top_off.png new file mode 100644 index 0000000..2e52f5a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk1_top_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk1_top_on.png new file mode 100644 index 0000000..e6d63e3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk1_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_bottom_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_bottom_off.png new file mode 100644 index 0000000..f2d56b3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_bottom_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_bottom_on.png new file mode 100644 index 0000000..192f312 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_side1_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_side1_off.png new file mode 100644 index 0000000..6a11afb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_side1_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_side1_on.png new file mode 100644 index 0000000..af2a16d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_side2_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_side2_off.png new file mode 100644 index 0000000..d216eb1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_side2_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_side2_on.png new file mode 100644 index 0000000..4bb0e4c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_top_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_top_off.png new file mode 100644 index 0000000..ec003d7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk2_top_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk2_top_on.png new file mode 100644 index 0000000..ea9e4e0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk2_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_bottom_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_bottom_off.png new file mode 100644 index 0000000..9f4fc55 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_bottom_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_bottom_on.png new file mode 100644 index 0000000..316aa93 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_side1_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_side1_off.png new file mode 100644 index 0000000..a39c415 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_side1_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_side1_on.png new file mode 100644 index 0000000..f8b57b6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_side2_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_side2_off.png new file mode 100644 index 0000000..7b7385e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_side2_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_side2_on.png new file mode 100644 index 0000000..a9122d6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_top_off.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_top_off.png new file mode 100644 index 0000000..35f8a5d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_constructor_mk3_top_on.png b/mods/technic_plus/technic/textures/technic_constructor_mk3_top_on.png new file mode 100644 index 0000000..0fad0e9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_constructor_mk3_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_control_logic_unit.png b/mods/technic_plus/technic/textures/technic_control_logic_unit.png new file mode 100644 index 0000000..c069f95 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_control_logic_unit.png differ diff --git a/mods/technic_plus/technic/textures/technic_copper_coil.png b/mods/technic_plus/technic/textures/technic_copper_coil.png new file mode 100644 index 0000000..4cfced9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_copper_coil.png differ diff --git a/mods/technic_plus/technic/textures/technic_copper_dust.png b/mods/technic_plus/technic/textures/technic_copper_dust.png new file mode 100644 index 0000000..9a9c736 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_copper_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_copper_plate.png b/mods/technic_plus/technic/textures/technic_copper_plate.png new file mode 100644 index 0000000..bacb4b6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_copper_plate.png differ diff --git a/mods/technic_plus/technic/textures/technic_corium_flowing_animated.png b/mods/technic_plus/technic/textures/technic_corium_flowing_animated.png new file mode 100644 index 0000000..75b163b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_corium_flowing_animated.png differ diff --git a/mods/technic_plus/technic/textures/technic_corium_source_animated.png b/mods/technic_plus/technic/textures/technic_corium_source_animated.png new file mode 100644 index 0000000..86b7984 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_corium_source_animated.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_back.png b/mods/technic_plus/technic/textures/technic_deployer_back.png new file mode 100644 index 0000000..4e08be3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_back.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_bottom.png b/mods/technic_plus/technic/textures/technic_deployer_bottom.png new file mode 100644 index 0000000..dcea355 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_front_off.png b/mods/technic_plus/technic/textures/technic_deployer_front_off.png new file mode 100644 index 0000000..4d8c64f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_front_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_front_on.png b/mods/technic_plus/technic/textures/technic_deployer_front_on.png new file mode 100644 index 0000000..dfed63c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_front_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_side.png b/mods/technic_plus/technic/textures/technic_deployer_side.png new file mode 100644 index 0000000..d0d5050 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_side1.png b/mods/technic_plus/technic/textures/technic_deployer_side1.png new file mode 100644 index 0000000..d0d5050 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_side1.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_side2.png b/mods/technic_plus/technic/textures/technic_deployer_side2.png new file mode 100644 index 0000000..4b0dcc4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_side2.png differ diff --git a/mods/technic_plus/technic/textures/technic_deployer_top.png b/mods/technic_plus/technic/textures/technic_deployer_top.png new file mode 100644 index 0000000..898e3d3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_deployer_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_diamond_block_blue.png b/mods/technic_plus/technic/textures/technic_diamond_block_blue.png new file mode 100644 index 0000000..c895d89 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_diamond_block_blue.png differ diff --git a/mods/technic_plus/technic/textures/technic_diamond_block_green.png b/mods/technic_plus/technic/textures/technic_diamond_block_green.png new file mode 100644 index 0000000..bec382f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_diamond_block_green.png differ diff --git a/mods/technic_plus/technic/textures/technic_diamond_block_red.png b/mods/technic_plus/technic/textures/technic_diamond_block_red.png new file mode 100644 index 0000000..71ad63a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_diamond_block_red.png differ diff --git a/mods/technic_plus/technic/textures/technic_diamond_drill_head.png b/mods/technic_plus/technic/textures/technic_diamond_drill_head.png new file mode 100644 index 0000000..8e1319f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_diamond_drill_head.png differ diff --git a/mods/technic_plus/technic/textures/technic_diamond_seed.png b/mods/technic_plus/technic/textures/technic_diamond_seed.png new file mode 100644 index 0000000..53d88fb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_diamond_seed.png differ diff --git a/mods/technic_plus/technic/textures/technic_doped_silicon_wafer.png b/mods/technic_plus/technic/textures/technic_doped_silicon_wafer.png new file mode 100644 index 0000000..31cc3c5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_doped_silicon_wafer.png differ diff --git a/mods/technic_plus/technic/textures/technic_flashlight.png b/mods/technic_plus/technic/textures/technic_flashlight.png new file mode 100644 index 0000000..4339ba7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_flashlight.png differ diff --git a/mods/technic_plus/technic/textures/technic_forcefield_animated.png b/mods/technic_plus/technic/textures/technic_forcefield_animated.png new file mode 100644 index 0000000..d5b0488 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_forcefield_animated.png differ diff --git a/mods/technic_plus/technic/textures/technic_forcefield_emitter_off.png b/mods/technic_plus/technic/textures/technic_forcefield_emitter_off.png new file mode 100644 index 0000000..75f05c3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_forcefield_emitter_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_forcefield_emitter_on.png b/mods/technic_plus/technic/textures/technic_forcefield_emitter_on.png new file mode 100644 index 0000000..2496046 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_forcefield_emitter_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_frame.png b/mods/technic_plus/technic/textures/technic_frame.png new file mode 100644 index 0000000..4907362 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_frame.png differ diff --git a/mods/technic_plus/technic/textures/technic_geothermal_side.png b/mods/technic_plus/technic/textures/technic_geothermal_side.png new file mode 100644 index 0000000..efaf9a9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_geothermal_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_geothermal_top.png b/mods/technic_plus/technic/textures/technic_geothermal_top.png new file mode 100644 index 0000000..66300a3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_geothermal_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_geothermal_top_active.png b/mods/technic_plus/technic/textures/technic_geothermal_top_active.png new file mode 100644 index 0000000..cc62e9f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_geothermal_top_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_gold_dust.png b/mods/technic_plus/technic/textures/technic_gold_dust.png new file mode 100644 index 0000000..ff5b763 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_gold_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_graphite.png b/mods/technic_plus/technic/textures/technic_graphite.png new file mode 100644 index 0000000..9bad9d6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_graphite.png differ diff --git a/mods/technic_plus/technic/textures/technic_grinder_front.png b/mods/technic_plus/technic/textures/technic_grinder_front.png new file mode 100644 index 0000000..328fa58 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_grinder_side.png b/mods/technic_plus/technic/textures/technic_grinder_side.png new file mode 100644 index 0000000..3bd679c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_grinder_top.png b/mods/technic_plus/technic/textures/technic_grinder_top.png new file mode 100644 index 0000000..eb6f4bc Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_sides.png new file mode 100644 index 0000000..79dbc83 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png new file mode 100644 index 0000000..3ef2c37 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_tb.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_tb.png new file mode 100644 index 0000000..3aa2387 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_white_tb.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png new file mode 100644 index 0000000..d3f3a92 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png new file mode 100644 index 0000000..fd4cba1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png new file mode 100644 index 0000000..4e08210 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_white_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_white_sides.png new file mode 100644 index 0000000..2f45cc5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_white_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png new file mode 100644 index 0000000..184cd12 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png new file mode 100644 index 0000000..8657625 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png new file mode 100644 index 0000000..e810d14 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_white_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_white_sides.png new file mode 100644 index 0000000..c256a2a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_white_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png new file mode 100644 index 0000000..1435513 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png new file mode 100644 index 0000000..b447d28 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png new file mode 100644 index 0000000..1fe335a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_white_tb.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_white_tb.png new file mode 100644 index 0000000..f1def03 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_white_tb.png differ diff --git a/mods/technic_plus/technic/textures/technic_homedecor_glowlight_yellow_tb.png b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_yellow_tb.png new file mode 100644 index 0000000..fec3aa5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_homedecor_glowlight_yellow_tb.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_battery_box_bottom.png b/mods/technic_plus/technic/textures/technic_hv_battery_box_bottom.png new file mode 100644 index 0000000..b7ab466 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_battery_box_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_battery_box_front.png b/mods/technic_plus/technic/textures/technic_hv_battery_box_front.png new file mode 100644 index 0000000..d444e5d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_battery_box_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_battery_box_side.png b/mods/technic_plus/technic/textures/technic_hv_battery_box_side.png new file mode 100644 index 0000000..3cb5fab Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_battery_box_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_battery_box_top.png b/mods/technic_plus/technic/textures/technic_hv_battery_box_top.png new file mode 100644 index 0000000..d0a77d5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_battery_box_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_cable.png b/mods/technic_plus/technic/textures/technic_hv_cable.png new file mode 100644 index 0000000..33013cf Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_cable.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_cable_wield.png b/mods/technic_plus/technic/textures/technic_hv_cable_wield.png new file mode 100644 index 0000000..6504436 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_compressor_bottom.png b/mods/technic_plus/technic/textures/technic_hv_compressor_bottom.png new file mode 100644 index 0000000..d6a61ed Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_compressor_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_compressor_front.png b/mods/technic_plus/technic/textures/technic_hv_compressor_front.png new file mode 100644 index 0000000..4f488a9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_compressor_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_compressor_front_active.png b/mods/technic_plus/technic/textures/technic_hv_compressor_front_active.png new file mode 100644 index 0000000..60de4f9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_compressor_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_compressor_side.png b/mods/technic_plus/technic/textures/technic_hv_compressor_side.png new file mode 100644 index 0000000..77e2c1f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_compressor_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_compressor_side_tube.png b/mods/technic_plus/technic/textures/technic_hv_compressor_side_tube.png new file mode 100644 index 0000000..a427128 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_compressor_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_compressor_top.png b/mods/technic_plus/technic/textures/technic_hv_compressor_top.png new file mode 100644 index 0000000..5279c81 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_compressor_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_digi_cable.png b/mods/technic_plus/technic/textures/technic_hv_digi_cable.png new file mode 100644 index 0000000..f1c1e30 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_digi_cable.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_digi_cable_wield.png b/mods/technic_plus/technic/textures/technic_hv_digi_cable_wield.png new file mode 100644 index 0000000..3b97827 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_digi_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_down_converter_bottom.png b/mods/technic_plus/technic/textures/technic_hv_down_converter_bottom.png new file mode 100644 index 0000000..fcf0cde Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_down_converter_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_down_converter_side.png b/mods/technic_plus/technic/textures/technic_hv_down_converter_side.png new file mode 100644 index 0000000..a4b6653 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_down_converter_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_down_converter_top.png b/mods/technic_plus/technic/textures/technic_hv_down_converter_top.png new file mode 100644 index 0000000..fcf0cde Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_down_converter_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_electric_furnace_bottom.png b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_bottom.png new file mode 100644 index 0000000..d6a61ed Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_electric_furnace_front.png b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_front.png new file mode 100644 index 0000000..de74673 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_electric_furnace_front_active.png b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_front_active.png new file mode 100644 index 0000000..adff958 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_electric_furnace_side.png b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_side.png new file mode 100644 index 0000000..77e2c1f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_electric_furnace_side_tube.png b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_side_tube.png new file mode 100644 index 0000000..a427128 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_electric_furnace_top.png b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_top.png new file mode 100644 index 0000000..5279c81 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_electric_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_generator_front.png b/mods/technic_plus/technic/textures/technic_hv_generator_front.png new file mode 100644 index 0000000..4f38ff6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_generator_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_generator_front_active.png b/mods/technic_plus/technic/textures/technic_hv_generator_front_active.png new file mode 100644 index 0000000..9384ca3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_generator_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_generator_side.png b/mods/technic_plus/technic/textures/technic_hv_generator_side.png new file mode 100644 index 0000000..dde49a8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_generator_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_generator_top.png b/mods/technic_plus/technic/textures/technic_hv_generator_top.png new file mode 100644 index 0000000..0e32f38 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_generator_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_grinder_bottom.png b/mods/technic_plus/technic/textures/technic_hv_grinder_bottom.png new file mode 100644 index 0000000..0830531 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_grinder_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_grinder_front.png b/mods/technic_plus/technic/textures/technic_hv_grinder_front.png new file mode 100644 index 0000000..d52815d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_grinder_front_active.png b/mods/technic_plus/technic/textures/technic_hv_grinder_front_active.png new file mode 100644 index 0000000..f807e5d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_grinder_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_grinder_side.png b/mods/technic_plus/technic/textures/technic_hv_grinder_side.png new file mode 100644 index 0000000..d85cb14 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_grinder_side_tube.png b/mods/technic_plus/technic/textures/technic_hv_grinder_side_tube.png new file mode 100644 index 0000000..00f8304 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_grinder_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_grinder_top.png b/mods/technic_plus/technic/textures/technic_hv_grinder_top.png new file mode 100644 index 0000000..e66befc Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_nuclear_reactor_core.png b/mods/technic_plus/technic/textures/technic_hv_nuclear_reactor_core.png new file mode 100644 index 0000000..05baf76 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_nuclear_reactor_core.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_solar_array_bottom.png b/mods/technic_plus/technic/textures/technic_hv_solar_array_bottom.png new file mode 100644 index 0000000..567e4af Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_solar_array_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_solar_array_side.png b/mods/technic_plus/technic/textures/technic_hv_solar_array_side.png new file mode 100644 index 0000000..7d3115d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_solar_array_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_solar_array_top.png b/mods/technic_plus/technic/textures/technic_hv_solar_array_top.png new file mode 100644 index 0000000..58fcd72 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_solar_array_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hv_transformer.png b/mods/technic_plus/technic/textures/technic_hv_transformer.png new file mode 100644 index 0000000..266be64 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hv_transformer.png differ diff --git a/mods/technic_plus/technic/textures/technic_hydro_turbine_side.png b/mods/technic_plus/technic/textures/technic_hydro_turbine_side.png new file mode 100644 index 0000000..13e88a0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hydro_turbine_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_hydro_turbine_top.png b/mods/technic_plus/technic/textures/technic_hydro_turbine_top.png new file mode 100644 index 0000000..5ac055a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hydro_turbine_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_hydro_turbine_top_active.png b/mods/technic_plus/technic/textures/technic_hydro_turbine_top_active.png new file mode 100644 index 0000000..5c15b10 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_hydro_turbine_top_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_injector_bottom.png b/mods/technic_plus/technic/textures/technic_injector_bottom.png new file mode 100644 index 0000000..b5ea715 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_injector_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_injector_side.png b/mods/technic_plus/technic/textures/technic_injector_side.png new file mode 100644 index 0000000..0144fe8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_injector_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_injector_top.png b/mods/technic_plus/technic/textures/technic_injector_top.png new file mode 100644 index 0000000..94c689f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_injector_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_kalite_dust.png b/mods/technic_plus/technic/textures/technic_kalite_dust.png new file mode 100644 index 0000000..043bcc7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_kalite_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_laser_beam_mk1.png b/mods/technic_plus/technic/textures/technic_laser_beam_mk1.png new file mode 100644 index 0000000..b001faf Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_laser_beam_mk1.png differ diff --git a/mods/technic_plus/technic/textures/technic_laser_beam_mk2.png b/mods/technic_plus/technic/textures/technic_laser_beam_mk2.png new file mode 100644 index 0000000..495ad0a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_laser_beam_mk2.png differ diff --git a/mods/technic_plus/technic/textures/technic_laser_beam_mk3.png b/mods/technic_plus/technic/textures/technic_laser_beam_mk3.png new file mode 100644 index 0000000..e57da47 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_laser_beam_mk3.png differ diff --git a/mods/technic_plus/technic/textures/technic_lava_can.png b/mods/technic_plus/technic/textures/technic_lava_can.png new file mode 100644 index 0000000..f7e46e8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lava_can.png differ diff --git a/mods/technic_plus/technic/textures/technic_light.png b/mods/technic_plus/technic/textures/technic_light.png new file mode 100644 index 0000000..4e6cc89 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_light.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_bottom.png b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_front.png b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_front.png new file mode 100644 index 0000000..9149767 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_front_active.png b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_front_active.png new file mode 100644 index 0000000..4ae0485 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_side.png b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_side.png new file mode 100644 index 0000000..db9dbbf Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_top.png b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_top.png new file mode 100644 index 0000000..a78af22 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_alloy_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_battery_box_bottom.png b/mods/technic_plus/technic/textures/technic_lv_battery_box_bottom.png new file mode 100644 index 0000000..36ac563 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_battery_box_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_battery_box_side.png b/mods/technic_plus/technic/textures/technic_lv_battery_box_side.png new file mode 100644 index 0000000..6b4b697 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_battery_box_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_battery_box_top.png b/mods/technic_plus/technic/textures/technic_lv_battery_box_top.png new file mode 100644 index 0000000..4a77ccb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_battery_box_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_cable.png b/mods/technic_plus/technic/textures/technic_lv_cable.png new file mode 100644 index 0000000..8effaeb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_cable.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_cable_wield.png b/mods/technic_plus/technic/textures/technic_lv_cable_wield.png new file mode 100644 index 0000000..9eaff6a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_compressor_back.png b/mods/technic_plus/technic/textures/technic_lv_compressor_back.png new file mode 100644 index 0000000..5f7b8e9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_compressor_back.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_compressor_bottom.png b/mods/technic_plus/technic/textures/technic_lv_compressor_bottom.png new file mode 100644 index 0000000..3f0c5da Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_compressor_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_compressor_front.png b/mods/technic_plus/technic/textures/technic_lv_compressor_front.png new file mode 100644 index 0000000..4fe9a7a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_compressor_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_compressor_front_active.png b/mods/technic_plus/technic/textures/technic_lv_compressor_front_active.png new file mode 100644 index 0000000..b66309d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_compressor_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_compressor_side.png b/mods/technic_plus/technic/textures/technic_lv_compressor_side.png new file mode 100644 index 0000000..5f7b8e9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_compressor_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_compressor_top.png b/mods/technic_plus/technic/textures/technic_lv_compressor_top.png new file mode 100644 index 0000000..6f233c1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_compressor_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_digi_cable.png b/mods/technic_plus/technic/textures/technic_lv_digi_cable.png new file mode 100644 index 0000000..4eae1b1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_digi_cable.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_digi_cable_wield.png b/mods/technic_plus/technic/textures/technic_lv_digi_cable_wield.png new file mode 100644 index 0000000..69ef76f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_digi_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_electric_furnace_bottom.png b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_bottom.png new file mode 100644 index 0000000..2fa5406 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_electric_furnace_front.png b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_front.png new file mode 100644 index 0000000..fb60a91 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_electric_furnace_front_active.png b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_front_active.png new file mode 100644 index 0000000..fc347a7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_electric_furnace_side.png b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_side.png new file mode 100644 index 0000000..754ca20 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_electric_furnace_top.png b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_top.png new file mode 100644 index 0000000..fad1296 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_electric_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_extractor_bottom.png b/mods/technic_plus/technic/textures/technic_lv_extractor_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_extractor_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_extractor_front.png b/mods/technic_plus/technic/textures/technic_lv_extractor_front.png new file mode 100644 index 0000000..68a165f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_extractor_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_extractor_front_active.png b/mods/technic_plus/technic/textures/technic_lv_extractor_front_active.png new file mode 100644 index 0000000..4090e12 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_extractor_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_extractor_side.png b/mods/technic_plus/technic/textures/technic_lv_extractor_side.png new file mode 100644 index 0000000..72fc5ca Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_extractor_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_extractor_top.png b/mods/technic_plus/technic/textures/technic_lv_extractor_top.png new file mode 100644 index 0000000..2b92cf3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_extractor_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_generator_front.png b/mods/technic_plus/technic/textures/technic_lv_generator_front.png new file mode 100644 index 0000000..c468081 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_generator_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_generator_front_active.png b/mods/technic_plus/technic/textures/technic_lv_generator_front_active.png new file mode 100644 index 0000000..a685f77 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_generator_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_generator_side.png b/mods/technic_plus/technic/textures/technic_lv_generator_side.png new file mode 100644 index 0000000..b5d7c12 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_generator_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_generator_top.png b/mods/technic_plus/technic/textures/technic_lv_generator_top.png new file mode 100644 index 0000000..48c5887 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_generator_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_grinder_bottom.png b/mods/technic_plus/technic/textures/technic_lv_grinder_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_grinder_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_grinder_front.png b/mods/technic_plus/technic/textures/technic_lv_grinder_front.png new file mode 100644 index 0000000..68a165f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_grinder_front_active.png b/mods/technic_plus/technic/textures/technic_lv_grinder_front_active.png new file mode 100644 index 0000000..4090e12 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_grinder_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_grinder_side.png b/mods/technic_plus/technic/textures/technic_lv_grinder_side.png new file mode 100644 index 0000000..72fc5ca Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_grinder_top.png b/mods/technic_plus/technic/textures/technic_lv_grinder_top.png new file mode 100644 index 0000000..2b92cf3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_lamp_bottom.png b/mods/technic_plus/technic/textures/technic_lv_lamp_bottom.png new file mode 100644 index 0000000..04941a0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_lamp_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_lamp_side.png b/mods/technic_plus/technic/textures/technic_lv_lamp_side.png new file mode 100644 index 0000000..2ea1117 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_lamp_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_lamp_top.png b/mods/technic_plus/technic/textures/technic_lv_lamp_top.png new file mode 100644 index 0000000..701baf2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_lamp_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_led.png b/mods/technic_plus/technic/textures/technic_lv_led.png new file mode 100644 index 0000000..056a9a4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_led.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_led_inv.png b/mods/technic_plus/technic/textures/technic_lv_led_inv.png new file mode 100644 index 0000000..6f8996c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_led_inv.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_solar_array_bottom.png b/mods/technic_plus/technic/textures/technic_lv_solar_array_bottom.png new file mode 100644 index 0000000..c031a8b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_solar_array_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_solar_array_side.png b/mods/technic_plus/technic/textures/technic_lv_solar_array_side.png new file mode 100644 index 0000000..73b511c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_solar_array_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_solar_array_top.png b/mods/technic_plus/technic/textures/technic_lv_solar_array_top.png new file mode 100644 index 0000000..bb1e107 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_solar_array_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_lv_transformer.png b/mods/technic_plus/technic/textures/technic_lv_transformer.png new file mode 100644 index 0000000..7971a05 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_lv_transformer.png differ diff --git a/mods/technic_plus/technic/textures/technic_machine_bottom.png b/mods/technic_plus/technic/textures/technic_machine_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_machine_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_machine_casing.png b/mods/technic_plus/technic/textures/technic_machine_casing.png new file mode 100644 index 0000000..b605620 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_machine_casing.png differ diff --git a/mods/technic_plus/technic/textures/technic_mining_drill.png b/mods/technic_plus/technic/textures/technic_mining_drill.png new file mode 100644 index 0000000..f91fe37 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mining_drill.png differ diff --git a/mods/technic_plus/technic/textures/technic_mining_drill_mk2.png b/mods/technic_plus/technic/textures/technic_mining_drill_mk2.png new file mode 100644 index 0000000..c1bf4f0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mining_drill_mk2.png differ diff --git a/mods/technic_plus/technic/textures/technic_mining_drill_mk3.png b/mods/technic_plus/technic/textures/technic_mining_drill_mk3.png new file mode 100644 index 0000000..91e7f11 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mining_drill_mk3.png differ diff --git a/mods/technic_plus/technic/textures/technic_mining_laser_mk1.png b/mods/technic_plus/technic/textures/technic_mining_laser_mk1.png new file mode 100644 index 0000000..0e6e5cf Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mining_laser_mk1.png differ diff --git a/mods/technic_plus/technic/textures/technic_mining_laser_mk2.png b/mods/technic_plus/technic/textures/technic_mining_laser_mk2.png new file mode 100644 index 0000000..47808c0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mining_laser_mk2.png differ diff --git a/mods/technic_plus/technic/textures/technic_mining_laser_mk3.png b/mods/technic_plus/technic/textures/technic_mining_laser_mk3.png new file mode 100644 index 0000000..c6aacda Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mining_laser_mk3.png differ diff --git a/mods/technic_plus/technic/textures/technic_mithril_dust.png b/mods/technic_plus/technic/textures/technic_mithril_dust.png new file mode 100644 index 0000000..aa2f0e0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mithril_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_mixed_metal_ingot.png b/mods/technic_plus/technic/textures/technic_mixed_metal_ingot.png new file mode 100644 index 0000000..9973bf4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mixed_metal_ingot.png differ diff --git a/mods/technic_plus/technic/textures/technic_music_player_bottom.png b/mods/technic_plus/technic/textures/technic_music_player_bottom.png new file mode 100644 index 0000000..b738f1d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_music_player_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_music_player_side.png b/mods/technic_plus/technic/textures/technic_music_player_side.png new file mode 100644 index 0000000..cc39c1c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_music_player_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_music_player_top.png b/mods/technic_plus/technic/textures/technic_music_player_top.png new file mode 100644 index 0000000..0d34563 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_music_player_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_bottom.png b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_front.png b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_front.png new file mode 100644 index 0000000..f515cd3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_front_active.png b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_front_active.png new file mode 100644 index 0000000..d7d2406 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_side.png b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_side.png new file mode 100644 index 0000000..51b35e2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_side_tube.png b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_side_tube.png new file mode 100644 index 0000000..754ca20 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_top.png b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_top.png new file mode 100644 index 0000000..d33b665 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_alloy_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_battery_box_bottom.png b/mods/technic_plus/technic/textures/technic_mv_battery_box_bottom.png new file mode 100644 index 0000000..36ac563 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_battery_box_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_battery_box_front.png b/mods/technic_plus/technic/textures/technic_mv_battery_box_front.png new file mode 100644 index 0000000..e027b26 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_battery_box_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_battery_box_side.png b/mods/technic_plus/technic/textures/technic_mv_battery_box_side.png new file mode 100644 index 0000000..75a9522 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_battery_box_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_battery_box_top.png b/mods/technic_plus/technic/textures/technic_mv_battery_box_top.png new file mode 100644 index 0000000..4a77ccb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_battery_box_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_cable.png b/mods/technic_plus/technic/textures/technic_mv_cable.png new file mode 100644 index 0000000..bf79183 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_cable.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_cable_wield.png b/mods/technic_plus/technic/textures/technic_mv_cable_wield.png new file mode 100644 index 0000000..16f253f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_centrifuge_bottom.png b/mods/technic_plus/technic/textures/technic_mv_centrifuge_bottom.png new file mode 100644 index 0000000..602973a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_centrifuge_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_centrifuge_front.png b/mods/technic_plus/technic/textures/technic_mv_centrifuge_front.png new file mode 100644 index 0000000..f4a0dae Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_centrifuge_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_centrifuge_front_active.png b/mods/technic_plus/technic/textures/technic_mv_centrifuge_front_active.png new file mode 100644 index 0000000..9f1ccf4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_centrifuge_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_centrifuge_side.png b/mods/technic_plus/technic/textures/technic_mv_centrifuge_side.png new file mode 100644 index 0000000..76fe13f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_centrifuge_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_centrifuge_top.png b/mods/technic_plus/technic/textures/technic_mv_centrifuge_top.png new file mode 100644 index 0000000..4afa7a4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_centrifuge_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_compressor_back.png b/mods/technic_plus/technic/textures/technic_mv_compressor_back.png new file mode 100644 index 0000000..5f7b8e9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_compressor_back.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_compressor_bottom.png b/mods/technic_plus/technic/textures/technic_mv_compressor_bottom.png new file mode 100644 index 0000000..3f0c5da Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_compressor_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_compressor_front.png b/mods/technic_plus/technic/textures/technic_mv_compressor_front.png new file mode 100644 index 0000000..4fe9a7a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_compressor_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_compressor_front_active.png b/mods/technic_plus/technic/textures/technic_mv_compressor_front_active.png new file mode 100644 index 0000000..b66309d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_compressor_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_compressor_side.png b/mods/technic_plus/technic/textures/technic_mv_compressor_side.png new file mode 100644 index 0000000..5f7b8e9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_compressor_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_compressor_top.png b/mods/technic_plus/technic/textures/technic_mv_compressor_top.png new file mode 100644 index 0000000..6f233c1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_compressor_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_digi_cable.png b/mods/technic_plus/technic/textures/technic_mv_digi_cable.png new file mode 100644 index 0000000..55699c1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_digi_cable.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_digi_cable_wield.png b/mods/technic_plus/technic/textures/technic_mv_digi_cable_wield.png new file mode 100644 index 0000000..f072200 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_digi_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_down_converter_bottom.png b/mods/technic_plus/technic/textures/technic_mv_down_converter_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_down_converter_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_down_converter_side.png b/mods/technic_plus/technic/textures/technic_mv_down_converter_side.png new file mode 100644 index 0000000..396a123 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_down_converter_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_down_converter_top.png b/mods/technic_plus/technic/textures/technic_mv_down_converter_top.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_down_converter_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_electric_furnace_bottom.png b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_bottom.png new file mode 100644 index 0000000..2fa5406 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_electric_furnace_front.png b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_front.png new file mode 100644 index 0000000..fb60a91 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_electric_furnace_front_active.png b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_front_active.png new file mode 100644 index 0000000..79e4bdf Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_electric_furnace_side.png b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_side.png new file mode 100644 index 0000000..5b164ab Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_electric_furnace_side_tube.png b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_side_tube.png new file mode 100644 index 0000000..d7a30b6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_electric_furnace_top.png b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_top.png new file mode 100644 index 0000000..4d08175 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_electric_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_extractor_bottom.png b/mods/technic_plus/technic/textures/technic_mv_extractor_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_extractor_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_extractor_front.png b/mods/technic_plus/technic/textures/technic_mv_extractor_front.png new file mode 100644 index 0000000..3ef2dd3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_extractor_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_extractor_front_active.png b/mods/technic_plus/technic/textures/technic_mv_extractor_front_active.png new file mode 100644 index 0000000..9eb0a2e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_extractor_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_extractor_side.png b/mods/technic_plus/technic/textures/technic_mv_extractor_side.png new file mode 100644 index 0000000..3564d6b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_extractor_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_extractor_top.png b/mods/technic_plus/technic/textures/technic_mv_extractor_top.png new file mode 100644 index 0000000..876b288 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_extractor_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_freezer_bottom.png b/mods/technic_plus/technic/textures/technic_mv_freezer_bottom.png new file mode 100644 index 0000000..0355797 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_freezer_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_freezer_front.png b/mods/technic_plus/technic/textures/technic_mv_freezer_front.png new file mode 100644 index 0000000..4694f30 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_freezer_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_freezer_front_active.png b/mods/technic_plus/technic/textures/technic_mv_freezer_front_active.png new file mode 100644 index 0000000..353a1f2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_freezer_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_freezer_side.png b/mods/technic_plus/technic/textures/technic_mv_freezer_side.png new file mode 100644 index 0000000..570147a Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_freezer_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_freezer_top.png b/mods/technic_plus/technic/textures/technic_mv_freezer_top.png new file mode 100644 index 0000000..d9eb954 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_freezer_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_generator_front.png b/mods/technic_plus/technic/textures/technic_mv_generator_front.png new file mode 100644 index 0000000..a94a2b9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_generator_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_generator_front_active.png b/mods/technic_plus/technic/textures/technic_mv_generator_front_active.png new file mode 100644 index 0000000..b491a27 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_generator_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_generator_side.png b/mods/technic_plus/technic/textures/technic_mv_generator_side.png new file mode 100644 index 0000000..d09b09c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_generator_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_generator_top.png b/mods/technic_plus/technic/textures/technic_mv_generator_top.png new file mode 100644 index 0000000..b703b37 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_generator_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_grinder_bottom.png b/mods/technic_plus/technic/textures/technic_mv_grinder_bottom.png new file mode 100644 index 0000000..e4f0692 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_grinder_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_grinder_front.png b/mods/technic_plus/technic/textures/technic_mv_grinder_front.png new file mode 100644 index 0000000..3ef2dd3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_grinder_front_active.png b/mods/technic_plus/technic/textures/technic_mv_grinder_front_active.png new file mode 100644 index 0000000..9eb0a2e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_grinder_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_grinder_side.png b/mods/technic_plus/technic/textures/technic_mv_grinder_side.png new file mode 100644 index 0000000..3564d6b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_grinder_side_tube.png b/mods/technic_plus/technic/textures/technic_mv_grinder_side_tube.png new file mode 100644 index 0000000..7a9fbc2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_grinder_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_grinder_top.png b/mods/technic_plus/technic/textures/technic_mv_grinder_top.png new file mode 100644 index 0000000..876b288 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_solar_array_bottom.png b/mods/technic_plus/technic/textures/technic_mv_solar_array_bottom.png new file mode 100644 index 0000000..567e4af Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_solar_array_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_solar_array_side.png b/mods/technic_plus/technic/textures/technic_mv_solar_array_side.png new file mode 100644 index 0000000..25a4631 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_solar_array_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_solar_array_top.png b/mods/technic_plus/technic/textures/technic_mv_solar_array_top.png new file mode 100644 index 0000000..186e82b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_solar_array_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_mv_transformer.png b/mods/technic_plus/technic/textures/technic_mv_transformer.png new file mode 100644 index 0000000..5d9173b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_mv_transformer.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_back.png b/mods/technic_plus/technic/textures/technic_nodebreaker_back.png new file mode 100644 index 0000000..0115328 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_back.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_bottom.png b/mods/technic_plus/technic/textures/technic_nodebreaker_bottom.png new file mode 100644 index 0000000..0d22be8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_bottom_off.png b/mods/technic_plus/technic/textures/technic_nodebreaker_bottom_off.png new file mode 100644 index 0000000..a46d9b3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_bottom_on.png b/mods/technic_plus/technic/textures/technic_nodebreaker_bottom_on.png new file mode 100644 index 0000000..c37970e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_front_off.png b/mods/technic_plus/technic/textures/technic_nodebreaker_front_off.png new file mode 100644 index 0000000..5610e84 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_front_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_front_on.png b/mods/technic_plus/technic/textures/technic_nodebreaker_front_on.png new file mode 100644 index 0000000..1f51dd7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_front_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side.png new file mode 100644 index 0000000..4358fdc Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side1.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side1.png new file mode 100644 index 0000000..df1a9dd Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side1.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side1_off.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side1_off.png new file mode 100644 index 0000000..58d86a7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side1_on.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side1_on.png new file mode 100644 index 0000000..7ca330e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side2.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side2.png new file mode 100644 index 0000000..3a7bed0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side2.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side2_off.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side2_off.png new file mode 100644 index 0000000..ae79036 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_side2_on.png b/mods/technic_plus/technic/textures/technic_nodebreaker_side2_on.png new file mode 100644 index 0000000..652df58 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_top.png b/mods/technic_plus/technic/textures/technic_nodebreaker_top.png new file mode 100644 index 0000000..a29a365 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_top_off.png b/mods/technic_plus/technic/textures/technic_nodebreaker_top_off.png new file mode 100644 index 0000000..ad9f046 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technic_nodebreaker_top_on.png b/mods/technic_plus/technic/textures/technic_nodebreaker_top_on.png new file mode 100644 index 0000000..1c5f350 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_nodebreaker_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter.png b/mods/technic_plus/technic/textures/technic_power_meter.png new file mode 100644 index 0000000..2e28bed Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter0.png b/mods/technic_plus/technic/textures/technic_power_meter0.png new file mode 100644 index 0000000..ced1506 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter0.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter1.png b/mods/technic_plus/technic/textures/technic_power_meter1.png new file mode 100644 index 0000000..ad19fd3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter1.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter2.png b/mods/technic_plus/technic/textures/technic_power_meter2.png new file mode 100644 index 0000000..6ff2c0e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter2.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter3.png b/mods/technic_plus/technic/textures/technic_power_meter3.png new file mode 100644 index 0000000..67d44d4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter3.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter4.png b/mods/technic_plus/technic/textures/technic_power_meter4.png new file mode 100644 index 0000000..93c9de0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter4.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter5.png b/mods/technic_plus/technic/textures/technic_power_meter5.png new file mode 100644 index 0000000..6188a45 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter5.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter6.png b/mods/technic_plus/technic/textures/technic_power_meter6.png new file mode 100644 index 0000000..5c82eee Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter6.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter7.png b/mods/technic_plus/technic/textures/technic_power_meter7.png new file mode 100644 index 0000000..ad010c8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter7.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter8.png b/mods/technic_plus/technic/textures/technic_power_meter8.png new file mode 100644 index 0000000..5aa52b8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter8.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter_bg.png b/mods/technic_plus/technic/textures/technic_power_meter_bg.png new file mode 100644 index 0000000..bd95e9b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter_bg.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_meter_fg.png b/mods/technic_plus/technic/textures/technic_power_meter_fg.png new file mode 100644 index 0000000..d26e659 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_meter_fg.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_monitor_front.png b/mods/technic_plus/technic/textures/technic_power_monitor_front.png new file mode 100644 index 0000000..dd0321d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_monitor_front.png differ diff --git a/mods/technic_plus/technic/textures/technic_power_monitor_sides.png b/mods/technic_plus/technic/textures/technic_power_monitor_sides.png new file mode 100644 index 0000000..77dd933 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_power_monitor_sides.png differ diff --git a/mods/technic_plus/technic/textures/technic_prospector.png b/mods/technic_plus/technic/textures/technic_prospector.png new file mode 100644 index 0000000..6ec0f34 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_prospector.png differ diff --git a/mods/technic_plus/technic/textures/technic_raw_latex.png b/mods/technic_plus/technic/textures/technic_raw_latex.png new file mode 100644 index 0000000..c7ba7ef Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_raw_latex.png differ diff --git a/mods/technic_plus/technic/textures/technic_river_water_can.png b/mods/technic_plus/technic/textures/technic_river_water_can.png new file mode 100644 index 0000000..d4fd888 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_river_water_can.png differ diff --git a/mods/technic_plus/technic/textures/technic_rubber.png b/mods/technic_plus/technic/textures/technic_rubber.png new file mode 100644 index 0000000..eb78e9f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_rubber.png differ diff --git a/mods/technic_plus/technic/textures/technic_rubber_leaves.png b/mods/technic_plus/technic/textures/technic_rubber_leaves.png new file mode 100644 index 0000000..ffd63f5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_rubber_leaves.png differ diff --git a/mods/technic_plus/technic/textures/technic_rubber_sapling.png b/mods/technic_plus/technic/textures/technic_rubber_sapling.png new file mode 100644 index 0000000..7d3dbf2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_rubber_sapling.png differ diff --git a/mods/technic_plus/technic/textures/technic_rubber_tree_empty.png b/mods/technic_plus/technic/textures/technic_rubber_tree_empty.png new file mode 100644 index 0000000..dc36fa5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_rubber_tree_empty.png differ diff --git a/mods/technic_plus/technic/textures/technic_rubber_tree_full.png b/mods/technic_plus/technic/textures/technic_rubber_tree_full.png new file mode 100644 index 0000000..def5cf6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_rubber_tree_full.png differ diff --git a/mods/technic_plus/technic/textures/technic_rubber_tree_grindings.png b/mods/technic_plus/technic/textures/technic_rubber_tree_grindings.png new file mode 100644 index 0000000..500e464 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_rubber_tree_grindings.png differ diff --git a/mods/technic_plus/technic/textures/technic_sawdust.png b/mods/technic_plus/technic/textures/technic_sawdust.png new file mode 100644 index 0000000..0e37555 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_sawdust.png differ diff --git a/mods/technic_plus/technic/textures/technic_screwdriver.png b/mods/technic_plus/technic/textures/technic_screwdriver.png new file mode 100644 index 0000000..dcb04ed Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_screwdriver.png differ diff --git a/mods/technic_plus/technic/textures/technic_silicon_wafer.png b/mods/technic_plus/technic/textures/technic_silicon_wafer.png new file mode 100644 index 0000000..644de06 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_silicon_wafer.png differ diff --git a/mods/technic_plus/technic/textures/technic_silver_dust.png b/mods/technic_plus/technic/textures/technic_silver_dust.png new file mode 100644 index 0000000..c322540 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_silver_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_solar_panel_bottom.png b/mods/technic_plus/technic/textures/technic_solar_panel_bottom.png new file mode 100644 index 0000000..c031a8b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_solar_panel_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_solar_panel_side.png b/mods/technic_plus/technic/textures/technic_solar_panel_side.png new file mode 100644 index 0000000..73b511c Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_solar_panel_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_solar_panel_top.png b/mods/technic_plus/technic/textures/technic_solar_panel_top.png new file mode 100644 index 0000000..78b895b Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_solar_panel_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_sonic_screwdriver.png b/mods/technic_plus/technic/textures/technic_sonic_screwdriver.png new file mode 100644 index 0000000..c41b8d0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_sonic_screwdriver.png differ diff --git a/mods/technic_plus/technic/textures/technic_stainless_steel_dust.png b/mods/technic_plus/technic/textures/technic_stainless_steel_dust.png new file mode 100644 index 0000000..1edfe59 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_stainless_steel_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_stainless_steel_ingot.png b/mods/technic_plus/technic/textures/technic_stainless_steel_ingot.png new file mode 100644 index 0000000..d04b385 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_stainless_steel_ingot.png differ diff --git a/mods/technic_plus/technic/textures/technic_stone_dust.png b/mods/technic_plus/technic/textures/technic_stone_dust.png new file mode 100644 index 0000000..e3fb19e Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_stone_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_supply_converter_side.png b/mods/technic_plus/technic/textures/technic_supply_converter_side.png new file mode 100644 index 0000000..396a123 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_supply_converter_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_supply_converter_tb.png b/mods/technic_plus/technic/textures/technic_supply_converter_tb.png new file mode 100644 index 0000000..8019ce7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_supply_converter_tb.png differ diff --git a/mods/technic_plus/technic/textures/technic_talinite_dust.png b/mods/technic_plus/technic/textures/technic_talinite_dust.png new file mode 100644 index 0000000..fce8583 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_talinite_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_tin_dust.png b/mods/technic_plus/technic/textures/technic_tin_dust.png new file mode 100644 index 0000000..2f295eb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tin_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode1.png b/mods/technic_plus/technic/textures/technic_tool_mode1.png new file mode 100644 index 0000000..e783af4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode1.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode2.png b/mods/technic_plus/technic/textures/technic_tool_mode2.png new file mode 100644 index 0000000..4f475e8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode2.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode3.png b/mods/technic_plus/technic/textures/technic_tool_mode3.png new file mode 100644 index 0000000..6833569 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode3.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode4.png b/mods/technic_plus/technic/textures/technic_tool_mode4.png new file mode 100644 index 0000000..2a008cf Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode4.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode5.png b/mods/technic_plus/technic/textures/technic_tool_mode5.png new file mode 100644 index 0000000..0a18bb2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode5.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode6.png b/mods/technic_plus/technic/textures/technic_tool_mode6.png new file mode 100644 index 0000000..af9dadb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode6.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode7.png b/mods/technic_plus/technic/textures/technic_tool_mode7.png new file mode 100644 index 0000000..eecfdb0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode7.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode8.png b/mods/technic_plus/technic/textures/technic_tool_mode8.png new file mode 100644 index 0000000..f27debb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode8.png differ diff --git a/mods/technic_plus/technic/textures/technic_tool_mode9.png b/mods/technic_plus/technic/textures/technic_tool_mode9.png new file mode 100644 index 0000000..e82ffb3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tool_mode9.png differ diff --git a/mods/technic_plus/technic/textures/technic_tree_tap.png b/mods/technic_plus/technic/textures/technic_tree_tap.png new file mode 100644 index 0000000..82bb0af Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_tree_tap.png differ diff --git a/mods/technic_plus/technic/textures/technic_uranium_dust.png b/mods/technic_plus/technic/textures/technic_uranium_dust.png new file mode 100644 index 0000000..666fc02 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_uranium_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_uranium_fuel.png b/mods/technic_plus/technic/textures/technic_uranium_fuel.png new file mode 100644 index 0000000..7a83045 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_uranium_fuel.png differ diff --git a/mods/technic_plus/technic/textures/technic_vacuum.png b/mods/technic_plus/technic/textures/technic_vacuum.png new file mode 100644 index 0000000..bb36eeb Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_vacuum.png differ diff --git a/mods/technic_plus/technic/textures/technic_water_can.png b/mods/technic_plus/technic/textures/technic_water_can.png new file mode 100644 index 0000000..25c48bd Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_water_can.png differ diff --git a/mods/technic_plus/technic/textures/technic_water_mill_side.png b/mods/technic_plus/technic/textures/technic_water_mill_side.png new file mode 100644 index 0000000..4614c58 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_water_mill_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_water_mill_top.png b/mods/technic_plus/technic/textures/technic_water_mill_top.png new file mode 100644 index 0000000..66300a3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_water_mill_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_water_mill_top_active.png b/mods/technic_plus/technic/textures/technic_water_mill_top_active.png new file mode 100644 index 0000000..cc62e9f Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_water_mill_top_active.png differ diff --git a/mods/technic_plus/technic/textures/technic_workshop_bottom.png b/mods/technic_plus/technic/textures/technic_workshop_bottom.png new file mode 100644 index 0000000..b738f1d Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_workshop_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technic_workshop_side.png b/mods/technic_plus/technic/textures/technic_workshop_side.png new file mode 100644 index 0000000..947fb63 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_workshop_side.png differ diff --git a/mods/technic_plus/technic/textures/technic_workshop_top.png b/mods/technic_plus/technic/textures/technic_workshop_top.png new file mode 100644 index 0000000..3e0cd86 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_workshop_top.png differ diff --git a/mods/technic_plus/technic/textures/technic_wrought_iron_dust.png b/mods/technic_plus/technic/textures/technic_wrought_iron_dust.png new file mode 100644 index 0000000..08ca7ba Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_wrought_iron_dust.png differ diff --git a/mods/technic_plus/technic/textures/technic_zinc_dust.png b/mods/technic_plus/technic/textures/technic_zinc_dust.png new file mode 100644 index 0000000..2305d01 Binary files /dev/null and b/mods/technic_plus/technic/textures/technic_zinc_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_akalin_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_akalin_dust.png new file mode 100644 index 0000000..e3c62d7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_akalin_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_alatro_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_alatro_dust.png new file mode 100644 index 0000000..d392c6d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_alatro_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_front.png b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_front.png new file mode 100644 index 0000000..c2d79d0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_front_active.png new file mode 100644 index 0000000..e0dcbaa Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_side.png b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_side.png new file mode 100644 index 0000000..048b7a9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_top.png b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_top.png new file mode 100644 index 0000000..c704ba3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_alloy_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_arol_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_arol_dust.png new file mode 100644 index 0000000..f9ea9f9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_arol_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_battery.png b/mods/technic_plus/technic/textures/technicx32/technic_battery.png new file mode 100644 index 0000000..cb3418c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_battery.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_battery_box_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_battery_box_bottom.png new file mode 100644 index 0000000..315cb40 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_battery_box_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_battery_box_side0.png b/mods/technic_plus/technic/textures/technicx32/technic_battery_box_side0.png new file mode 100644 index 0000000..cb900bc Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_battery_box_side0.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_battery_box_top.png b/mods/technic_plus/technic/textures/technicx32/technic_battery_box_top.png new file mode 100644 index 0000000..0ed5334 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_battery_box_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_battery_reload.png b/mods/technic_plus/technic/textures/technicx32/technic_battery_reload.png new file mode 100644 index 0000000..f2bdb0a Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_battery_reload.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_brass_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_brass_dust.png new file mode 100644 index 0000000..d55405f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_brass_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_bronze_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_bronze_dust.png new file mode 100644 index 0000000..5996276 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_bronze_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_carbon_steel_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_carbon_steel_dust.png new file mode 100644 index 0000000..a5c3305 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_carbon_steel_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_cast_iron_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_cast_iron_dust.png new file mode 100644 index 0000000..9fe657e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_cast_iron_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_chainsaw.png b/mods/technic_plus/technic/textures/technicx32/technic_chainsaw.png new file mode 100644 index 0000000..7909473 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_chainsaw.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_chernobylite_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_chernobylite_dust.png new file mode 100644 index 0000000..3bb8688 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_chernobylite_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_chromium_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_chromium_dust.png new file mode 100644 index 0000000..25564af Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_chromium_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png new file mode 100644 index 0000000..da30ae6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_front.png b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_front.png new file mode 100644 index 0000000..22ae94a Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png new file mode 100644 index 0000000..9ff936e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_side.png b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_side.png new file mode 100644 index 0000000..048b7a9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_top.png b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_top.png new file mode 100644 index 0000000..c704ba3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_coal_alloy_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_coal_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_coal_dust.png new file mode 100644 index 0000000..39edba0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_coal_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_back.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_back.png new file mode 100644 index 0000000..333271d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_back.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_front_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_front_off.png new file mode 100644 index 0000000..ac16237 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_front_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_front_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_front_on.png new file mode 100644 index 0000000..f0b2d9a Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_front_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png new file mode 100644 index 0000000..a4a922e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png new file mode 100644 index 0000000..e929892 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side1_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side1_off.png new file mode 100644 index 0000000..c072952 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side1_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side1_on.png new file mode 100644 index 0000000..4f42233 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side2_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side2_off.png new file mode 100644 index 0000000..9e1a75d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side2_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side2_on.png new file mode 100644 index 0000000..d30a3f0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_top_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_top_off.png new file mode 100644 index 0000000..b97d9c4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_top_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_top_on.png new file mode 100644 index 0000000..58d180a Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk1_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png new file mode 100644 index 0000000..ce74f8d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png new file mode 100644 index 0000000..1943102 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side1_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side1_off.png new file mode 100644 index 0000000..1542aff Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side1_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side1_on.png new file mode 100644 index 0000000..f6a446f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side2_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side2_off.png new file mode 100644 index 0000000..9bb6bf6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side2_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side2_on.png new file mode 100644 index 0000000..50a4206 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_top_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_top_off.png new file mode 100644 index 0000000..9b115e3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_top_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_top_on.png new file mode 100644 index 0000000..f5ce82c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk2_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png new file mode 100644 index 0000000..dc65328 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png new file mode 100644 index 0000000..8e53bc7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side1_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side1_off.png new file mode 100644 index 0000000..a233db9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side1_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side1_on.png new file mode 100644 index 0000000..65c57b4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side2_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side2_off.png new file mode 100644 index 0000000..a372df6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side2_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side2_on.png new file mode 100644 index 0000000..cf15586 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_top_off.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_top_off.png new file mode 100644 index 0000000..36c45b2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_top_on.png b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_top_on.png new file mode 100644 index 0000000..34bf095 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_constructor_mk3_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_control_logic_unit.png b/mods/technic_plus/technic/textures/technicx32/technic_control_logic_unit.png new file mode 100644 index 0000000..5e77297 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_control_logic_unit.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_copper_coil.png b/mods/technic_plus/technic/textures/technicx32/technic_copper_coil.png new file mode 100644 index 0000000..4cfced9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_copper_coil.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_copper_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_copper_dust.png new file mode 100644 index 0000000..f5cb6cf Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_copper_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_back.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_back.png new file mode 100644 index 0000000..3bb91e6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_back.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_bottom.png new file mode 100644 index 0000000..0d22be8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_front_off.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_front_off.png new file mode 100644 index 0000000..ccad3f4 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_front_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_front_on.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_front_on.png new file mode 100644 index 0000000..03b9000 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_front_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_side.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_side.png new file mode 100644 index 0000000..4358fdc Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_side1.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_side1.png new file mode 100644 index 0000000..df1a9dd Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_side1.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_side2.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_side2.png new file mode 100644 index 0000000..3a7bed0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_side2.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_deployer_top.png b/mods/technic_plus/technic/textures/technicx32/technic_deployer_top.png new file mode 100644 index 0000000..a29a365 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_deployer_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_blue.png b/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_blue.png new file mode 100644 index 0000000..236b74f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_blue.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_green.png b/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_green.png new file mode 100644 index 0000000..1a2350e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_green.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_red.png b/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_red.png new file mode 100644 index 0000000..75499f2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_diamond_block_red.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_diamond_drill_head.png b/mods/technic_plus/technic/textures/technicx32/technic_diamond_drill_head.png new file mode 100644 index 0000000..8e1319f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_diamond_drill_head.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_doped_silicon_wafer.png b/mods/technic_plus/technic/textures/technicx32/technic_doped_silicon_wafer.png new file mode 100644 index 0000000..d0b0d57 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_doped_silicon_wafer.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_bottom.png new file mode 100644 index 0000000..20ea439 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_front.png b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_front.png new file mode 100644 index 0000000..ac591f0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_front_active.png new file mode 100644 index 0000000..074378b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_side.png b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_side.png new file mode 100644 index 0000000..2266d9c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_top.png b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_top.png new file mode 100644 index 0000000..da30ae6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_electric_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_fine_copper_wire.png b/mods/technic_plus/technic/textures/technicx32/technic_fine_copper_wire.png new file mode 100644 index 0000000..f40b7fc Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_fine_copper_wire.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_fine_gold_wire.png b/mods/technic_plus/technic/textures/technicx32/technic_fine_gold_wire.png new file mode 100644 index 0000000..019fb15 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_fine_gold_wire.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_fine_silver_wire.png b/mods/technic_plus/technic/textures/technicx32/technic_fine_silver_wire.png new file mode 100644 index 0000000..5e0d5a1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_fine_silver_wire.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_flashlight.png b/mods/technic_plus/technic/textures/technicx32/technic_flashlight.png new file mode 100644 index 0000000..60c7f42 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_flashlight.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_generator_front.png b/mods/technic_plus/technic/textures/technicx32/technic_generator_front.png new file mode 100644 index 0000000..c468081 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_generator_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_generator_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_generator_front_active.png new file mode 100644 index 0000000..a685f77 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_generator_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_generator_side.png b/mods/technic_plus/technic/textures/technicx32/technic_generator_side.png new file mode 100644 index 0000000..b5d7c12 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_generator_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_generator_top.png b/mods/technic_plus/technic/textures/technicx32/technic_generator_top.png new file mode 100644 index 0000000..48c5887 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_generator_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_geothermal_side.png b/mods/technic_plus/technic/textures/technicx32/technic_geothermal_side.png new file mode 100644 index 0000000..efaf9a9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_geothermal_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_geothermal_top.png b/mods/technic_plus/technic/textures/technicx32/technic_geothermal_top.png new file mode 100644 index 0000000..66300a3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_geothermal_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_geothermal_top_active.png b/mods/technic_plus/technic/textures/technicx32/technic_geothermal_top_active.png new file mode 100644 index 0000000..cc62e9f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_geothermal_top_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_gold_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_gold_dust.png new file mode 100644 index 0000000..8ccae6a Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_gold_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_grinder_front.png b/mods/technic_plus/technic/textures/technicx32/technic_grinder_front.png new file mode 100644 index 0000000..328fa58 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_grinder_side.png b/mods/technic_plus/technic/textures/technicx32/technic_grinder_side.png new file mode 100644 index 0000000..3bd679c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_grinder_top.png b/mods/technic_plus/technic/textures/technicx32/technic_grinder_top.png new file mode 100644 index 0000000..eb6f4bc Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_bottom.png new file mode 100644 index 0000000..7d0253f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_front.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_front.png new file mode 100644 index 0000000..05bb233 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_front_active.png new file mode 100644 index 0000000..96aa365 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_side.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_side.png new file mode 100644 index 0000000..94e891a Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_side_tube.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_side_tube.png new file mode 100644 index 0000000..2f4f75e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_top.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_top.png new file mode 100644 index 0000000..d6d08f7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png new file mode 100644 index 0000000..127946b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_bottom.png new file mode 100644 index 0000000..e6bd2c7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_side.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_side.png new file mode 100644 index 0000000..4d08175 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_top.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_top.png new file mode 100644 index 0000000..04280bc Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_solar_array_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_hv_transformer.png b/mods/technic_plus/technic/textures/technicx32/technic_hv_transformer.png new file mode 100644 index 0000000..021ae9c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_hv_transformer.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_injector_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_injector_bottom.png new file mode 100644 index 0000000..b5ea715 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_injector_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_injector_side.png b/mods/technic_plus/technic/textures/technicx32/technic_injector_side.png new file mode 100644 index 0000000..0144fe8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_injector_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_injector_top.png b/mods/technic_plus/technic/textures/technicx32/technic_injector_top.png new file mode 100644 index 0000000..94c689f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_injector_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_kalite_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_kalite_dust.png new file mode 100644 index 0000000..3a689af Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_kalite_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_laser_beam.png b/mods/technic_plus/technic/textures/technicx32/technic_laser_beam.png new file mode 100644 index 0000000..6682475 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_laser_beam.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lava_can.png b/mods/technic_plus/technic/textures/technicx32/technic_lava_can.png new file mode 100644 index 0000000..307221c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lava_can.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_light.png b/mods/technic_plus/technic/textures/technicx32/technic_light.png new file mode 100644 index 0000000..4e6cc89 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_light.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_bottom.png new file mode 100644 index 0000000..7d0253f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_front.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_front.png new file mode 100644 index 0000000..447b7e1 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_front_active.png new file mode 100644 index 0000000..1461696 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_side.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_side.png new file mode 100644 index 0000000..93380df Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_top.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_top.png new file mode 100644 index 0000000..6354aaa Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_bottom.png new file mode 100644 index 0000000..e6bd2c7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_side.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_side.png new file mode 100644 index 0000000..4d08175 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_top.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_top.png new file mode 100644 index 0000000..40e6b1c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_solar_array_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_lv_transformer.png b/mods/technic_plus/technic/textures/technicx32/technic_lv_transformer.png new file mode 100644 index 0000000..2b2230c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_lv_transformer.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_machine_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_machine_bottom.png new file mode 100644 index 0000000..20ea439 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_machine_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mining_drill.png b/mods/technic_plus/technic/textures/technicx32/technic_mining_drill.png new file mode 100644 index 0000000..f91fe37 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mining_drill.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mining_laser_mk1.png b/mods/technic_plus/technic/textures/technicx32/technic_mining_laser_mk1.png new file mode 100644 index 0000000..ee24ee3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mining_laser_mk1.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mithril_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_mithril_dust.png new file mode 100644 index 0000000..d4fc717 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mithril_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_motor.png b/mods/technic_plus/technic/textures/technicx32/technic_motor.png new file mode 100644 index 0000000..33dc2f9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_motor.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_music_player_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_music_player_bottom.png new file mode 100644 index 0000000..b738f1d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_music_player_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_music_player_side.png b/mods/technic_plus/technic/textures/technicx32/technic_music_player_side.png new file mode 100644 index 0000000..cc39c1c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_music_player_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_music_player_top.png b/mods/technic_plus/technic/textures/technicx32/technic_music_player_top.png new file mode 100644 index 0000000..0d34563 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_music_player_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png new file mode 100644 index 0000000..7d0253f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_front.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_front.png new file mode 100644 index 0000000..f515cd3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png new file mode 100644 index 0000000..d7d2406 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_side.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_side.png new file mode 100644 index 0000000..51b35e2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png new file mode 100644 index 0000000..fb91900 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_top.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_top.png new file mode 100644 index 0000000..d33b665 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_alloy_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_bottom.png new file mode 100644 index 0000000..e6bd2c7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_side0.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_side0.png new file mode 100644 index 0000000..120c229 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_side0.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_top.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_top.png new file mode 100644 index 0000000..0ed5334 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_battery_box_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_cable_wield.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_cable_wield.png new file mode 100644 index 0000000..6faab24 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_cable_wield.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png new file mode 100644 index 0000000..20ea439 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_front.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_front.png new file mode 100644 index 0000000..c845197 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png new file mode 100644 index 0000000..fe78da6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_side.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_side.png new file mode 100644 index 0000000..176dbe9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png new file mode 100644 index 0000000..d7a30b6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_top.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_top.png new file mode 100644 index 0000000..4d08175 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_electric_furnace_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_bottom.png new file mode 100644 index 0000000..9473699 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_front.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_front.png new file mode 100644 index 0000000..8a7886c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_front_active.png new file mode 100644 index 0000000..6c38b7c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_side.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_side.png new file mode 100644 index 0000000..d2750c5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_top.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_top.png new file mode 100644 index 0000000..e0ada4f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_freezer_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_bottom.png new file mode 100644 index 0000000..7d0253f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_front.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_front.png new file mode 100644 index 0000000..3702818 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_front.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_front_active.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_front_active.png new file mode 100644 index 0000000..4aec191 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_front_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_side.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_side.png new file mode 100644 index 0000000..3c8900b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_side_tube.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_side_tube.png new file mode 100644 index 0000000..c8819ce Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_side_tube.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_top.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_top.png new file mode 100644 index 0000000..3d670f3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_grinder_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_bottom.png new file mode 100644 index 0000000..e6bd2c7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_side.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_side.png new file mode 100644 index 0000000..4d08175 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_top.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_top.png new file mode 100644 index 0000000..af6cc72 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_solar_array_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_mv_transformer.png b/mods/technic_plus/technic/textures/technicx32/technic_mv_transformer.png new file mode 100644 index 0000000..5d9173b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_mv_transformer.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_back.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_back.png new file mode 100644 index 0000000..637148f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_back.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom.png new file mode 100644 index 0000000..936a71d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom_off.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom_off.png new file mode 100644 index 0000000..5a1182b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom_on.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom_on.png new file mode 100644 index 0000000..1393d0e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_bottom_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_front_off.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_front_off.png new file mode 100644 index 0000000..0f08ad9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_front_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_front_on.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_front_on.png new file mode 100644 index 0000000..e94f7c2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_front_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side.png new file mode 100644 index 0000000..401dab9 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1.png new file mode 100644 index 0000000..c38c6e7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1_off.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1_off.png new file mode 100644 index 0000000..52d0458 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1_on.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1_on.png new file mode 100644 index 0000000..33f76b3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side1_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2.png new file mode 100644 index 0000000..17ae2fd Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2_off.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2_off.png new file mode 100644 index 0000000..d702e16 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2_on.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2_on.png new file mode 100644 index 0000000..e43c800 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_side2_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top.png new file mode 100644 index 0000000..dfd8b41 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top_off.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top_off.png new file mode 100644 index 0000000..c9c4599 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top_off.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top_on.png b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top_on.png new file mode 100644 index 0000000..d9ecdf7 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_nodebreaker_top_on.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter.png new file mode 100644 index 0000000..2e28bed Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter1.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter1.png new file mode 100644 index 0000000..8ee8569 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter1.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter2.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter2.png new file mode 100644 index 0000000..f907258 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter2.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter3.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter3.png new file mode 100644 index 0000000..1cf4a12 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter3.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter4.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter4.png new file mode 100644 index 0000000..601de78 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter4.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter5.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter5.png new file mode 100644 index 0000000..b827ca3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter5.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter6.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter6.png new file mode 100644 index 0000000..9510779 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter6.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter7.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter7.png new file mode 100644 index 0000000..d981621 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter7.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter8.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter8.png new file mode 100644 index 0000000..34af172 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter8.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter_bg.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter_bg.png new file mode 100644 index 0000000..bd95e9b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter_bg.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_power_meter_fg.png b/mods/technic_plus/technic/textures/technicx32/technic_power_meter_fg.png new file mode 100644 index 0000000..d26e659 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_power_meter_fg.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_raw_latex.png b/mods/technic_plus/technic/textures/technicx32/technic_raw_latex.png new file mode 100644 index 0000000..45be009 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_raw_latex.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_rubber.png b/mods/technic_plus/technic/textures/technicx32/technic_rubber.png new file mode 100644 index 0000000..eb78e9f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_rubber.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_rubber_sapling.png b/mods/technic_plus/technic/textures/technicx32/technic_rubber_sapling.png new file mode 100644 index 0000000..7d3dbf2 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_rubber_sapling.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_rubber_tree_empty.png b/mods/technic_plus/technic/textures/technicx32/technic_rubber_tree_empty.png new file mode 100644 index 0000000..dc36fa5 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_rubber_tree_empty.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_rubber_tree_full.png b/mods/technic_plus/technic/textures/technicx32/technic_rubber_tree_full.png new file mode 100644 index 0000000..def5cf6 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_rubber_tree_full.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_screwdriver.png b/mods/technic_plus/technic/textures/technicx32/technic_screwdriver.png new file mode 100644 index 0000000..dcb04ed Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_screwdriver.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_silicon_wafer.png b/mods/technic_plus/technic/textures/technicx32/technic_silicon_wafer.png new file mode 100644 index 0000000..644de06 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_silicon_wafer.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_silver_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_silver_dust.png new file mode 100644 index 0000000..f4bb4b0 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_silver_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_bottom.png new file mode 100644 index 0000000..315cb40 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_side.png b/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_side.png new file mode 100644 index 0000000..73b511c Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_top.png b/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_top.png new file mode 100644 index 0000000..78b895b Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_solar_panel_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_sonic_screwdriver.png b/mods/technic_plus/technic/textures/technicx32/technic_sonic_screwdriver.png new file mode 100644 index 0000000..534bb56 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_sonic_screwdriver.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_stainless_steel_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_stainless_steel_dust.png new file mode 100644 index 0000000..3a47cb8 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_stainless_steel_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_stone_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_stone_dust.png new file mode 100644 index 0000000..8b3f7ea Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_stone_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_talinite_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_talinite_dust.png new file mode 100644 index 0000000..4a8986d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_talinite_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_tin_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_tin_dust.png new file mode 100644 index 0000000..b41ba9e Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_tin_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_tree_tap.png b/mods/technic_plus/technic/textures/technicx32/technic_tree_tap.png new file mode 100644 index 0000000..82bb0af Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_tree_tap.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_uranium_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_uranium_dust.png new file mode 100644 index 0000000..e7e0b00 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_uranium_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_water_can.png b/mods/technic_plus/technic/textures/technicx32/technic_water_can.png new file mode 100644 index 0000000..efdf2dd Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_water_can.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_water_mill_side.png b/mods/technic_plus/technic/textures/technicx32/technic_water_mill_side.png new file mode 100644 index 0000000..4614c58 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_water_mill_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_water_mill_top.png b/mods/technic_plus/technic/textures/technicx32/technic_water_mill_top.png new file mode 100644 index 0000000..66300a3 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_water_mill_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_water_mill_top_active.png b/mods/technic_plus/technic/textures/technicx32/technic_water_mill_top_active.png new file mode 100644 index 0000000..cc62e9f Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_water_mill_top_active.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_workshop_bottom.png b/mods/technic_plus/technic/textures/technicx32/technic_workshop_bottom.png new file mode 100644 index 0000000..b738f1d Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_workshop_bottom.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_workshop_side.png b/mods/technic_plus/technic/textures/technicx32/technic_workshop_side.png new file mode 100644 index 0000000..947fb63 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_workshop_side.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_workshop_top.png b/mods/technic_plus/technic/textures/technicx32/technic_workshop_top.png new file mode 100644 index 0000000..3e0cd86 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_workshop_top.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_wrought_iron_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_wrought_iron_dust.png new file mode 100644 index 0000000..6b0b421 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_wrought_iron_dust.png differ diff --git a/mods/technic_plus/technic/textures/technicx32/technic_zinc_dust.png b/mods/technic_plus/technic/textures/technicx32/technic_zinc_dust.png new file mode 100644 index 0000000..1443585 Binary files /dev/null and b/mods/technic_plus/technic/textures/technicx32/technic_zinc_dust.png differ diff --git a/mods/technic_plus/technic/tools/cans.lua b/mods/technic_plus/technic/tools/cans.lua new file mode 100644 index 0000000..e6bc93c --- /dev/null +++ b/mods/technic_plus/technic/tools/cans.lua @@ -0,0 +1,137 @@ +local S = technic.getter + +local function set_can_wear(itemstack, level, max_level) + local temp + if level == 0 then + temp = 0 + else + temp = 65536 - math.floor(level / max_level * 65535) + if temp > 65535 then temp = 65535 end + if temp < 1 then temp = 1 end + end + itemstack:set_wear(temp) +end + +local function get_can_level(itemstack) + if itemstack:get_metadata() == "" then + return 0 + else + return tonumber(itemstack:get_metadata()) + end +end + +function technic.register_can(d) + local data = {} + for k, v in pairs(d) do data[k] = v end + minetest.register_tool(data.can_name, { + description = data.can_description, + inventory_image = data.can_inventory_image, + stack_max = 1, + wear_represents = "content_level", + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then return end + local node = minetest.get_node(pointed_thing.under) + if node.name ~= data.liquid_source_name then return end + local charge = get_can_level(itemstack) + if charge == data.can_capacity then return end + if minetest.is_protected(pointed_thing.under, user:get_player_name()) then + minetest.log("action", user:get_player_name().." tried to take "..node.name.. + " at protected position "..minetest.pos_to_string(pointed_thing.under).." with a "..data.can_name) + return + end + minetest.remove_node(pointed_thing.under) + charge = charge + 1 + itemstack:set_metadata(tostring(charge)) + set_can_wear(itemstack, charge, data.can_capacity) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then return end + local pos = pointed_thing.under + local node_name = minetest.get_node(pos).name + local def = minetest.registered_nodes[node_name] or {} + if def.on_rightclick and user and not user:get_player_control().sneak then + return def.on_rightclick(pos, minetest.get_node(pos), user, itemstack, pointed_thing) + end + if not def.buildable_to or node_name == data.liquid_source_name then + pos = pointed_thing.above + node_name = minetest.get_node(pos).name + def = minetest.registered_nodes[node_name] or {} + -- Try to place node above the pointed source, or abort. + if not def.buildable_to or node_name == data.liquid_source_name then return end + end + local charge = get_can_level(itemstack) + if charge == 0 then return end + if minetest.is_protected(pos, user:get_player_name()) then + minetest.log("action", user:get_player_name().." tried to place "..data.liquid_source_name.. + " at protected position "..minetest.pos_to_string(pos).." with a "..data.can_name) + return + end + minetest.set_node(pos, {name=data.liquid_source_name}) + charge = charge - 1 + itemstack:set_metadata(tostring(charge)) + set_can_wear(itemstack, charge, data.can_capacity) + return itemstack + end, + on_refill = function(stack) + stack:set_metadata(tostring(data.can_capacity)) + set_can_wear(stack, data.can_capacity, data.can_capacity) + return stack + end, + }) +end + +technic.register_can({ + can_name = "technic:water_can", + can_description = S("Water Can"), + can_inventory_image = "technic_water_can.png", + can_capacity = 16, + liquid_source_name = "default:water_source", + liquid_flowing_name = "default:water_flowing", +}) + +minetest.register_craft({ + output = 'technic:water_can 1', + recipe = { + {'technic:zinc_ingot', 'technic:rubber','technic:zinc_ingot'}, + {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'}, + {'technic:zinc_ingot', 'technic:carbon_steel_ingot', 'technic:zinc_ingot'}, + } +}) + +technic.register_can({ + can_name = "technic:lava_can", + can_description = S("Lava Can"), + can_inventory_image = "technic_lava_can.png", + can_capacity = 8, + liquid_source_name = "default:lava_source", + liquid_flowing_name = "default:lava_flowing", +}) + +minetest.register_craft({ + output = 'technic:lava_can 1', + recipe = { + {'technic:zinc_ingot', 'technic:stainless_steel_ingot','technic:zinc_ingot'}, + {'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'}, + {'technic:zinc_ingot', 'technic:stainless_steel_ingot', 'technic:zinc_ingot'}, + } +}) + +technic.register_can({ + can_name = 'technic:river_water_can', + can_description = S("River Water Can"), + can_inventory_image = "technic_river_water_can.png", + can_capacity = 16, + liquid_source_name = "default:river_water_source", + liquid_flowing_name = "default:river_water_flowing", +}) + +minetest.register_craft({ + output = 'technic:river_water_can 1', + recipe = { + {'technic:zinc_ingot', 'technic:rubber', 'technic:zinc_ingot'}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'technic:zinc_ingot', 'default:steel_ingot', 'technic:zinc_ingot'}, + } +}) diff --git a/mods/technic_plus/technic/tools/chainsaw.lua b/mods/technic_plus/technic/tools/chainsaw.lua new file mode 100644 index 0000000..1a82d4d --- /dev/null +++ b/mods/technic_plus/technic/tools/chainsaw.lua @@ -0,0 +1,234 @@ +-- Configuration + +local chainsaw_max_charge = 30000 -- Maximum charge of the saw +-- Gives 2500 nodes on a single charge (about 50 complete normal trees) +local chainsaw_charge_per_node = 12 + +local chainsaw_leaves = true -- Cut down tree leaves. +-- Leaf decay may cause slowness on large trees if this is disabled. + +local chainsaw_vines = true -- Cut down vines + +local timber_nodenames = {} -- Cuttable nodes + +local max_saw_radius = 12 -- max x/z distance away from starting position to allow cutting +-- Prevents forest destruction, increase for extra wide trees + + +-- Support for nodes not in any supported node groups (tree, leaves, leafdecay, leafdecay_drop) + +timber_nodenames["default:papyrus"] = true +timber_nodenames["default:cactus"] = true +timber_nodenames["default:bush_stem"] = true +timber_nodenames["default:acacia_bush_stem"] = true +timber_nodenames["default:pine_bush_stem"] = true + +if minetest.get_modpath("growing_trees") then + timber_nodenames["growing_trees:branch_sprout"] = true + if chainsaw_leaves then + timber_nodenames["growing_trees:leaves"] = true + end +end + +if minetest.get_modpath("snow") then + if chainsaw_leaves then + timber_nodenames["snow:needles"] = true + timber_nodenames["snow:needles_decorated"] = true + timber_nodenames["snow:star"] = true + end +end + +if minetest.get_modpath("trunks") then + if chainsaw_leaves then + timber_nodenames["trunks:moss"] = true + timber_nodenames["trunks:moss_fungus"] = true + timber_nodenames["trunks:treeroot"] = true + end +end + + +local S = technic.getter + +technic.register_power_tool("technic:chainsaw", chainsaw_max_charge) + +-- Table for saving what was sawed down +local produced = {} + +-- Save the items sawed down so that we can drop them in a nice single stack +local function handle_drops(drops) + for _, item in ipairs(drops) do + local stack = ItemStack(item) + local name = stack:get_name() + local p = produced[name] + if not p then + produced[name] = stack + else + p:set_count(p:get_count() + stack:get_count()) + end + end +end + +-- This function does all the hard work. Recursively we dig the node at hand +-- if it is in the table and then search the surroundings for more stuff to dig. +local function recursive_dig(pos, origin, remaining_charge) + if remaining_charge < chainsaw_charge_per_node then + return remaining_charge + end + local node = minetest.get_node(pos) + + if not timber_nodenames[node.name] then + return remaining_charge + end + + -- Wood found - cut it + handle_drops(minetest.get_node_drops(node.name, "")) + minetest.remove_node(pos) + remaining_charge = remaining_charge - chainsaw_charge_per_node + + -- Check for snow on pine trees, sand/gravel on leaves, etc + minetest.check_for_falling(pos) + + -- Check surroundings and run recursively if any charge left + for y=-1, 1 do + if (pos.y + y) >= origin.y then + for x=-1, 1 do + if (pos.x + x) <= (origin.x + max_saw_radius) and (pos.x + x) >= (origin.x - max_saw_radius) then + for z=-1, 1 do + if (pos.z + z) <= (origin.z + max_saw_radius) and (pos.z + z) >= (origin.z - max_saw_radius) then + local npos = {x=pos.x+x, y=pos.y+y, z=pos.z+z} + if remaining_charge < chainsaw_charge_per_node then + return remaining_charge + end + if timber_nodenames[minetest.get_node(npos).name] then + remaining_charge = recursive_dig(npos, origin, remaining_charge) + end + end + end + end + end + end + end + return remaining_charge +end + +-- Function to randomize positions for new node drops +local function get_drop_pos(pos) + local drop_pos = {} + + for i = 0, 8 do + -- Randomize position for a new drop + drop_pos.x = pos.x + math.random(-3, 3) + drop_pos.y = pos.y - 1 + drop_pos.z = pos.z + math.random(-3, 3) + + -- Move the randomized position upwards until + -- the node is air or unloaded. + for y = drop_pos.y, drop_pos.y + 5 do + drop_pos.y = y + local node = minetest.get_node_or_nil(drop_pos) + + if not node then + -- If the node is not loaded yet simply drop + -- the item at the original digging position. + return pos + elseif node.name == "air" then + -- Add variation to the entity drop position, + -- but don't let drops get too close to the edge + drop_pos.x = drop_pos.x + (math.random() * 0.8) - 0.5 + drop_pos.z = drop_pos.z + (math.random() * 0.8) - 0.5 + return drop_pos + end + end + end + + -- Return the original position if this takes too long + return pos +end + +-- Chainsaw entry point +local function chainsaw_dig(pos, current_charge) + -- Start sawing things down + local remaining_charge = recursive_dig(pos, pos, current_charge) + minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, + max_hear_distance = 10}) + + -- Now drop items for the player + for name, stack in pairs(produced) do + -- Drop stacks of stack max or less + local count, max = stack:get_count(), stack:get_stack_max() + stack:set_count(max) + while count > max do + minetest.add_item(get_drop_pos(pos), stack) + count = count - max + end + stack:set_count(count) + minetest.add_item(get_drop_pos(pos), stack) + end + + -- Clean up + produced = {} + + return remaining_charge +end + + +minetest.register_tool("technic:chainsaw", { + description = S("Chainsaw"), + inventory_image = "technic_chainsaw.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge or + meta.charge < chainsaw_charge_per_node then + return + end + + local name = user:get_player_name() + if minetest.is_protected(pointed_thing.under, name) then + minetest.record_protection_violation(pointed_thing.under, name) + return + end + + -- Send current charge to digging function so that the + -- chainsaw will stop after digging a number of nodes + meta.charge = chainsaw_dig(pointed_thing.under, meta.charge) + if not technic.creative_mode then + technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge) + itemstack:set_metadata(minetest.serialize(meta)) + end + return itemstack + end, +}) + +local mesecons_button = minetest.get_modpath("mesecons_button") +local trigger = mesecons_button and "mesecons_button:button_off" or "default:mese_crystal_fragment" + +minetest.register_craft({ + output = "technic:chainsaw", + recipe = { + {"technic:stainless_steel_ingot", trigger, "technic:battery"}, + {"basic_materials:copper_wire", "basic_materials:motor", "technic:battery"}, + {"", "", "technic:stainless_steel_ingot"}, + }, + replacements = { {"basic_materials:copper_wire", "basic_materials:empty_spool"}, }, + +}) + +-- Add cuttable nodes after all mods loaded +minetest.after(0, function () + for k, v in pairs(minetest.registered_nodes) do + if v.groups.tree then + timber_nodenames[k] = true + elseif chainsaw_leaves and (v.groups.leaves or v.groups.leafdecay or v.groups.leafdecay_drop) then + timber_nodenames[k] = true + elseif chainsaw_vines and v.groups.vines then + timber_nodenames[k] = true + end + end +end) diff --git a/mods/technic_plus/technic/tools/flashlight.lua b/mods/technic_plus/technic/tools/flashlight.lua new file mode 100644 index 0000000..84decbb --- /dev/null +++ b/mods/technic_plus/technic/tools/flashlight.lua @@ -0,0 +1,123 @@ +-- Original code comes from walkin_light mod by Echo +-- http://minetest.net/forum/viewtopic.php?id=2621 + +local flashlight_max_charge = 30000 + +local S = technic.getter + +technic.register_power_tool("technic:flashlight", flashlight_max_charge) + +minetest.register_alias("technic:light_off", "air") + +minetest.register_tool("technic:flashlight", { + description = S("Flashlight"), + inventory_image = "technic_flashlight.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, +}) + +minetest.register_craft({ + output = "technic:flashlight", + recipe = { + {"technic:rubber", "default:glass", "technic:rubber"}, + {"technic:stainless_steel_ingot", "technic:battery", "technic:stainless_steel_ingot"}, + {"", "technic:battery", ""} + } +}) + + +local player_positions = {} +local was_wielding = {} + +local function check_for_flashlight(player) + if player == nil then + return false + end + local inv = player:get_inventory() + local hotbar = inv:get_list("main") + for i = 1, 8 do + if hotbar[i]:get_name() == "technic:flashlight" then + local meta = minetest.deserialize(hotbar[i]:get_metadata()) + if meta and meta.charge and meta.charge >= 2 then + if not technic.creative_mode then + meta.charge = meta.charge - 2; + technic.set_RE_wear(hotbar[i], meta.charge, flashlight_max_charge) + hotbar[i]:set_metadata(minetest.serialize(meta)) + inv:set_stack("main", i, hotbar[i]) + end + return true + end + end + end + return false +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local pos = player:get_pos() + local rounded_pos = vector.round(pos) + rounded_pos.y = rounded_pos.y + 1 + player_positions[player_name] = rounded_pos + was_wielding[player_name] = true +end) + + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + local pos = player_positions[player_name] + local nodename = minetest.get_node(pos).name + if nodename == "technic:light" then + minetest.remove_node(pos) + end + player_positions[player_name] = nil +end) + +minetest.register_globalstep(function(dtime) + for i, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local flashlight_weared = check_for_flashlight(player) + local pos = player:get_pos() + local rounded_pos = vector.round(pos) + rounded_pos.y = rounded_pos.y + 1 + local old_pos = player_positions[player_name] + local player_moved = old_pos and not vector.equals(old_pos, rounded_pos) + if not old_pos then + old_pos = rounded_pos + player_moved = true + end + + -- Remove light, flashlight weared out or was removed from hotbar + if was_wielding[player_name] and not flashlight_weared then + was_wielding[player_name] = false + local node = minetest.get_node_or_nil(old_pos) + if node and node.name == "technic:light" then + minetest.remove_node(old_pos) + end + elseif (player_moved or not was_wielding[player_name]) and flashlight_weared then + local node = minetest.get_node_or_nil(rounded_pos) + if node and node.name == "air" then + minetest.set_node(rounded_pos, {name="technic:light"}) + end + node = minetest.get_node_or_nil(old_pos) + if node and node.name == "technic:light" then + minetest.remove_node(old_pos) + end + player_positions[player_name] = rounded_pos + was_wielding[player_name] = true + end + end +end) + +minetest.register_node("technic:light", { + drawtype = "glasslike", + tiles = {"technic_light.png"}, + paramtype = "light", + groups = {not_in_creative_inventory = 1}, + drop = "", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + pointable = false, +}) diff --git a/mods/technic_plus/technic/tools/init.lua b/mods/technic_plus/technic/tools/init.lua new file mode 100644 index 0000000..5e0aa02 --- /dev/null +++ b/mods/technic_plus/technic/tools/init.lua @@ -0,0 +1,23 @@ +local path = technic.modpath.."/tools" + +if technic.config:get_bool("enable_mining_drill") then + dofile(path.."/mining_drill.lua") +end +if technic.config:get_bool("enable_mining_laser") then + dofile(path.."/mining_lasers.lua") +end +if technic.config:get_bool("enable_flashlight") then + dofile(path.."/flashlight.lua") +end +dofile(path.."/cans.lua") +dofile(path.."/chainsaw.lua") +dofile(path.."/tree_tap.lua") +dofile(path.."/sonic_screwdriver.lua") +dofile(path.."/prospector.lua") +dofile(path.."/vacuum.lua") + +if minetest.get_modpath("screwdriver") then + -- compatibility alias + minetest.register_alias("technic:screwdriver", "screwdriver:screwdriver") +end + diff --git a/mods/technic_plus/technic/tools/mining_drill.lua b/mods/technic_plus/technic/tools/mining_drill.lua new file mode 100644 index 0000000..dabbdee --- /dev/null +++ b/mods/technic_plus/technic/tools/mining_drill.lua @@ -0,0 +1,411 @@ +local max_charge = {50000, 200000, 300000} +local power_usage_per_node = {200, 500, 600} + +local S = technic.getter + +minetest.register_craft({ + output = 'technic:mining_drill', + recipe = { + {'default:tin_ingot', 'technic:diamond_drill_head', 'default:tin_ingot'}, + {'technic:stainless_steel_ingot', 'basic_materials:motor', 'technic:stainless_steel_ingot'}, + {'', 'technic:red_energy_crystal', 'default:copper_ingot'}, + } +}) +minetest.register_craft({ + output = 'technic:mining_drill_mk2', + recipe = { + {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'}, + {'technic:stainless_steel_ingot', 'technic:mining_drill', 'technic:stainless_steel_ingot'}, + {'', 'technic:green_energy_crystal', ''}, + } +}) +minetest.register_craft({ + output = 'technic:mining_drill_mk3', + recipe = { + {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'}, + {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2', 'technic:stainless_steel_ingot'}, + {'', 'technic:blue_energy_crystal', ''}, + } +}) +for i = 1, 4 do + minetest.register_craft({ + output = 'technic:mining_drill_mk3', + recipe = { + {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'}, + {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2_'..i, 'technic:stainless_steel_ingot'}, + {'', 'technic:blue_energy_crystal', ''}, + } + }) +end + +local mining_drill_mode_text = { + {S("Single node.")}, + {S("3 nodes deep.")}, + {S("3 nodes wide.")}, + {S("3 nodes tall.")}, + {S("3x3 nodes.")}, +} + +local function drill_dig_it0 (pos,player) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + local node = minetest.get_node(pos) + if node.name == "air" or node.name == "ignore" then return end + if node.name == "default:lava_source" then return end + if node.name == "default:lava_flowing" then return end + if node.name == "default:water_source" then minetest.remove_node(pos) return end + if node.name == "default:water_flowing" then minetest.remove_node(pos) return end + local def = minetest.registered_nodes[node.name] + if not def then return end + def.on_dig(pos, node, player) +end + +local function drill_dig_it1 (player) + local dir=player:get_look_dir() + if math.abs(dir.x)>math.abs(dir.z) then + if dir.x>0 then return 0 end + return 1 + end + if dir.z>0 then return 2 end + return 3 +end + +local function drill_dig_it2 (pos,player) + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) +end + +local function drill_dig_it3 (pos,player) + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) +end + +local function drill_dig_it4 (pos,player) + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) +end + +local function cost_to_use(drill_type, mode) + local mult + if mode == 1 then + mult = 1 + elseif mode <= 4 then + mult = 3 + else + mult = 9 + end + return power_usage_per_node[drill_type] * mult +end + +local function drill_dig_it(pos, player, mode) + if mode == 1 then + drill_dig_it0(pos, player) + end + + if mode == 2 then -- 3 deep + local dir = drill_dig_it1(player) + if dir == 0 then -- x+ + drill_dig_it0(pos, player) + pos.x = pos.x + 1 + drill_dig_it0(pos, player) + pos.x = pos.x + 1 + drill_dig_it0(pos, player) + end + if dir == 1 then -- x- + drill_dig_it0(pos, player) + pos.x=pos.x-1 + drill_dig_it0 (pos,player) + pos.x=pos.x-1 + drill_dig_it0 (pos,player) + end + if dir==2 then -- z+ + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + end + if dir==3 then -- z- + drill_dig_it0 (pos,player) + pos.z=pos.z-1 + drill_dig_it0 (pos,player) + pos.z=pos.z-1 + drill_dig_it0 (pos,player) + end + end + + if mode==3 then -- 3 wide + local dir = drill_dig_it1(player) + if dir==0 or dir==1 then -- x + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + end + if dir==2 or dir==3 then -- z + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + end + end + + if mode==4 then -- 3 tall, selected in the middle + drill_dig_it0 (pos,player) + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + pos.y=pos.y-1 + drill_dig_it0 (pos,player) + end + + if mode==5 then -- 3 x 3 + local dir=player:get_look_dir() + if math.abs(dir.y)<0.5 then + dir=drill_dig_it1(player) + if dir==0 or dir==1 then -- x + drill_dig_it2(pos,player) + end + if dir==2 or dir==3 then -- z + drill_dig_it3(pos,player) + end + else + drill_dig_it4(pos,player) + end + end + + minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,}) +end + +local function pos_is_pointable(pos) + local node = minetest.get_node(pos) + local nodedef = minetest.registered_nodes[node.name] + return nodedef and nodedef.pointable +end + +local function mining_drill_mk2_setmode(user,itemstack) + local player_name=user:get_player_name() + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) or {} + if meta["mode"]==nil then + minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(2)) + meta["mode"]=0 + end + local mode=meta["mode"] + mode=mode+1 + if mode>=5 then mode=1 end + minetest.chat_send_player(player_name, + S("Mining Drill Mk%d Mode %d"):format(2, mode)..": "..mining_drill_mode_text[mode][1]) + itemstack:set_name("technic:mining_drill_mk2_"..mode); + meta["mode"]=mode + itemstack:set_metadata(minetest.serialize(meta)) + return itemstack +end + +local function mining_drill_mk3_setmode(user,itemstack) + local player_name=user:get_player_name() + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) or {} + if meta["mode"]==nil then + minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(3)) + meta["mode"]=0 + end + local mode=meta["mode"] + mode=mode+1 + if mode>=6 then mode=1 end + minetest.chat_send_player(player_name, + S("Mining Drill Mk%d Mode %d"):format(3, mode)..": "..mining_drill_mode_text[mode][1]) + itemstack:set_name("technic:mining_drill_mk3_"..mode); + meta["mode"]=mode + itemstack:set_metadata(minetest.serialize(meta)) + return itemstack +end + + +local function mining_drill_mk2_handler(itemstack, user, pointed_thing) + local keys = user:get_player_control() + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.mode or keys.sneak then + return mining_drill_mk2_setmode(user, itemstack) + end + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then + return + end + local charge_to_take = cost_to_use(2, meta.mode) + if meta.charge >= charge_to_take then + local pos = minetest.get_pointed_thing_position(pointed_thing, false) + drill_dig_it(pos, user, meta.mode) + if not technic.creative_mode then + meta.charge = meta.charge - charge_to_take + itemstack:set_metadata(minetest.serialize(meta)) + technic.set_RE_wear(itemstack, meta.charge, max_charge[2]) + end + end + return itemstack +end + +local function mining_drill_mk3_handler(itemstack, user, pointed_thing) + local keys = user:get_player_control() + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.mode or keys.sneak then + return mining_drill_mk3_setmode(user, itemstack) + end + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then + return + end + local charge_to_take = cost_to_use(3, meta.mode) + if meta.charge >= charge_to_take then + local pos = minetest.get_pointed_thing_position(pointed_thing, false) + drill_dig_it(pos, user, meta.mode) + if not technic.creative_mode then + meta.charge = meta.charge - charge_to_take + itemstack:set_metadata(minetest.serialize(meta)) + technic.set_RE_wear(itemstack, meta.charge, max_charge[3]) + end + end + return itemstack +end + +technic.register_power_tool("technic:mining_drill", max_charge[1]) + +minetest.register_tool("technic:mining_drill", { + description = S("Mining Drill Mk%d"):format(1), + inventory_image = "technic_mining_drill.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then + return itemstack + end + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + local charge_to_take = cost_to_use(1, 1) + if meta.charge >= charge_to_take then + local pos = minetest.get_pointed_thing_position(pointed_thing, false) + drill_dig_it(pos, user, 1) + if not technic.creative_mode then + meta.charge = meta.charge - charge_to_take + itemstack:set_metadata(minetest.serialize(meta)) + technic.set_RE_wear(itemstack, meta.charge, max_charge[1]) + end + end + return itemstack + end, +}) + +minetest.register_tool("technic:mining_drill_mk2", { + description = S("Mining Drill Mk%d"):format(2), + inventory_image = "technic_mining_drill_mk2.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk2_handler(itemstack, user, pointed_thing) + return itemstack + end, +}) + +technic.register_power_tool("technic:mining_drill_mk2", max_charge[2]) + +for i = 1, 4 do + technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2]) + minetest.register_tool("technic:mining_drill_mk2_"..i, { + description = S("Mining Drill Mk%d Mode %d"):format(2, i), + inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_mk2.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + groups = {not_in_creative_inventory=1}, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk2_handler(itemstack, user, pointed_thing) + return itemstack + end, + }) +end + +minetest.register_tool("technic:mining_drill_mk3", { + description = S("Mining Drill Mk%d"):format(3), + inventory_image = "technic_mining_drill_mk3.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk3_handler(itemstack,user,pointed_thing) + return itemstack + end, +}) + +technic.register_power_tool("technic:mining_drill_mk3", max_charge[3]) + +for i=1,5,1 do + technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3]) + minetest.register_tool("technic:mining_drill_mk3_"..i, { + description = S("Mining Drill Mk%d Mode %d"):format(3, i), + inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_mk3.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + groups = {not_in_creative_inventory=1}, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk3_handler(itemstack,user,pointed_thing) + return itemstack + end, + }) +end diff --git a/mods/technic_plus/technic/tools/mining_lasers.lua b/mods/technic_plus/technic/tools/mining_lasers.lua new file mode 100644 index 0000000..e4dd178 --- /dev/null +++ b/mods/technic_plus/technic/tools/mining_lasers.lua @@ -0,0 +1,127 @@ +local mining_lasers_list = { +-- {, , , }, + {"1", 7, 50000, 1000}, + {"2", 14, 200000, 2000}, + {"3", 21, 650000, 3000}, +} +local allow_entire_discharging = true + +local S = technic.getter + +minetest.register_craft({ + output = "technic:laser_mk1", + recipe = { + {"default:diamond", "basic_materials:brass_ingot", "default:obsidian_glass"}, + {"", "basic_materials:brass_ingot", "technic:red_energy_crystal"}, + {"", "", "default:copper_ingot"}, + } +}) +minetest.register_craft({ + output = "technic:laser_mk2", + recipe = { + {"default:diamond", "technic:carbon_steel_ingot", "technic:laser_mk1"}, + {"", "technic:carbon_steel_ingot", "technic:green_energy_crystal"}, + {"", "", "default:copper_ingot"}, + } +}) +minetest.register_craft({ + output = "technic:laser_mk3", + recipe = { + {"default:diamond", "technic:carbon_steel_ingot", "technic:laser_mk2"}, + {"", "technic:carbon_steel_ingot", "technic:blue_energy_crystal"}, + {"", "", "default:copper_ingot"}, + } +}) + +local function laser_node(pos, node, player) + local def = minetest.registered_nodes[node.name] + if def.liquidtype ~= "none" and def.buildable_to then + minetest.remove_node(pos) + minetest.add_particle({ + pos = pos, + velocity = {x = 0, y = 1.5 + math.random(), z = 0}, + acceleration = {x = 0, y = -1, z = 0}, + size = 6 + math.random() * 2, + texture = "smoke_puff.png^[transform" .. math.random(0, 7), + }) + return + end + def.on_dig(pos, node, player) +end + +local keep_node = {air = true} +local function can_keep_node(name) + if keep_node[name] ~= nil then + return keep_node[name] + end + keep_node[name] = minetest.get_item_group(name, "hot") ~= 0 + return keep_node[name] +end + +local function laser_shoot(player, range, particle_texture, sound) + local player_pos = player:get_pos() + local player_name = player:get_player_name() + local dir = player:get_look_dir() + + local start_pos = vector.new(player_pos) + -- Adjust to head height + start_pos.y = start_pos.y + (player:get_properties().eye_height or 1.625) + minetest.add_particle({ + pos = start_pos, + velocity = dir, + acceleration = vector.multiply(dir, 50), + expirationtime = (math.sqrt(1 + 100 * (range + 0.4)) - 1) / 50, + size = 1, + texture = particle_texture .. "^[transform" .. math.random(0, 7), + }) + minetest.sound_play(sound, {pos = player_pos, max_hear_distance = range}) + for pos in technic.trace_node_ray_fat(start_pos, dir, range) do + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + break + end + local node = minetest.get_node(pos) + if node.name == "ignore" + or not minetest.registered_nodes[node.name] then + break + end + if not can_keep_node(node.name) then + laser_node(pos, node, player) + end + end +end + +for _, m in pairs(mining_lasers_list) do + technic.register_power_tool("technic:laser_mk"..m[1], m[3]) + minetest.register_tool("technic:laser_mk"..m[1], { + description = S("Mining Laser Mk%d"):format(m[1]), + inventory_image = "technic_mining_laser_mk"..m[1]..".png", + range = 0, + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user) + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge or meta.charge == 0 then + return + end + + local range = m[2] + if meta.charge < m[4] then + if not allow_entire_discharging then + return + end + -- If charge is too low, give the laser a shorter range + range = range * meta.charge / m[4] + end + laser_shoot(user, range, "technic_laser_beam_mk" .. m[1] .. ".png", + "technic_laser_mk" .. m[1]) + if not technic.creative_mode then + meta.charge = math.max(meta.charge - m[4], 0) + technic.set_RE_wear(itemstack, meta.charge, m[3]) + itemstack:set_metadata(minetest.serialize(meta)) + end + return itemstack + end, + }) +end diff --git a/mods/technic_plus/technic/tools/prospector.lua b/mods/technic_plus/technic/tools/prospector.lua new file mode 100644 index 0000000..948294e --- /dev/null +++ b/mods/technic_plus/technic/tools/prospector.lua @@ -0,0 +1,134 @@ +local S = technic.getter + +technic.register_power_tool("technic:prospector", 300000) + +local function get_metadata(toolstack) + local m = minetest.deserialize(toolstack:get_metadata()) + if not m then m = {} end + if not m.charge then m.charge = 0 end + if not m.target then m.target = "" end + if not m.look_depth then m.look_depth = 7 end + if not m.look_radius then m.look_radius = 1 end + return m +end + +minetest.register_tool("technic:prospector", { + description = S("Prospector"), + inventory_image = "technic_prospector.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(toolstack, user, pointed_thing) + if not user or not user:is_player() or user.is_fake_player then return end + if pointed_thing.type ~= "node" then return end + local toolmeta = get_metadata(toolstack) + local look_diameter = toolmeta.look_radius * 2 + 1 + local charge_to_take = toolmeta.look_depth * (toolmeta.look_depth + 1) * look_diameter * look_diameter + if toolmeta.charge < charge_to_take then return end + if toolmeta.target == "" then + minetest.chat_send_player(user:get_player_name(), "Right-click to set target block type") + return + end + if not technic.creative_mode then + toolmeta.charge = toolmeta.charge - charge_to_take + toolstack:set_metadata(minetest.serialize(toolmeta)) + technic.set_RE_wear(toolstack, toolmeta.charge, technic.power_tools[toolstack:get_name()]) + end + local start_pos = pointed_thing.under + local forward = minetest.facedir_to_dir(minetest.dir_to_facedir(user:get_look_dir(), true)) + local right = forward.x ~= 0 and { x=0, y=1, z=0 } or (forward.y ~= 0 and { x=0, y=0, z=1 } or { x=1, y=0, z=0 }) + local up = forward.x ~= 0 and { x=0, y=0, z=1 } or (forward.y ~= 0 and { x=1, y=0, z=0 } or { x=0, y=1, z=0 }) + local base_pos = vector.add(start_pos, vector.multiply(vector.add(right, up), - toolmeta.look_radius)) + local found = false + for f = 0, toolmeta.look_depth-1 do + for r = 0, look_diameter-1 do + for u = 0, look_diameter-1 do + if minetest.get_node(vector.add(vector.add(vector.add(base_pos, vector.multiply(forward, f)), + vector.multiply(right, r)), vector.multiply(up, u))).name == toolmeta.target then + found = true + end + end + end + end + if math.random() < 0.02 then found = not found end + minetest.chat_send_player(user:get_player_name(), minetest.registered_nodes[toolmeta.target].description.. + " is "..(found and "present" or "absent").." in "..look_diameter.. + "x"..look_diameter.."x"..toolmeta.look_depth.." region") + minetest.sound_play("technic_prospector_"..(found and "hit" or "miss"), + { pos = vector.add(user:get_pos(), { x = 0, y = 1, z = 0 }), gain = 1.0, max_hear_distance = 10 }) + return toolstack + end, + on_place = function(toolstack, user, pointed_thing) + if not user or not user:is_player() or user.is_fake_player then return end + local toolmeta = get_metadata(toolstack) + local pointed + if pointed_thing.type == "node" then + local pname = minetest.get_node(pointed_thing.under).name + local pdef = minetest.registered_nodes[pname] + if pdef and (pdef.groups.not_in_creative_inventory or 0) == 0 and pname ~= toolmeta.target then + pointed = pname + end + end + local look_diameter = toolmeta.look_radius * 2 + 1 + minetest.show_formspec(user:get_player_name(), "technic:prospector_control", + "size[7,8.5]".. + "item_image[0,0;1,1;"..toolstack:get_name().."]".. + "label[1,0;"..minetest.formspec_escape(toolstack:get_definition().description).."]".. + (toolmeta.target ~= "" and + "label[0,1.5;Current target:]".. + "label[0,2;"..minetest.formspec_escape(minetest.registered_nodes[toolmeta.target].description).."]".. + "item_image[0,2.5;1,1;"..toolmeta.target.."]" or + "label[0,1.5;No target set]").. + (pointed and + "label[3.5,1.5;May set new target:]".. + "label[3.5,2;"..minetest.formspec_escape(minetest.registered_nodes[pointed].description).."]".. + "item_image[3.5,2.5;1,1;"..pointed.."]".. + "button_exit[3.5,3.65;2,0.5;target_"..pointed..";Set target]" or + "label[3.5,1.5;No new target available]").. + "label[0,4.5;Region cross section:]".. + "label[0,5;"..look_diameter.."x"..look_diameter.."]".. + "label[3.5,4.5;Set region cross section:]".. + "button_exit[3.5,5.15;1,0.5;look_radius_0;1x1]".. + "button_exit[4.5,5.15;1,0.5;look_radius_1;3x3]".. + "button_exit[5.5,5.15;1,0.5;look_radius_3;7x7]".. + "label[0,6;Region depth:]".. + "label[0,6.5;"..toolmeta.look_depth.."]".. + "label[3.5,6;Set region depth:]".. + "button_exit[3.5,6.65;1,0.5;look_depth_7;7]".. + "button_exit[4.5,6.65;1,0.5;look_depth_14;14]".. + "button_exit[5.5,6.65;1,0.5;look_depth_21;21]".. + "label[0,7.5;Accuracy:]".. + "label[0,8;98%]") + return + end, +}) + +minetest.register_on_player_receive_fields(function(user, formname, fields) + if formname ~= "technic:prospector_control" then return false end + if not user or not user:is_player() or user.is_fake_player then return end + local toolstack = user:get_wielded_item() + if toolstack:get_name() ~= "technic:prospector" then return true end + local toolmeta = get_metadata(toolstack) + for field, value in pairs(fields) do + if field:sub(1, 7) == "target_" then + toolmeta.target = field:sub(8) + end + if field:sub(1, 12) == "look_radius_" then + toolmeta.look_radius = field:sub(13) + end + if field:sub(1, 11) == "look_depth_" then + toolmeta.look_depth = field:sub(12) + end + end + toolstack:set_metadata(minetest.serialize(toolmeta)) + user:set_wielded_item(toolstack) + return true +end) + +minetest.register_craft({ + output = "technic:prospector", + recipe = { + {"moreores:pick_silver", "moreores:mithril_block", "pipeworks:teleport_tube_1"}, + {"basic_materials:brass_ingot", "technic:control_logic_unit", "basic_materials:brass_ingot"}, + {"", "technic:blue_energy_crystal", ""}, + } +}) diff --git a/mods/technic_plus/technic/tools/sonic_screwdriver.lua b/mods/technic_plus/technic/tools/sonic_screwdriver.lua new file mode 100644 index 0000000..536f47c --- /dev/null +++ b/mods/technic_plus/technic/tools/sonic_screwdriver.lua @@ -0,0 +1,98 @@ +local sonic_screwdriver_max_charge = 15000 + +local S = technic.getter + +technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_charge) + +-- screwdriver handler code reused from minetest/minetest_game screwdriver @a9ac480 +local ROTATE_FACE = 1 +local ROTATE_AXIS = 2 + +local function nextrange(x, max) + x = x + 1 + if x > max then + x = 0 + end + return x +end + +-- Handles rotation +local function screwdriver_handler(itemstack, user, pointed_thing, mode) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if not ndef or not ndef.paramtype2 == "facedir" or + (ndef.drawtype == "nodebox" and + not ndef.node_box.type == "fixed") or + node.param2 == nil then + return + end + + -- contrary to the default screwdriver, do not check for can_dig, to allow rotating machines with CLU's in them + -- this is consistent with the previous sonic screwdriver + + local meta1 = minetest.deserialize(itemstack:get_metadata()) + if not meta1 or not meta1.charge or meta1.charge < 100 then + return + end + + minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10}) + + -- Set param2 + local rotationPart = node.param2 % 32 -- get first 4 bits + local preservePart = node.param2 - rotationPart + + local axisdir = math.floor(rotationPart / 4) + local rotation = rotationPart - axisdir * 4 + if mode == ROTATE_FACE then + rotationPart = axisdir * 4 + nextrange(rotation, 3) + elseif mode == ROTATE_AXIS then + rotationPart = nextrange(axisdir, 5) * 4 + end + + node.param2 = preservePart + rotationPart + minetest.swap_node(pos, node) + + if not technic.creative_mode then + meta1.charge = meta1.charge - 100 + itemstack:set_metadata(minetest.serialize(meta1)) + technic.set_RE_wear(itemstack, meta1.charge, sonic_screwdriver_max_charge) + end + + return itemstack +end + +minetest.register_tool("technic:sonic_screwdriver", { + description = S("Sonic Screwdriver (left-click rotates face, right-click rotates axis)"), + inventory_image = "technic_sonic_screwdriver.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, ROTATE_FACE) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, ROTATE_AXIS) + return itemstack + end, +}) + +minetest.register_craft({ + output = "technic:sonic_screwdriver", + recipe = { + {"", "default:diamond", ""}, + {"mesecons_materials:fiber", "technic:battery", "mesecons_materials:fiber"}, + {"mesecons_materials:fiber", "moreores:mithril_ingot", "mesecons_materials:fiber"} + } +}) + diff --git a/mods/technic_plus/technic/tools/tree_tap.lua b/mods/technic_plus/technic/tools/tree_tap.lua new file mode 100644 index 0000000..eb9f36a --- /dev/null +++ b/mods/technic_plus/technic/tools/tree_tap.lua @@ -0,0 +1,78 @@ + +local S = technic.getter +local mesecons_materials = minetest.get_modpath("mesecons_materials") + +minetest.register_tool("technic:treetap", { + description = S("Tree Tap"), + inventory_image = "technic_tree_tap.png", + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + local pos = pointed_thing.under + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + local node = minetest.get_node(pos) + local node_name = node.name + if node_name ~= "moretrees:rubber_tree_trunk" then + return + end + node.name = "moretrees:rubber_tree_trunk_empty" + minetest.swap_node(pos, node) + minetest.handle_node_drops(pointed_thing.above, {"technic:raw_latex"}, user) + if not technic.creative_mode then + local item_wear = tonumber(itemstack:get_wear()) + item_wear = item_wear + 819 + if item_wear > 65535 then + itemstack:clear() + return itemstack + end + itemstack:set_wear(item_wear) + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "technic:treetap", + recipe = { + {"pipeworks:tube_1", "group:wood", "default:stick"}, + {"", "default:stick", "default:stick"} + }, +}) + +minetest.register_craftitem("technic:raw_latex", { + description = S("Raw Latex"), + inventory_image = "technic_raw_latex.png", +}) + +if mesecons_materials then + minetest.register_craft({ + type = "cooking", + recipe = "technic:raw_latex", + output = "mesecons_materials:glue", + }) +end + +minetest.register_craftitem("technic:rubber", { + description = S("Rubber Fiber"), + inventory_image = "technic_rubber.png", +}) + +minetest.register_abm({ + label = "Tools: tree tap", + nodenames = {"moretrees:rubber_tree_trunk_empty"}, + interval = 60, + chance = 15, + action = function(pos, node) + local radius = (moretrees and moretrees.leafdecay_radius) or 5 + local nodes = minetest.find_node_near(pos, radius, {"moretrees:rubber_tree_leaves"}) + if nodes then + node.name = "moretrees:rubber_tree_trunk" + minetest.swap_node(pos, node) + end + end +}) + diff --git a/mods/technic_plus/technic/tools/vacuum.lua b/mods/technic_plus/technic/tools/vacuum.lua new file mode 100644 index 0000000..7b01af8 --- /dev/null +++ b/mods/technic_plus/technic/tools/vacuum.lua @@ -0,0 +1,61 @@ +-- Configuration +local vacuum_max_charge = 10000 -- 10000 - Maximum charge of the vacuum cleaner +local vacuum_charge_per_object = 100 -- 100 - Capable of picking up 50 objects +local vacuum_range = 8 -- 8 - Area in which to pick up objects + +local S = technic.getter + +technic.register_power_tool("technic:vacuum", vacuum_max_charge) + +minetest.register_tool("technic:vacuum", { + description = S("Vacuum Cleaner"), + inventory_image = "technic_vacuum.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + if meta.charge > vacuum_charge_per_object then + minetest.sound_play("vacuumcleaner", { + to_player = user:get_player_name(), + gain = 0.4, + }) + end + local pos = user:get_pos() + local inv = user:get_inventory() + for _, object in ipairs(minetest.get_objects_inside_radius(pos, vacuum_range)) do + local luaentity = object:get_luaentity() + if not object:is_player() and luaentity and luaentity.name == "__builtin:item" and luaentity.itemstring ~= "" then + if inv and inv:room_for_item("main", ItemStack(luaentity.itemstring)) then + meta.charge = meta.charge - vacuum_charge_per_object + if meta.charge < vacuum_charge_per_object then + return + end + inv:add_item("main", ItemStack(luaentity.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = user:get_player_name(), + gain = 0.4, + }) + luaentity.itemstring = "" + object:remove() + end + end + end + + technic.set_RE_wear(itemstack, meta.charge, vacuum_max_charge) + itemstack:set_metadata(minetest.serialize(meta)) + return itemstack + end, +}) + +minetest.register_craft({ + output = 'technic:vacuum', + recipe = { + {'pipeworks:tube_1', 'pipeworks:filter', 'technic:battery'}, + {'pipeworks:tube_1', 'basic_materials:motor', 'technic:battery'}, + {'technic:stainless_steel_ingot', '', ''}, + } +}) diff --git a/mods/technic_plus/technic/util/throttle.lua b/mods/technic_plus/technic/util/throttle.lua new file mode 100644 index 0000000..99d4ec2 --- /dev/null +++ b/mods/technic_plus/technic/util/throttle.lua @@ -0,0 +1,26 @@ + +local function throttle(callspersecond, fn) + local time = 0 + local count = 0 + + return function(...) + local now = minetest.get_us_time() + if (now - time) > 1000000 then + -- reset time + time = now + count = 0 + else + -- check max calls + count = count + 1 + if count > callspersecond then + return + end + end + + return pcall(fn, ...) + end + +end + + +return throttle diff --git a/mods/technic_plus/technic_chests/README.md b/mods/technic_plus/technic_chests/README.md new file mode 100644 index 0000000..c4f3eac --- /dev/null +++ b/mods/technic_plus/technic_chests/README.md @@ -0,0 +1,24 @@ +Technic chests +============== + +License +------- + +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +Technic chests code is licensed under the GNU LGPLv2+. + +Texture licenses: + +VanessaE: (WTFPL) + * technic\_pencil\_icon.png + * technic\_checkmark\_icon.png + * technic\_chest\_overlay\_*.png + * technic\_*\_chest\_lock\_overlay.png + +sdzen (Elise Staudter) modified by VanessaE (CC BY-SA 3.0): + * copper, iron, silver, gold, mithril chest textures 16x16 + +RealBadAngel: (WTFPL) + * Everything else. + diff --git a/mods/technic_plus/technic_chests/chests.lua b/mods/technic_plus/technic_chests/chests.lua new file mode 100644 index 0000000..51363e6 --- /dev/null +++ b/mods/technic_plus/technic_chests/chests.lua @@ -0,0 +1,152 @@ + +local function register_chests(name, data) + for _,t in pairs({"", "_locked", "_protected"}) do + local data_copy = {} + for k, v in pairs(data) do + data_copy[k] = v + end + data_copy.locked = t == "_locked" + data_copy.protected = t == "_protected" + technic.chests.register_chest(name, data_copy) + end +end + +local function register_crafts(name, material, base_open, base_locked, base_protected) + name = name:lower() + if minetest.registered_items[material] then + if minetest.registered_items[base_open] then + minetest.register_craft({ + output = "technic:"..name.."_chest", + recipe = { + {material, material, material}, + {material, base_open, material}, + {material, material, material}, + } + }) + end + if minetest.registered_items[base_locked] then + minetest.register_craft({ + output = "technic:"..name.."_locked_chest", + recipe = { + {material, material, material}, + {material, base_locked, material}, + {material, material, material}, + } + }) + end + if minetest.registered_items[base_protected] then + minetest.register_craft({ + output = "technic:"..name.."_protected_chest", + recipe = { + {material, material, material}, + {material, base_protected, material}, + {material, material, material}, + } + }) + end + end + minetest.register_craft({ + output = "technic:"..name.."_locked_chest", + type = "shapeless", + recipe = {"basic_materials:padlock","technic:"..name.."_chest"} + }) + minetest.register_craft({ + output = "technic:"..name.."_protected_chest", + type = "shapeless", + recipe = {"default:copper_ingot", "technic:"..name.."_chest"} + }) + minetest.register_craft({ + output = "technic:"..name.."_chest", + type = "shapeless", + recipe = {"technic:"..name.."_locked_chest"} + }) + minetest.register_craft({ + output = "technic:"..name.."_chest", + type = "shapeless", + recipe = {"technic:"..name.."_protected_chest"} + }) +end + +-- Iron +register_chests("Iron", { + width = 9, + height = 5, + sort = true, + infotext = true, +}) +register_crafts( + "Iron", + minetest.get_modpath("technic_worldgen") and "technic:cast_iron_ingot" or "default:steel_ingot", + "default:chest", + "default:chest_locked", + "protector:chest" +) + +-- Copper +register_chests("Copper", { + width = 12, + height = 5, + sort = true, + infotext = true, + autosort = true, +}) +register_crafts( + "Copper", + "default:copper_ingot", + "technic:iron_chest", + "technic:iron_locked_chest", + "technic:iron_protected_chest" +) + +-- Silver +register_chests("Silver", { + width = 12, + height = 6, + sort = true, + infotext = true, + autosort = true, + quickmove = true, +}) +register_crafts( + "Silver", + "moreores:silver_ingot", + "technic:copper_chest", + "technic:copper_locked_chest", + "technic:copper_protected_chest" +) + +-- Gold +register_chests("Gold", { + width = 15, + height = 6, + sort = true, + infotext = true, + autosort = true, + quickmove = true, + color = true, +}) +register_crafts( + "Gold", + "default:gold_ingot", + minetest.get_modpath("moreores") and "technic:silver_chest" or "technic:copper_chest", + minetest.get_modpath("moreores") and "technic:silver_locked_chest" or "technic:copper_locked_chest", + minetest.get_modpath("moreores") and "technic:silver_protected_chest" or "technic:copper_protected_chest" +) + +-- Mithril +register_chests("Mithril", { + width = 15, + height = 6, + sort = true, + infotext = true, + autosort = true, + quickmove = true, + digilines = true, +}) +register_crafts( + "Mithril", + "moreores:mithril_ingot", + "technic:gold_chest", + "technic:gold_locked_chest", + "technic:gold_protected_chest" +) diff --git a/mods/technic_plus/technic_chests/digilines.lua b/mods/technic_plus/technic_chests/digilines.lua new file mode 100644 index 0000000..b9d2383 --- /dev/null +++ b/mods/technic_plus/technic_chests/digilines.lua @@ -0,0 +1,93 @@ + +function technic.chests.send_digiline_message(pos, event, player, items) + local set_channel = minetest.get_meta(pos):get_string("channel") + local player_name = player and player:get_player_name() or "" + digilines.receptor_send(pos, digilines.rules.default, set_channel, { + event = event, + items = items, + player = player_name, + pos = pos + }) +end + +local function item_matches(item, stack) + -- Same macthing as pipeworks filter injector + local name = stack:get_name() + local wear = stack:get_wear() + return (not item.name or name == item.name) + and (not item.group or (type(item.group) == "string" and minetest.get_item_group(name, item.group) ~= 0)) + and (not item.wear or (type(item.wear) == "number" and wear == item.wear) or (type(item.wear) == "table" + and (not item.wear[1] or (type(item.wear[1]) == "number" and item.wear[1] <= wear)) + and (not item.wear[2] or (type(item.wear[2]) == "number" and wear < item.wear[2])))) + and (not item.metadata or (type(item.metadata) == "string" and stack:get_metadata() == item.metadata)) +end + +function technic.chests.digiline_effector(pos, _, channel, msg) + local meta = minetest.get_meta(pos) + local set_channel = meta:get_string("channel") + if channel ~= set_channel then + return + end + if type(msg) ~= "table" or not msg.command then + return + end + local inv = meta:get_inventory() + + if msg.command == "sort" then + technic.chests.sort_inv(inv, meta:get_int("sort_mode")) + + elseif msg.command == "is_empty" then + local empty = inv:is_empty("main") + digilines.receptor_send(pos, digilines.rules.default, set_channel, empty) + + elseif msg.command == "get_list" then + local inv_table = {} + local list = inv:get_list("main") + if list then + for _,stack in ipairs(list) do + if not stack:is_empty() then + table.insert(inv_table, stack:get_name().." "..stack:get_count()) + else + table.insert(inv_table, "") + end + end + end + digilines.receptor_send(pos, digilines.rules.default, set_channel, inv_table) + + elseif msg.command == "get_stack" and type(msg.index) == "number" then + local stack = inv:get_stack("main", msg.index):to_table() + digilines.receptor_send(pos, digilines.rules.default, set_channel, stack) + + elseif msg.command == "contains_item" and (type(msg.item) == "string" or type(msg.item) == "table") then + local contains = inv:contains_item("main", msg.item) + digilines.receptor_send(pos, digilines.rules.default, set_channel, contains) + + elseif msg.command == "room_for_item" and (type(msg.item) == "string" or type(msg.item) == "table") then + local room = inv:room_for_item("main", msg.item) + digilines.receptor_send(pos, digilines.rules.default, set_channel, room) + + elseif msg.command == "count_item" and (type(msg.item) == "string" or type(msg.item) == "table") then + local count = 0 + local list = inv:get_list("main") + if list then + if type(msg.item) == "string" then + local itemstack = ItemStack(msg.item) + msg.item = { + name = itemstack:get_name(), + count = itemstack:get_count(), + wear = string.match(msg.item, "%S*:%S*%s%d%s(%d)") and itemstack:get_wear(), + metadata = string.match(msg.item, "%S*:%S*%s%d%s%d(%s.*)") and itemstack:get_meta():get_string("") + } + end + for _,stack in pairs(list) do + if not stack:is_empty() and item_matches(msg.item, stack) then + count = count + stack:get_count() + end + end + if msg.item.count and type(msg.item.count) == "number" and msg.item.count > 1 then + count = math.floor(count / msg.item.count) + end + end + digilines.receptor_send(pos, digilines.rules.default, set_channel, count) + end +end diff --git a/mods/technic_plus/technic_chests/formspec.lua b/mods/technic_plus/technic_chests/formspec.lua new file mode 100644 index 0000000..6c9851c --- /dev/null +++ b/mods/technic_plus/technic_chests/formspec.lua @@ -0,0 +1,256 @@ + +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end +--local S = minetest.get_translator("technic_chests") + +local has_pipeworks = minetest.get_modpath("pipeworks") + +local function get_pipeworks_fs(x, y, meta) + -- Use a container to reposition the pipeworks button. + return "container["..x..","..(y - 4.3).."]".. + pipeworks.fs_helpers.cycling_button( + meta, + pipeworks.button_base, + "splitstacks", + { + pipeworks.button_off, + pipeworks.button_on + } + )..pipeworks.button_label.."container_end[]" +end + +local function get_color_fs(x, y, meta) + local fs = "" + for a = 0, 3 do + for b = 0, 3 do + fs = fs.."image_button["..(x + b * 0.73)..","..(y + 0.1 + a * 0.79)..";0.8,0.8;".. + "technic_colorbutton"..(a * 4 + b)..".png;color_button"..(a * 4 + b + 1)..";]" + end + end + local selected = meta:get_int("color") + local color + if technic.chests.colors[selected] then + color = technic.chests.colors[selected][2] + else + color = S("None") + end + return fs.."label["..(x + 0.1)..","..(y + 3.4)..";"..S("Selected Color: %s"):format(color).."]" +end + +local function get_quickmove_fs(x, y) + return "button["..x..","..y..";3,1;existing_to_chest;"..S("Move existing to Chest").."]".. + "label["..(x + 0.1)..","..(y + 1.15)..";"..S("Move specific")..":\n("..S("Drop to move")..")]".. + "list[context;quickmove;"..(x + 1.8)..","..(y + 1.15)..";1,1]".. + "button["..x..","..(y + 2.3)..";3,1;all_to_chest;"..S("Move all to Chest").."]".. + "button["..x..","..(y + 3.2)..";3,1;all_to_inv;"..S("Move all to Inventory").."]" +end + +local function get_digilines_fs(x, y, meta) + local channel = minetest.formspec_escape(meta:get_string("channel")) + local put = meta:get_int("send_put") == 1 and "true" or "false" + local take = meta:get_int("send_take") == 1 and "true" or "false" + local inject = meta:get_int("send_inject") == 1 and "true" or "false" + local pull = meta:get_int("send_pull") == 1 and "true" or "false" + local overflow = meta:get_int("send_overflow") == 1 and "true" or "false" + return "field["..(x + 0.3)..","..(y + 0.5)..";3,1;channel;Digiline Channel:;"..channel.."]".. + "button["..(x + 0.5)..","..(y + 1.1)..";2,1;save_channel;Save Channel]".. + "checkbox["..(x + 0.1)..","..(y + 1.8)..";send_put;"..S("Send player put messages")..";"..put.."]".. + "checkbox["..(x + 0.1)..","..(y + 2.2)..";send_take;"..S("Send player take messages")..";"..take.."]".. + "checkbox["..(x + 0.1)..","..(y + 2.6)..";send_inject;"..S("Send tube inject messages")..";"..inject.."]".. + "checkbox["..(x + 0.1)..","..(y + 3.0)..";send_pull;"..S("Send tube pull messages")..";"..pull.."]".. + "checkbox["..(x + 0.1)..","..(y + 3.4)..";send_overflow;"..S("Send overflow messages")..";"..overflow.."]" +end + +local function get_infotext_fs(editing, meta) + local infotext = minetest.formspec_escape(meta:get_string("infotext")) + if editing then + return "image_button[0,0.1;0.8,0.8;technic_checkmark_icon.png;save_infotext;]".. + "field[1,0.3;4,1;infotext;;"..infotext.."]" + else + return "image_button[0,0.1;0.8,0.8;technic_pencil_icon.png;edit_infotext;]".. + "label[1,0;"..infotext.."]" + end +end + +local function get_autosort_fs(x, meta) + if meta:get_int("autosort") == 1 then + return "button["..x..",0;2,1;autosort;"..S("Auto-sort is On").."]" + else + return "button["..x..",0;2,1;autosort;"..S("Auto-sort is Off").."]" + end +end + +local function get_sort_fs(x, meta) + local mode = meta:get_int("sort_mode") + local fs = "button["..(x + 2)..",0;1,1;sort;"..S("Sort").."]" + if mode == 1 then + return fs.."button["..x..",0;2,1;sort_mode;"..S("Sort by Quantity").."]" + elseif mode == 2 then + return fs.."button["..x..",0;2,1;sort_mode;"..S("Sort by Type").."]" + elseif mode == 3 then + return fs.."button["..x..",0;2,1;sort_mode;"..S("Sort by Wear").."]" + else + return fs.."button["..x..",0;2,1;sort_mode;"..S("Sort by Item").."]" + end +end + +function technic.chests.get_formspec(data) + local formspec = {} + local top_width = (data.infotext and 6 or 0) + (data.autosort and 2 or 0) + (data.sort and 3 or 0) + local bottom_width = (data.quickmove and 3 or 0) + ((data.color or data.digilines) and 3 or 0) + 8 + local width = math.max(top_width, bottom_width, data.width) + local padding = (width - bottom_width) / 2 + if data.quickmove and (data.color or data.digilines) then + padding = (width - bottom_width) / 4 + elseif data.quickmove or data.color or data.digilines then + padding = (width - bottom_width) / 3 + end + local player_inv_left = padding + if data.quickmove then + player_inv_left = padding + 3 + padding + end + local player_inv_top = data.height + (has_pipeworks and 1.6 or 1.3) + local height = data.height + (has_pipeworks and 5.4 or 5.1) + local chest_inv_left = (width - data.width) / 2 + formspec.base = + "size["..width..","..height.."]".. + "list[context;main;"..chest_inv_left..",1;"..data.width..","..data.height..";]".. + "list[current_player;main;"..player_inv_left..","..player_inv_top..";8,4;]".. + "listring[context;main]".. + "listring[current_player;main]".. + default.get_hotbar_bg(player_inv_left, player_inv_top) + if data.quickmove then + formspec.base = formspec.base..get_quickmove_fs(padding, data.height + 1.2) + end + formspec.padding = padding + formspec.width = width + return formspec +end + +function technic.chests.update_formspec(pos, data, edit_infotext) + local formspec = data.formspec.base + local meta = minetest.get_meta(pos) + if data.infotext then + formspec = formspec..get_infotext_fs(edit_infotext, meta) + end + if data.sort then + formspec = formspec..get_sort_fs(data.formspec.width - 3, meta) + if data.autosort then + formspec = formspec..get_autosort_fs(data.formspec.width - 5, meta) + end + end + if has_pipeworks then + local offset = data.quickmove and (data.formspec.padding * 2 + 3) or data.formspec.padding + formspec = formspec..get_pipeworks_fs(offset, data.height + 1, meta) + end + if data.color or data.digilines then + local offset = data.quickmove and (data.formspec.padding * 3 + 11) or (data.formspec.padding * 2 + 8) + if data.color then + formspec = formspec..get_color_fs(offset, data.height + 1.2, meta) + else + formspec = formspec..get_digilines_fs(offset, data.height + 1.2, meta) + end + end + meta:set_string("formspec", formspec) +end + +function technic.chests.get_receive_fields(data) + return function(pos, formname, fields, player) + if not fields or not player then + return + end + local meta = minetest.get_meta(pos) + local chest_inv = meta:get_inventory() + local player_inv = player:get_inventory() + if fields.quit then + if meta:get_int("autosort") == 1 then + technic.chests.sort_inv(chest_inv, meta:get_int("sort_mode")) + end + technic.chests.update_formspec(pos, data) + return + end + if not technic.chests.change_allowed(pos, player, data.locked, data.protected) then + return + end + if data.sort and fields.sort then + technic.chests.sort_inv(chest_inv, meta:get_int("sort_mode")) + return + end + if data.quickmove then + if fields.all_to_chest then + local moved_items = technic.chests.move_inv(player_inv, chest_inv) + if data.digilines and meta:get_int("send_put") == 1 then + technic.chests.send_digiline_message(pos, "put", player, moved_items) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "put", "stuff") + return + elseif fields.all_to_inv then + local moved_items = technic.chests.move_inv(chest_inv, player_inv) + if data.digilines and meta:get_int("send_take") == 1 then + technic.chests.send_digiline_message(pos, "take", player, moved_items) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "take", "stuff") + return + elseif fields.existing_to_chest then + local items = technic.chests.get_inv_items(chest_inv) + local moved_items = technic.chests.move_inv(player_inv, chest_inv, items) + if data.digilines and meta:get_int("send_put") == 1 then + technic.chests.send_digiline_message(pos, "put", player, moved_items) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "put", "stuff") + return + end + end + if not technic.chests.change_allowed(pos, player, data.locked, true) then + return -- Protect settings from being changed, even for open chests + end + if has_pipeworks then + pipeworks.fs_helpers.on_receive_fields(pos, fields) + end + if data.sort and fields.sort_mode then + local value = meta:get_int("sort_mode") + 1 + if value < 0 or value > 3 then + value = 0 + end + meta:set_int("sort_mode", value) + end + if data.autosort and fields.autosort then + local value = meta:get_int("autosort") == 1 and 0 or 1 + meta:set_int("autosort", value) + end + if data.color then + for i = 1, 16 do + if fields["color_button"..i] then + local node = minetest.get_node(pos) + if technic.chests.colors[i] then + node.name = data.node_name.."_"..technic.chests.colors[i][1] + else + node.name = data.node_name + end + minetest.swap_node(pos, node) + meta:set_int("color", i) + break + end + end + end + if data.digilines then + if fields.save_channel and fields.channel then + meta:set_string("channel", fields.channel) + end + for _,setting in pairs({"send_put", "send_take", "send_inject", "send_pull", "send_overflow"}) do + if fields[setting] then + local value = fields[setting] == "true" and 1 or 0 + meta:set_int(setting, value) + end + end + end + if data.infotext then + if fields.edit_infotext then + technic.chests.update_formspec(pos, data, true) + return + elseif fields.save_infotext and fields.infotext then + meta:set_string("infotext", fields.infotext) + end + end + technic.chests.update_formspec(pos, data) + end +end diff --git a/mods/technic_plus/technic_chests/init.lua b/mods/technic_plus/technic_chests/init.lua new file mode 100644 index 0000000..1cd0534 --- /dev/null +++ b/mods/technic_plus/technic_chests/init.lua @@ -0,0 +1,83 @@ + +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end +--local S = minetest.get_translator("technic_chests") + +local modpath = minetest.get_modpath("technic_chests") + +technic = rawget(_G, "technic") or {} +technic.chests = {} + +technic.chests.colors = { + {"black", S("Black")}, + {"blue", S("Blue")}, + {"brown", S("Brown")}, + {"cyan", S("Cyan")}, + {"dark_green", S("Dark Green")}, + {"dark_grey", S("Dark Grey")}, + {"green", S("Green")}, + {"grey", S("Grey")}, + {"magenta", S("Magenta")}, + {"orange", S("Orange")}, + {"pink", S("Pink")}, + {"red", S("Red")}, + {"violet", S("Violet")}, + {"white", S("White")}, + {"yellow", S("Yellow")}, +} + +function technic.chests.change_allowed(pos, player, owned, protected) + if owned then + if minetest.is_player(player) and not default.can_interact_with_node(player, pos) then + return false + end + elseif protected then + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + end + return true +end + +if minetest.get_modpath("digilines") then + dofile(modpath.."/digilines.lua") +end + +dofile(modpath.."/formspec.lua") +dofile(modpath.."/inventory.lua") +dofile(modpath.."/register.lua") +dofile(modpath.."/chests.lua") + +-- Undo all of the locked wooden chest recipes, and just make them use a padlock. +minetest.register_on_mods_loaded(function() + minetest.clear_craft({output = "default:chest_locked"}) + minetest.register_craft({ + output = "default:chest_locked", + recipe = { + { "group:wood", "group:wood", "group:wood" }, + { "group:wood", "basic_materials:padlock", "group:wood" }, + { "group:wood", "group:wood", "group:wood" } + } + }) + minetest.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = { + "default:chest", + "basic_materials:padlock" + } + }) +end) + +-- Conversion for old chests +minetest.register_lbm({ + name = "technic_chests:old_chest_conversion", + nodenames = {"group:technic_chest"}, + run_at_every_load = false, + action = function(pos, node) + -- Use `on_construct` function because that has data from register function + local def = minetest.registered_nodes[node.name] + if def and def.on_construct then + def.on_construct(pos) + end + end, +}) diff --git a/mods/technic_plus/technic_chests/inventory.lua b/mods/technic_plus/technic_chests/inventory.lua new file mode 100644 index 0000000..0f5f692 --- /dev/null +++ b/mods/technic_plus/technic_chests/inventory.lua @@ -0,0 +1,142 @@ + +-- Table to define order of type sorting +local itemtypes = { + node = 1, + tool = 2, + craft = 3, + none = 4 +} + +function technic.chests.sort_inv(inv, mode) + local list = inv:get_list("main") + if not list then return end + local items = {} + for _,stack in pairs(list) do + if not stack:is_empty() then + local name = stack:get_name() + local wear = stack:get_wear() + local meta = stack:get_metadata() + local count = stack:get_count() + local def = minetest.registered_items[name] + local itemtype = (def and itemtypes[def.type]) and def.type or "none" + local key = string.format("%s %05d %s", name, wear, meta) + if not items[key] then + items[key] = { + stacks = {stack}, + wear = wear, + count = count, + itemtype = itemtype, + key = key, + } + else + items[key].count = items[key].count + count + table.insert(items[key].stacks, stack) + end + end + end + local unique_items = {} + for k,v in pairs(items) do + table.insert(unique_items, v) + end + if mode == 1 then + -- Quantity + table.sort(unique_items, function(a, b) + if a.count ~= b.count then + return a.count > b.count + end + return a.key < b.key + end) + elseif mode == 2 then + -- Type + table.sort(unique_items, function(a, b) + if itemtypes[a.itemtype] ~= itemtypes[b.itemtype] then + return itemtypes[a.itemtype] < itemtypes[b.itemtype] + end + return a.key < b.key + end) + elseif mode == 3 then + -- Wear + table.sort(unique_items, function(a, b) + if a.itemtype == "tool" and b.itemtype == "tool" then + if a.wear ~= b.wear then + return a.wear < b.wear + end + return a.key < b.key + elseif a.itemtype == "tool" or b.itemtype == "tool" then + return a.itemtype == "tool" + end + return a.key < b.key + end) + else + -- Item + table.sort(unique_items, function(a, b) + return a.key < b.key + end) + end + inv:set_list("main", {}) + for _,item in ipairs(unique_items) do + for _,stack in ipairs(item.stacks) do + inv:add_item("main", stack) + end + end +end + +function technic.chests.get_inv_items(inv) + local list = inv:get_list("main") + if not list then return {} end + local keys = {} + for _,stack in pairs(list) do + if not stack:is_empty() then + keys[stack:get_name()] = true + end + end + local items = {} + for k,_ in pairs(keys) do + items[#items + 1] = k + end + return items +end + +function technic.chests.move_inv(from_inv, to_inv, filter) + local list = from_inv:get_list("main") + if not list then return {} end + local moved_items = {} + for i,stack in ipairs(list) do + if not stack:is_empty() then + local move_stack = false + local name = stack:get_name() + if name == filter or not filter then + move_stack = true + elseif type(filter) == "table" then + for _,k in pairs(filter) do + if name == k then + move_stack = true + break + end + end + end + if move_stack then + local leftover = to_inv:add_item("main", stack) + if not leftover:is_empty() then + from_inv:set_stack("main", i, leftover) + stack:set_count(stack:get_count() - leftover:get_count()) + else + from_inv:set_stack("main", i, "") + end + table.insert(moved_items, stack:to_table()) + end + end + end + return moved_items +end + +function technic.chests.log_inv_change(pos, name, change, items) + local spos = minetest.pos_to_string(pos) + if change == "move" then + minetest.log("action", name.." moves "..items.." in chest at "..spos) + elseif change == "put" then + minetest.log("action", name.." puts "..items.." into chest at "..spos) + elseif change == "take" then + minetest.log("action", name.." takes "..items.." from chest at "..spos) + end +end diff --git a/mods/technic_plus/technic_chests/locale/de.txt b/mods/technic_plus/technic_chests/locale/de.txt new file mode 100644 index 0000000..e22d2c2 --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/de.txt @@ -0,0 +1,41 @@ +# German Translation for technic_chests +# Deutsche Übersetzung von technic_chests +# by Xanthin + +%s Chest = %struhe +%s Locked Chest = Verschlossene %struhe +%s Locked Chest (owned by %s) = Verschlossene %struhe (gehoert %s) +Color Filter: %s = Farbfilter: %s +Edit chest description: = Bearbeite die Beschreibung + +# Colors +Black = Schwarz +Blue = Blau +Brown = Braun +Cyan = Tuerkis +Dark Green = Dunkelgruen +Dark Grey = Dunkelgrau +Green = Gruen +Grey = Grau +Magenta = Magenta +Orange = Orange +Pink = Rosa +Red = Rot +Violet = Violett +White = Weiss +Yellow = Gelb +None = Farblos + +# Materials +Copper = Kupfer +Gold = Gold +Iron = Eisen +Mithril = Mithril +Silver = Silber +Wooden = Holz + +# Sorting +Sort = +Auto-sort is %s = +Off = +On = diff --git a/mods/technic_plus/technic_chests/locale/es.txt b/mods/technic_plus/technic_chests/locale/es.txt new file mode 100644 index 0000000..ec38d3f --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/es.txt @@ -0,0 +1,39 @@ +# technic_chests translation template + +%s Chest = Cofre de %s +%s Locked Chest = Cofre de %s Bloqueado +%s Locked Chest (owned by %s) = Cofre de %s Bloqueado (propiedad de %s) +Color Filter: %s = Filtro por Color: %s +Edit chest description: = Editar la descripción del cofre + +# Colors +Black = Negro +Blue = Azul +Brown = Café +Cyan = Cian +Dark Green = Verde Oscuro +Dark Grey = Gris Oscuro +Green = Verde +Grey = Gris +Magenta = Magenta +Orange = Naranja +Pink = Rosado +Red = Rojo +Violet = Violeta +White = Blanco +Yellow = Amarillo +None = Ninguno + +# Materials +Copper = Cobre +Gold = Oro +Iron = Hierro +Mithril = Mitrilo +Silver = Plata +Wooden = Madera + +# Sorting +Sort = Ordenar +Auto-sort is %s = El orden Automático esta %s +Off = Apagado +On = Encendido diff --git a/mods/technic_plus/technic_chests/locale/fr.txt b/mods/technic_plus/technic_chests/locale/fr.txt new file mode 100644 index 0000000..58f868a --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/fr.txt @@ -0,0 +1,39 @@ +# technic_chests translation template + +%s Chest = Coffre en %s +%s Locked Chest = Coffre verrouillé en %s +%s Locked Chest (owned by %s) = Coffre verrouillé en %s (appartient à %s) +Color Filter: %s = Filtre couleur : %s +Edit chest description: = Editer la description du coffre + +# Colors +Black = Noir +Blue = Bleu +Brown = Marron +Cyan = Cyan +Dark Green = Vert foncé +Dark Grey = Gris foncé +Green = Vert +Grey = Gris +Magenta = Magenta +Orange = Orange +Pink = Rose +Red = Rouge +Violet = Violet +White = Blanc +Yellow = Jaune +None = Rien + +# Materials +Copper = cuivre +Gold = or +Iron = fer +Mithril = mithril +Silver = argent +Wooden = bois + +# Sorting +Sort = Tri +Auto-sort is %s = Tri automatique %s +Off = désactivé +On = activé diff --git a/mods/technic_plus/technic_chests/locale/pl.txt b/mods/technic_plus/technic_chests/locale/pl.txt new file mode 100644 index 0000000..ae24b5d --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/pl.txt @@ -0,0 +1,41 @@ +# Polish Translation for technic_chests +# Polskie tłumaczenie technic_chests +# by mat9117 + +%s Chest = %s Skrzynia +%s Locked Chest = %s Zamknięta skrzynia +%s Locked Chest (owned by %s) = %s Zamknięta skrzynia (należy do %s) +Color Filter: %s = Filtr kolorów: %s +Edit chest description: = Edytuj opis skrzyni + +# Colors +Black = Czarny +Blue = Niebieski +Brown = Brązowy +Cyan = Cyan +Dark Green = Ciemnozielony +Dark Grey = Ciemnoszary +Green = Zielony +Grey = Szary +Magenta = Magenta +Orange = Pomarańczowy +Pink = Różowy +Red = Czerwony +Violet = Fioletowy +White = Biały +Yellow = Żółty +None = Żaden + +# Materials +Copper = Miedziana +Gold = Złota +Iron = Żelazna +Mithril = Mithrilowa +Silver = Srebrna +Wooden = Drewniana + +# Sorting +Sort = Sortuj +Auto-sort is %s = Autosortowanie jest %s +Off = Wyłaczone +On = Włączone diff --git a/mods/technic_plus/technic_chests/locale/pt_BR.txt b/mods/technic_plus/technic_chests/locale/pt_BR.txt new file mode 100644 index 0000000..35e5845 --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/pt_BR.txt @@ -0,0 +1,41 @@ +# Braziliam portuguese translation for technic_chests +# Tradução portuguesa brasileira para technic_chests +# By Sires + +%s Chest = Baú %s +%s Locked Chest = Baú Trancado %s +%s Locked Chest (owned by %s) = Baú Trancado %s (pertence a/à %s) +Color Filter: %s = Filtro de Cor: %s +Edit chest description: = Editar descrição do baú: + +# Colors +Black = Preto +Blue = Azul +Brown = Marrom +Cyan = Ciano +Dark Green = Verde Escuro +Dark Grey = Cinza Escuro +Green = Verde +Grey = Cinza +Magenta = Magenta +Orange = Laranja +Pink = Rosa +Red = Vermelho +Violet = Violeta +White = Branco +Yellow = Amarelo +None = Nada + +# Materials +Copper = Cobre +Gold = Ouro +Iron = Ferro +Mithril = Mithril +Silver = Prata +Wooden = de Madeira + +# Sorting +Sort = Ordenar +Auto-sort is %s = Auto-ordenação está %s +Off = Desligada +On = Ligada diff --git a/mods/technic_plus/technic_chests/locale/template.txt b/mods/technic_plus/technic_chests/locale/template.txt new file mode 100644 index 0000000..4d422b2 --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/template.txt @@ -0,0 +1,39 @@ +# technic_chests translation template + +%s Chest = +%s Locked Chest = +%s Locked Chest (owned by %s) = +Color Filter: %s = +Edit chest description: = + +# Colors +Black = +Blue = +Brown = +Cyan = +Dark Green = +Dark Grey = +Green = +Grey = +Magenta = +Orange = +Pink = +Red = +Violet = +White = +Yellow = +None = + +# Materials +Copper = +Gold = +Iron = +Mithril = +Silver = +Wooden = + +# Sorting +Sort = +Auto-sort is %s = +Off = +On = diff --git a/mods/technic_plus/technic_chests/locale/tr.txt b/mods/technic_plus/technic_chests/locale/tr.txt new file mode 100644 index 0000000..1f07ce6 --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/tr.txt @@ -0,0 +1,41 @@ +# Turkish translation +# mahmutelmas06@hotmail.com +# Türkçe çeviri + +%s Chest = %s Sandık +%s Locked Chest = %s Kilitli sandık +%s Locked Chest (owned by %s) = %s Kilitli sandık (Sahibi %s) +Color Filter: %s = Renk süzgeci: %s +Edit chest description: = Sandık bilgilerini düzenle + +# Colors - Renkler +Black = Siyah +Blue = Mavi +Brown = Kahverengi +Cyan = Cam göbeği +Dark Green = Koyu yeşil +Dark Grey = Koyu gri +Green = Yeşil +Grey = Gri +Magenta = Mor +Orange = Turuncu +Pink = Pembe +Red = Kırmızı +Violet = Koyu mor +White = Beyaz +Yellow = Sarı +None = Hiç + +# Materials - Metaryeller +Copper = Bakır +Gold = Altın +Iron = Demir +Mithril = Mithril +Silver = Gümüş +Wooden = Ahşap + +# Sorting - Sıralama +Sort = Sırala +Auto-sort is %s = Otomatik sıralama %s +Off = Kapalı +On = Açık diff --git a/mods/technic_plus/technic_chests/locale/zh_CN.txt b/mods/technic_plus/technic_chests/locale/zh_CN.txt new file mode 100644 index 0000000..4e1b612 --- /dev/null +++ b/mods/technic_plus/technic_chests/locale/zh_CN.txt @@ -0,0 +1,31 @@ +%s Chest =%sÏä×Ó +%s Locked Chest =ÉÏËøµÄ%sÏä×Ó +%s Locked Chest (owned by %s) =ÉÏËøµÄ%sËøÏä×ӣ¨¹é%sËùÓУ© +Color Filter: %s =ÑÕɫɸѡÆ÷£º%s +Edit chest description: =±༭Ïä×ÓÃèÊö£º +Black =ºÚɫ +Blue =À¶ɫ +Brown =רɫ +Cyan =Çàɫ +Dark Green =ÉîÂÌɫ +Dark Grey =Éî»Òɫ +Green =ÂÌɫ +Grey =»Òɫ +Magenta =Ñóºì +Orange =³Èɫ +Pink =·ۺìɫ +Red =ºìɫ +Violet =×ÏÂÞÀ¼ɫ +White =°×ɫ +Yellow =»Æɫ +None =ûÓÐ +Copper =ͭ +Gold =»ƽð +Iron =Ìú +Mithril =ÃØÒø +Silver =Òø +Wooden =ľÖÆ +Sort =ÅÅÐò +Auto-sort is %s =×Զ¯ÅÅÐòΪ%s +Off =¹Ø +On =´ò¿ª diff --git a/mods/technic_plus/technic_chests/mod.conf b/mods/technic_plus/technic_chests/mod.conf new file mode 100644 index 0000000..e316a95 --- /dev/null +++ b/mods/technic_plus/technic_chests/mod.conf @@ -0,0 +1,3 @@ +name = technic_chests +depends = default, basic_materials +optional_depends = technic, technic_worldgen, moreores, pipeworks, protector, digilines, intllib diff --git a/mods/technic_plus/technic_chests/register.lua b/mods/technic_plus/technic_chests/register.lua new file mode 100644 index 0000000..d10ed36 --- /dev/null +++ b/mods/technic_plus/technic_chests/register.lua @@ -0,0 +1,246 @@ + +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end +--local S = minetest.get_translator("technic_chests") + +local has_pipeworks = minetest.get_modpath("pipeworks") +local has_digilines = minetest.get_modpath("digilines") +local has_protector = minetest.get_modpath("protector") + +local tube_entry = has_pipeworks and "^pipeworks_tube_connection_metallic.png" or "" +local protector_overlay = has_protector and "^protector_logo.png" or "^technic_protector_overlay.png" + +local node_groups = { + snappy = 2, + choppy = 2, + oddly_breakable_by_hand = 2, + tubedevice = 1, + tubedevice_receiver = 1, + technic_chest = 1, +} + +local node_groups_no_inv = { + snappy = 2, + choppy = 2, + oddly_breakable_by_hand = 2, + tubedevice = 1, + tubedevice_receiver = 1, + technic_chest = 1, + not_in_creative_inventory = 1, +} + +local function get_tiles(name, data, color) + local tiles = { + "technic_"..name.."_chest_top.png"..tube_entry, + "technic_"..name.."_chest_top.png"..tube_entry, + "technic_"..name.."_chest_side.png"..tube_entry, + "technic_"..name.."_chest_side.png"..tube_entry, + "technic_"..name.."_chest_side.png"..tube_entry, + "technic_"..name.."_chest_front.png" + } + if data.color and color then + tiles[6] = tiles[6].."^technic_chest_overlay_"..technic.chests.colors[color][1]..".png" + end + if data.locked then + tiles[6] = tiles[6].."^technic_"..name.."_chest_lock_overlay.png" + elseif data.protected then + tiles[6] = tiles[6]..protector_overlay + end + return tiles +end + +function technic.chests.register_chest(name, data) + local lname = name:lower() + name = S(name) + if data.digilines and not has_digilines then + data.digilines = nil + end + if data.locked then + data.node_name = "technic:"..lname.."_locked_chest" + data.description = S("%s Locked Chest"):format(name) + elseif data.protected then + data.node_name = "technic:"..lname.."_protected_chest" + data.description = S("%s Protected Chest"):format(name) + else + data.node_name = "technic:"..lname.."_chest" + data.description = S("%s Chest"):format(name) + end + data.formspec = technic.chests.get_formspec(data) + local def = { + description = data.description, + tiles = get_tiles(lname, data), + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = node_groups, + sounds = default.node_sound_wood_defaults(), + drop = data.node_name, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + if data.locked then + local owner = placer:get_player_name() or "" + meta:set_string("owner", owner) + meta:set_string("infotext", S("%s Locked Chest (owned by %s)"):format(name, owner)) + else + meta:set_string("infotext", data.description) + end + if has_pipeworks then + pipeworks.after_place(pos) + end + end, + after_dig_node = function(pos) + if has_pipeworks then + pipeworks.after_dig(pos) + end + end, + tube = { + insert_object = function(pos, node, stack) + local meta = minetest.get_meta(pos) + if data.digilines and meta:get_int("send_inject") == 1 then + technic.chests.send_digiline_message(pos, "inject", nil, {stack:to_table()}) + end + technic.chests.log_inv_change(pos, "pipeworks tube", "put", stack:get_name()) + return meta:get_inventory():add_item("main", stack) + end, + can_insert = function(pos, node, stack) + local meta = minetest.get_meta(pos) + if meta:get_int("splitstacks") == 1 then + stack = stack:peek_item(1) + end + local can_insert = meta:get_inventory():room_for_item("main", stack) + if not can_insert and data.digilines and meta:get_int("send_overflow") == 1 then + technic.chests.send_digiline_message(pos, "overflow", nil, {stack:to_table()}) + end + return can_insert + end, + remove_items = function(pos, node, stack, dir, count, list, index) + local meta = minetest.get_meta(pos) + local item = stack:take_item(count) + meta:get_inventory():set_stack(list, index, stack) + if data.digilines and meta:get_int("send_pull") == 1 then + technic.chests.send_digiline_message(pos, "pull", nil, {item:to_table()}) + end + technic.chests.log_inv_change(pos, "pipeworks tube", "take", item:get_name()) + return item + end, + input_inventory = "main", + connect_sides = {left=1, right=1, front=1, back=1, top=1, bottom=1}, + }, + on_construct = function(pos) + local inv = minetest.get_meta(pos):get_inventory() + inv:set_size("main", data.width * data.height) + if data.quickmove then + inv:set_size("quickmove", 1) + end + technic.chests.update_formspec(pos, data) + end, + can_dig = function(pos, player) + if not technic.chests.change_allowed(pos, player, data.locked, data.protected) then + return false + end + return minetest.get_meta(pos):get_inventory():is_empty("main") + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not technic.chests.change_allowed(pos, player, data.locked, data.protected) then + return 0 + end + if data.quickmove and to_list == "quickmove" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("main", from_index) + local moved_items = technic.chests.move_inv(inv, player:get_inventory(), stack:get_name()) + if data.digilines and meta:get_int("send_take") == 1 then + technic.chests.send_digiline_message(pos, "take", player, moved_items) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "take", "stuff") + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not technic.chests.change_allowed(pos, player, data.locked, data.protected) then + return 0 + end + if data.quickmove and listname == "quickmove" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local moved_items = technic.chests.move_inv(player:get_inventory(), inv, stack:get_name()) + if data.digilines and meta:get_int("send_put") == 1 then + technic.chests.send_digiline_message(pos, "put", player, moved_items) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "put", "stuff") + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not technic.chests.change_allowed(pos, player, data.locked, data.protected) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + technic.chests.log_inv_change(pos, player:get_player_name(), "move", "stuff") + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + if data.digilines and minetest.get_meta(pos):get_int("send_put") == 1 then + technic.chests.send_digiline_message(pos, "put", player, {stack:to_table()}) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "put", stack:get_name()) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + if data.digilines and minetest.get_meta(pos):get_int("send_take") == 1 then + technic.chests.send_digiline_message(pos, "take", player, {stack:to_table()}) + end + technic.chests.log_inv_change(pos, player:get_player_name(), "take", stack:get_name()) + end, + on_blast = function(pos) + if data.locked or data.protected then + return + end + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = data.node_name + minetest.remove_node(pos) + return drops + end, + on_receive_fields = technic.chests.get_receive_fields(data), + } + if data.locked then + def.on_skeleton_key_use = function(pos, player, newsecret) + -- Copied from default chests.lua + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local player_name = player:get_player_name() + if owner ~= player_name then + minetest.record_protection_violation(pos, player_name) + minetest.chat_send_player(player_name, "You do not own this chest.") + return nil + end + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + return secret, "a locked chest", owner + end + end + if data.digilines then + def.digiline = { + receptor = {}, + effector = { + action = technic.chests.digiline_effector + }, + } + end + minetest.register_node(":"..data.node_name, def) + if data.color then + for i = 1, 15 do + local colordef = {} + for k, v in pairs(def) do + colordef[k] = v + end + colordef.groups = node_groups_no_inv + colordef.tiles = get_tiles(lname, data, i) + minetest.register_node(":"..data.node_name.."_"..technic.chests.colors[i][1], colordef) + end + end +end diff --git a/mods/technic_plus/technic_chests/textures/old/technic_chest_form_bg.png b/mods/technic_plus/technic_chests/textures/old/technic_chest_form_bg.png new file mode 100644 index 0000000..74a6a3b Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_chest_form_bg.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_copper_chest_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_copper_chest_inventory.png new file mode 100644 index 0000000..2f4cb12 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_copper_chest_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_form_bg.png b/mods/technic_plus/technic_chests/textures/old/technic_form_bg.png new file mode 100644 index 0000000..74a6a3b Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_form_bg.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_gold_chest_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_gold_chest_inventory.png new file mode 100644 index 0000000..a549cbb Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_gold_chest_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_iron_chest_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_iron_chest_inventory.png new file mode 100644 index 0000000..1083795 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_iron_chest_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_main_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_main_inventory.png new file mode 100644 index 0000000..b9030b5 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_main_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_mithril_chest_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_mithril_chest_inventory.png new file mode 100644 index 0000000..a549cbb Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_mithril_chest_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_silver_chest_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_silver_chest_inventory.png new file mode 100644 index 0000000..b273cae Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_silver_chest_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/old/technic_wooden_chest_inventory.png b/mods/technic_plus/technic_chests/textures/old/technic_wooden_chest_inventory.png new file mode 100644 index 0000000..2fdc53c Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/old/technic_wooden_chest_inventory.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_checkmark_icon.png b/mods/technic_plus/technic_chests/textures/technic_checkmark_icon.png new file mode 100644 index 0000000..d0d55fd Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_checkmark_icon.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_black.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_black.png new file mode 100644 index 0000000..5a4c807 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_black.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_blue.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_blue.png new file mode 100644 index 0000000..730a35b Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_blue.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_brown.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_brown.png new file mode 100644 index 0000000..e2ffad4 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_brown.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_cyan.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_cyan.png new file mode 100644 index 0000000..1b5ae82 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_cyan.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_dark_green.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_dark_green.png new file mode 100644 index 0000000..0c257e1 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_dark_green.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_dark_grey.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_dark_grey.png new file mode 100644 index 0000000..8b62f16 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_dark_grey.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_green.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_green.png new file mode 100644 index 0000000..ffc1f83 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_green.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_grey.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_grey.png new file mode 100644 index 0000000..d56819b Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_grey.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_magenta.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_magenta.png new file mode 100644 index 0000000..36a0359 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_magenta.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_orange.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_orange.png new file mode 100644 index 0000000..7ab4245 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_orange.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_pink.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_pink.png new file mode 100644 index 0000000..2eb5e69 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_pink.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_red.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_red.png new file mode 100644 index 0000000..d8621b5 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_red.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_violet.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_violet.png new file mode 100644 index 0000000..78579aa Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_violet.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_white.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_white.png new file mode 100644 index 0000000..0794357 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_white.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_chest_overlay_yellow.png b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_yellow.png new file mode 100644 index 0000000..5e94bc9 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_chest_overlay_yellow.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton0.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton0.png new file mode 100644 index 0000000..61af482 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton0.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton1.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton1.png new file mode 100644 index 0000000..83556ef Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton1.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton10.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton10.png new file mode 100644 index 0000000..9f84d6d Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton10.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton11.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton11.png new file mode 100644 index 0000000..cf5e4c9 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton11.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton12.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton12.png new file mode 100644 index 0000000..e04032e Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton12.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton13.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton13.png new file mode 100644 index 0000000..b26007d Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton13.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton14.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton14.png new file mode 100644 index 0000000..9af3a01 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton14.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton15.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton15.png new file mode 100644 index 0000000..b670a8a Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton15.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton2.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton2.png new file mode 100644 index 0000000..a9f2622 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton2.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton3.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton3.png new file mode 100644 index 0000000..14e6318 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton3.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton4.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton4.png new file mode 100644 index 0000000..2fa4bba Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton4.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton5.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton5.png new file mode 100644 index 0000000..9db1f17 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton5.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton6.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton6.png new file mode 100644 index 0000000..fdedfa4 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton6.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton7.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton7.png new file mode 100644 index 0000000..138fef1 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton7.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton8.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton8.png new file mode 100644 index 0000000..c740315 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton8.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_colorbutton9.png b/mods/technic_plus/technic_chests/textures/technic_colorbutton9.png new file mode 100644 index 0000000..b078dc7 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_colorbutton9.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_copper_chest_front.png b/mods/technic_plus/technic_chests/textures/technic_copper_chest_front.png new file mode 100644 index 0000000..54e24da Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_copper_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_copper_chest_lock_overlay.png b/mods/technic_plus/technic_chests/textures/technic_copper_chest_lock_overlay.png new file mode 100644 index 0000000..d592403 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_copper_chest_lock_overlay.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_copper_chest_side.png b/mods/technic_plus/technic_chests/textures/technic_copper_chest_side.png new file mode 100644 index 0000000..420a84c Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_copper_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_copper_chest_top.png b/mods/technic_plus/technic_chests/textures/technic_copper_chest_top.png new file mode 100644 index 0000000..31a51ec Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_copper_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_gold_chest_front.png b/mods/technic_plus/technic_chests/textures/technic_gold_chest_front.png new file mode 100644 index 0000000..db566de Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_gold_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_gold_chest_lock_overlay.png b/mods/technic_plus/technic_chests/textures/technic_gold_chest_lock_overlay.png new file mode 100644 index 0000000..cec7369 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_gold_chest_lock_overlay.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_gold_chest_side.png b/mods/technic_plus/technic_chests/textures/technic_gold_chest_side.png new file mode 100644 index 0000000..d556c14 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_gold_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_gold_chest_top.png b/mods/technic_plus/technic_chests/textures/technic_gold_chest_top.png new file mode 100644 index 0000000..79b0367 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_gold_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_iron_chest_front.png b/mods/technic_plus/technic_chests/textures/technic_iron_chest_front.png new file mode 100644 index 0000000..b0cffb5 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_iron_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_iron_chest_lock_overlay.png b/mods/technic_plus/technic_chests/textures/technic_iron_chest_lock_overlay.png new file mode 100644 index 0000000..b740930 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_iron_chest_lock_overlay.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_iron_chest_side.png b/mods/technic_plus/technic_chests/textures/technic_iron_chest_side.png new file mode 100644 index 0000000..ecb3e82 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_iron_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_iron_chest_top.png b/mods/technic_plus/technic_chests/textures/technic_iron_chest_top.png new file mode 100644 index 0000000..248f8f6 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_iron_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_mithril_chest_front.png b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_front.png new file mode 100644 index 0000000..1cde421 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_mithril_chest_lock_overlay.png b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_lock_overlay.png new file mode 100644 index 0000000..ec5ceec Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_lock_overlay.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_mithril_chest_side.png b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_side.png new file mode 100644 index 0000000..12f6f1e Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_mithril_chest_top.png b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_top.png new file mode 100644 index 0000000..d3a66ce Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_mithril_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_pencil_icon.png b/mods/technic_plus/technic_chests/textures/technic_pencil_icon.png new file mode 100644 index 0000000..f8511c7 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_pencil_icon.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_protector_overlay.png b/mods/technic_plus/technic_chests/textures/technic_protector_overlay.png new file mode 100644 index 0000000..c6f6f51 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_protector_overlay.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_silver_chest_front.png b/mods/technic_plus/technic_chests/textures/technic_silver_chest_front.png new file mode 100644 index 0000000..e21046a Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_silver_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_silver_chest_lock_overlay.png b/mods/technic_plus/technic_chests/textures/technic_silver_chest_lock_overlay.png new file mode 100644 index 0000000..af71a01 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_silver_chest_lock_overlay.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_silver_chest_side.png b/mods/technic_plus/technic_chests/textures/technic_silver_chest_side.png new file mode 100644 index 0000000..98912ab Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_silver_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/technic_silver_chest_top.png b/mods/technic_plus/technic_chests/textures/technic_silver_chest_top.png new file mode 100644 index 0000000..773fa69 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/technic_silver_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_front.png b/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_front.png new file mode 100644 index 0000000..6d64f25 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_side.png b/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_side.png new file mode 100644 index 0000000..e20e502 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_top.png b/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_top.png new file mode 100644 index 0000000..f162215 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_copper_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_front.png b/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_front.png new file mode 100644 index 0000000..11b1f35 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_side.png b/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_side.png new file mode 100644 index 0000000..7c105de Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_top.png b/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_top.png new file mode 100644 index 0000000..fb22d62 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_gold_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_front.png b/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_front.png new file mode 100644 index 0000000..d87425a Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_side.png b/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_side.png new file mode 100644 index 0000000..5a18893 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_top.png b/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_top.png new file mode 100644 index 0000000..d81afb4 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_iron_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_front.png b/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_front.png new file mode 100644 index 0000000..2e578f6 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_side.png b/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_side.png new file mode 100644 index 0000000..7692d7b Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_top.png b/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_top.png new file mode 100644 index 0000000..e4bfbf8 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_mithril_chest_top.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_front.png b/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_front.png new file mode 100644 index 0000000..37d7cd0 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_front.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_side.png b/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_side.png new file mode 100644 index 0000000..0bdee36 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_side.png differ diff --git a/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_top.png b/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_top.png new file mode 100644 index 0000000..99103e4 Binary files /dev/null and b/mods/technic_plus/technic_chests/textures/x32/technic_silver_chest_top.png differ diff --git a/mods/technic_plus/technic_cnc/cnc.lua b/mods/technic_plus/technic_cnc/cnc.lua new file mode 100644 index 0000000..3bb9724 --- /dev/null +++ b/mods/technic_plus/technic_cnc/cnc.lua @@ -0,0 +1,299 @@ +-- Technic CNC v1.0 by kpoppel +-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck + +-- Idea: +-- Somehow have a tabbed/paged panel if the number of shapes should expand +-- beyond what is available in the panel today. +-- I could imagine some form of API allowing modders to come with their own node +-- box definitions and easily stuff it in the this machine for production. + +local S = technic_cnc.getter + +local allow_metadata_inventory_put +local allow_metadata_inventory_take +local allow_metadata_inventory_move +local can_dig +local desc_tr = S("CNC Machine") + +if technic_cnc.use_technic then + minetest.register_craft({ + output = 'technic:cnc', + recipe = { + {'default:glass', 'technic:diamond_drill_head', 'default:glass'}, + {'technic:control_logic_unit', 'technic:machine_casing', 'basic_materials:motor'}, + {'technic:carbon_steel_ingot', 'technic:lv_cable', 'technic:carbon_steel_ingot'}, + }, + }) + + allow_metadata_inventory_put = technic.machine_inventory_put + allow_metadata_inventory_take = technic.machine_inventory_take + allow_metadata_inventory_move = technic.machine_inventory_move + can_dig = technic.machine_can_dig + desc_tr = S("%s CNC Machine"):format("LV") +else + minetest.register_craft({ + output = 'technic:cnc', + recipe = { + {'default:glass', 'default:diamond', 'default:glass'}, + {'basic_materials:ic', 'default:steelblock', 'basic_materials:motor'}, + {'default:steel_ingot', 'default:mese', 'default:steel_ingot'}, + }, + }) + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() + end + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() + end + + allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return count + end + + can_dig = function(pos, player) + if player and minetest.is_protected(pos, player:get_player_name()) then return false end + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("dst") + and inv:is_empty("src") + and default.can_interact_with_node(player, pos) + end +end + +local onesize_products = { + slope = 2, + slope_edge = 1, + slope_inner_edge = 1, + pyramid = 2, + spike = 1, + cylinder = 2, + oblate_spheroid = 1, + sphere = 1, + stick = 8, + slope_upsdown = 2, + slope_edge_upsdown = 1, + slope_inner_edge_upsdown = 1, + cylinder_horizontal = 2, + slope_lying = 2, + onecurvededge = 1, + twocurvededge = 1, +} +local twosize_products = { + element_straight = 2, + element_end = 2, + element_cross = 1, + element_t = 1, + element_edge = 2, +} + +local cnc_formspec = + "size[9,11;]".. + "label[1,0;"..S("Choose Milling Program:").."]".. + "image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]".. + "image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]".. + "image_button[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]".. + "image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]".. + "image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]".. + "image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]".. + "image_button[7,0.5;1,1;technic_cnc_oblate_spheroid.png;oblate_spheroid; ]".. + "image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]".. + + "image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]".. + "image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]".. + "image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]".. + "image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]".. + "image_button[5,1.5;1,1;technic_cnc_sphere.png;sphere; ]".. + + "image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]".. + "image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]".. + "image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]".. + + "label[1,3.5;"..S("Slim Elements half / normal height:").."]".. + + "image_button[1,4;1,0.5;technic_cnc_full.png;full; ]".. + "image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]".. + "image_button[2,4;1,1;technic_cnc_element_straight.png;element_straight; ]".. + "image_button[3,4;1,1;technic_cnc_element_end.png;element_end; ]".. + "image_button[4,4;1,1;technic_cnc_element_cross.png;element_cross; ]".. + "image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]".. + "image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]".. + + "label[0, 5.5;"..S("In:").."]".. + "list[context;src;0.5,5.5;1,1;]".. + "label[4, 5.5;"..S("Out:").."]".. + "list[context;dst;5,5.5;4,1;]".. + + "list[current_player;main;0,7;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]" + +-- The form handler is declared here because we need it in both the inactive and active modes +-- in order to be able to change programs wile it is running. +local function form_handler(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + + -- REGISTER MILLING PROGRAMS AND OUTPUTS: + ------------------------------------------ + -- Program for half/full size + if fields["full"] then + meta:set_int("size", 1) + return + end + + if fields["half"] then + meta:set_int("size", 2) + return + end + + -- Resolve the node name and the number of items to make + local inv = meta:get_inventory() + local inputstack = inv:get_stack("src", 1) + local inputname = inputstack:get_name() + local multiplier + local size = meta:get_int("size") + if size < 1 then size = 1 end + + for k, _ in pairs(fields) do + -- Set a multipier for the half/full size capable blocks + if twosize_products[k] ~= nil then + multiplier = size * twosize_products[k] + else + multiplier = onesize_products[k] + end + + if onesize_products[k] ~= nil or twosize_products[k] ~= nil then + meta:set_float( "cnc_multiplier", multiplier) + meta:set_string("cnc_user", sender:get_player_name()) + end + + if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then + meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k) + --print(inputname .. "_technic_cnc_" .. k) + break + end + + if twosize_products[k] ~= nil and size==1 then + meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k .. "_double") + --print(inputname .. "_technic_cnc_" .. k .. "_double") + break + end + end + + if not technic_cnc.use_technic then + local result = meta:get_string("cnc_product") + + if not inv:is_empty("src") + and minetest.registered_nodes[result] + and inv:room_for_item("dst", result) then + local srcstack = inv:get_stack("src", 1) + srcstack:take_item() + inv:set_stack("src", 1, srcstack) + inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier")) + end + end +end + +-- Action code performing the transformation +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local eu_input = meta:get_int("LV_EU_input") + local machine_name = desc_tr + local machine_node = "technic:cnc" + local demand = 450 + + local result = meta:get_string("cnc_product") + if inv:is_empty("src") or + (not minetest.registered_nodes[result]) or + (not inv:room_for_item("dst", result)) then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Idle"):format(machine_name)) + meta:set_string("cnc_product", "") + meta:set_int("LV_EU_demand", 0) + return + end + + if eu_input < demand then + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= demand then + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_name)) + meta:set_int("src_time", meta:get_int("src_time") + 1) + if meta:get_int("src_time") >= 3 then -- 3 ticks per output + meta:set_int("src_time", 0) + local srcstack = inv:get_stack("src", 1) + srcstack:take_item() + inv:set_stack("src", 1, srcstack) + inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier")) + end + end + meta:set_int("LV_EU_demand", demand) +end + +-- The actual block inactive state +minetest.register_node(":technic:cnc", { + description = desc_tr, + tiles = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png", + "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"}, + groups = {cracky=2, technic_machine=1, technic_lv=1}, + connect_sides = {"bottom", "back", "left", "right"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", desc_tr) + meta:set_float("technic_power_machine", 1) + meta:set_string("formspec", cnc_formspec) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 4) + end, + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + on_receive_fields = form_handler, + technic_run = technic_cnc.use_technic and run, +}) + +-- Active state block +if technic_cnc.use_technic then + + minetest.register_node(":technic:cnc_active", { + description = desc_tr, + tiles = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png", + "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front_active.png"}, + groups = {cracky=2, technic_machine=1, technic_lv=1, not_in_creative_inventory=1}, + connect_sides = {"bottom", "back", "left", "right"}, + paramtype2 = "facedir", + drop = "technic:cnc", + legacy_facedir_simple = true, + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + on_receive_fields = form_handler, + technic_run = run, + technic_disabled_machine_name = "technic:cnc", + }) + + technic.register_machine("LV", "technic:cnc", technic.receiver) + technic.register_machine("LV", "technic:cnc_active", technic.receiver) +else + minetest.register_alias("technic:cnc_active", "technic:cnc") +end diff --git a/mods/technic_plus/technic_cnc/cnc_api.lua b/mods/technic_plus/technic_cnc/cnc_api.lua new file mode 100644 index 0000000..a2f70ba --- /dev/null +++ b/mods/technic_plus/technic_cnc/cnc_api.lua @@ -0,0 +1,373 @@ +-- API for the technic CNC machine +-- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck + +local S = technic_cnc.getter + +-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES: +------------------------------------------------------ + +-- Define slope boxes for the various nodes +------------------------------------------- +technic_cnc.programs = { + { suffix = "technic_cnc_stick", + model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, + desc = S("Stick") + }, + + { suffix = "technic_cnc_element_end_double", + model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, + desc = S("Element End Double") + }, + + { suffix = "technic_cnc_element_cross_double", + model = { + {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, + desc = S("Element Cross Double") + }, + + { suffix = "technic_cnc_element_t_double", + model = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}}, + desc = S("Element T Double") + }, + + { suffix = "technic_cnc_element_edge_double", + model = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, + desc = S("Element Edge Double") + }, + + { suffix = "technic_cnc_element_straight_double", + model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + desc = S("Element Straight Double") + }, + + { suffix = "technic_cnc_element_end", + model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, + desc = S("Element End") + }, + + { suffix = "technic_cnc_element_cross", + model = { + {0.3, -0.5, -0.3, 0.5, 0, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, + desc = S("Element Cross") + }, + + { suffix = "technic_cnc_element_t", + model = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + {0.3, -0.5, -0.3, 0.5, 0, 0.3}}, + desc = S("Element T") + }, + + { suffix = "technic_cnc_element_edge", + model = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, + desc = S("Element Edge") + }, + + { suffix = "technic_cnc_element_straight", + model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + desc = S("Element Straight") + }, + + { suffix = "technic_cnc_oblate_spheroid", + model = "technic_cnc_oblate_spheroid.obj", + desc = S("Oblate spheroid"), + cbox = { + type = "fixed", + fixed = { + { -6/16, 4/16, -6/16, 6/16, 8/16, 6/16 }, + { -8/16, -4/16, -8/16, 8/16, 4/16, 8/16 }, + { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 } + } + } + }, + + { suffix = "technic_cnc_sphere", + model = "technic_cnc_sphere.obj", + desc = S("Sphere") + }, + + { suffix = "technic_cnc_cylinder_horizontal", + model = "technic_cnc_cylinder_horizontal.obj", + desc = S("Horizontal Cylinder") + }, + + { suffix = "technic_cnc_cylinder", + model = "technic_cnc_cylinder.obj", + desc = S("Cylinder") + }, + + { suffix = "technic_cnc_twocurvededge", + model = "technic_cnc_two_curved_edge.obj", + desc = S("Two Curved Edge/Corner Block") + }, + + { suffix = "technic_cnc_onecurvededge", + model = "technic_cnc_one_curved_edge.obj", + desc = S("One Curved Edge Block") + }, + + { suffix = "technic_cnc_spike", + model = "technic_cnc_pyramid_spike.obj", + desc = S("Spike"), + cbox = { + type = "fixed", + fixed = { + { -2/16, 4/16, -2/16, 2/16, 8/16, 2/16 }, + { -4/16, 0, -4/16, 4/16, 4/16, 4/16 }, + { -6/16, -4/16, -6/16, 6/16, 0, 6/16 }, + { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 } + } + } + }, + + { suffix = "technic_cnc_pyramid", + model = "technic_cnc_pyramid.obj", + desc = S("Pyramid"), + cbox = { + type = "fixed", + fixed = { + { -2/16, -2/16, -2/16, 2/16, 0, 2/16 }, + { -4/16, -4/16, -4/16, 4/16, -2/16, 4/16 }, + { -6/16, -6/16, -6/16, 6/16, -4/16, 6/16 }, + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 } + } + } + }, + + { suffix = "technic_cnc_slope_inner_edge_upsdown", + model = "technic_cnc_innercorner_upsdown.obj", + desc = S("Slope Upside Down Inner Edge/Corner"), + sbox = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + cbox = { + type = "fixed", + fixed = { + { 0.25, -0.25, -0.5, 0.5, -0.5, 0.5 }, + { -0.5, -0.25, 0.25, 0.5, -0.5, 0.5 }, + { 0, 0, -0.5, 0.5, -0.25, 0.5 }, + { -0.5, 0, 0, 0.5, -0.25, 0.5 }, + { -0.25, 0.25, -0.5, 0.5, 0, -0.25 }, + { -0.5, 0.25, -0.25, 0.5, 0, 0.5 }, + { -0.5, 0.5, -0.5, 0.5, 0.25, 0.5 } + } + } + }, + + { suffix = "technic_cnc_slope_edge_upsdown", + model = "technic_cnc_outercorner_upsdown.obj", + desc = S("Slope Upside Down Outer Edge/Corner"), + cbox = { + type = "fixed", + fixed = { + { -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 }, + { -4/16, 4/16, -4/16, 8/16, 0, 8/16 }, + { 0, 0, 0, 8/16, -4/16, 8/16 }, + { 4/16, -4/16, 4/16, 8/16, -8/16, 8/16 } + } + } + }, + + { suffix = "technic_cnc_slope_inner_edge", + model = "technic_cnc_innercorner.obj", + desc = S("Slope Inner Edge/Corner"), + sbox = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + cbox = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }, + { -0.5, -0.25, -0.25, 0.5, 0, 0.5 }, + { -0.25, -0.25, -0.5, 0.5, 0, -0.25 }, + { -0.5, 0, 0, 0.5, 0.25, 0.5 }, + { 0, 0, -0.5, 0.5, 0.25, 0.5 }, + { -0.5, 0.25, 0.25, 0.5, 0.5, 0.5 }, + { 0.25, 0.25, -0.5, 0.5, 0.5, 0.5 } + } + } + }, + + { suffix = "technic_cnc_slope_edge", + model = "technic_cnc_outercorner.obj", + desc = S("Slope Outer Edge/Corner"), + cbox = { + type = "fixed", + fixed = { + { 4/16, 4/16, 4/16, 8/16, 8/16, 8/16 }, + { 0, 0, 0, 8/16, 4/16, 8/16 }, + { -4/16, -4/16, -4/16, 8/16, 0, 8/16 }, + { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 } + } + } + }, + + { suffix = "technic_cnc_slope_upsdown", + model = "technic_cnc_slope_upsdown.obj", + desc = S("Slope Upside Down"), + cbox = { + type = "fixed", + fixed = { + { -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 }, + { -8/16, 4/16, -4/16, 8/16, 0, 8/16 }, + { -8/16, 0, 0, 8/16, -4/16, 8/16 }, + { -8/16, -4/16, 4/16, 8/16, -8/16, 8/16 } + } + } + }, + + { suffix = "technic_cnc_slope_lying", + model = "technic_cnc_slope_horizontal.obj", + desc = S("Slope Lying"), + cbox = { + type = "fixed", + fixed = { + { 4/16, -8/16, 4/16, 8/16, 8/16, 8/16 }, + { 0, -8/16, 0, 4/16, 8/16, 8/16 }, + { -4/16, -8/16, -4/16, 0, 8/16, 8/16 }, + { -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 } + } + } + }, + + { suffix = "technic_cnc_slope", + model = "technic_cnc_slope.obj", + desc = S("Slope"), + cbox = { + type = "fixed", + fixed = { + { -8/16, 4/16, 4/16, 8/16, 8/16, 8/16 }, + { -8/16, 0, 0, 8/16, 4/16, 8/16 }, + { -8/16, -4/16, -4/16, 8/16, 0, 8/16 }, + { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 } + } + } + }, + +} + +-- Allow disabling certain programs for some node. Default is allowing all types for all nodes +technic_cnc.programs_disable = { + -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick + -- ... + ["default:dirt"] = {"technic_cnc_oblate_spheroid", "technic_cnc_slope_upsdown", "technic_cnc_edge", + "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown", + "technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick", + "technic_cnc_cylinder_horizontal"} +} + +-- Generic function for registering all the different node types +function technic_cnc.register_program(recipeitem, suffix, model, groups, images, description, cbox, sbox) + + local dtype + local nodeboxdef + local meshdef + + if type(model) ~= "string" then -- assume a nodebox if it's a table or function call + dtype = "nodebox" + nodeboxdef = { + type = "fixed", + fixed = model + } + else + dtype = "mesh" + meshdef = model + end + + if cbox and not sbox then sbox = cbox end + + minetest.register_node(":"..recipeitem.."_"..suffix, { + description = description, + drawtype = dtype, + node_box = nodeboxdef, + mesh = meshdef, + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + groups = groups, + selection_box = sbox, + collision_box = cbox + }) +end + +-- function to iterate over all the programs the CNC machine knows +function technic_cnc.register_all(recipeitem, groups, images, description) + for _, data in ipairs(technic_cnc.programs) do + -- Disable node creation for disabled node types for some material + local do_register = true + if technic_cnc.programs_disable[recipeitem] ~= nil then + for __, disable in ipairs(technic_cnc.programs_disable[recipeitem]) do + if disable == data.suffix then + do_register = false + end + end + end + -- Create the node if it passes the test + if do_register then + technic_cnc.register_program(recipeitem, data.suffix, data.model, + groups, images, description.." "..data.desc, data.cbox, data.sbox) + end + end +end + + +-- REGISTER NEW TECHNIC_CNC_API's PART 2: +-- technic_cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz) +------------------------------------------------------------------------------------------------------------ +function technic_cnc.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, + desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, + desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, + desc_cylinder, desc_cylinder_horizontal, desc_spheroid, desc_element_straight, desc_element_edge, + desc_element_t, desc_element_cross, desc_element_end) + + technic_cnc.register_slope(recipeitem, groups, images, desc_slope) + technic_cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying) + technic_cnc.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown) + technic_cnc.register_slope_edge(recipeitem, groups, images, desc_slope_edge) + technic_cnc.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge) + technic_cnc.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge) + technic_cnc.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge) + technic_cnc.register_pyramid(recipeitem, groups, images, desc_pyramid) + technic_cnc.register_spike(recipeitem, groups, images, desc_spike) + technic_cnc.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge) + technic_cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge) + technic_cnc.register_cylinder(recipeitem, groups, images, desc_cylinder) + technic_cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal) + technic_cnc.register_spheroid(recipeitem, groups, images, desc_spheroid) + technic_cnc.register_element_straight(recipeitem, groups, images, desc_element_straight) + technic_cnc.register_element_edge(recipeitem, groups, images, desc_element_edge) + technic_cnc.register_element_t(recipeitem, groups, images, desc_element_t) + technic_cnc.register_element_cross(recipeitem, groups, images, desc_element_cross) + technic_cnc.register_element_end(recipeitem, groups, images, desc_element_end) +end + +-- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz) +------------------------------------------------------------------------------------------------------------ +function technic_cnc.register_stick_etc(recipeitem, groups, images, desc_stick) + technic_cnc.register_stick(recipeitem, groups, images, desc_stick) +end + +function technic_cnc.register_elements(recipeitem, groups, images, desc_element_straight_double, + desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double) + technic_cnc.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double) + technic_cnc.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double) + technic_cnc.register_element_t_double(recipeitem, groups, images, desc_element_t_double) + technic_cnc.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double) + technic_cnc.register_element_end_double(recipeitem, groups, images, desc_element_end_double) +end + diff --git a/mods/technic_plus/technic_cnc/cnc_materials.lua b/mods/technic_plus/technic_cnc/cnc_materials.lua new file mode 100644 index 0000000..9894ebe --- /dev/null +++ b/mods/technic_plus/technic_cnc/cnc_materials.lua @@ -0,0 +1,415 @@ +-- REGISTER MATERIALS AND PROPERTIES FOR NONCUBIC ELEMENTS: +----------------------------------------------------------- + +local S = technic_cnc.getter + +-- DIRT +------- +technic_cnc.register_all("default:dirt", + {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + {"default_dirt.png"}, + S("Dirt")) +-- (DIRT WITH) GRASS +-------------------- +technic_cnc.register_all("default:dirt_with_grass", + {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + {"default_grass.png"}, + S("Grassy dirt")) +-- WOOD +------- +technic_cnc.register_all("default:wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"default_wood.png"}, + S("Wooden")) + +technic_cnc.register_all("default:junglewood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"default_junglewood.png"}, + S("Junglewood")) + +technic_cnc.register_all("default:pine_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"default_pine_wood.png"}, + S("Pine")) + +technic_cnc.register_all("default:acacia_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"default_acacia_wood.png"}, + S("Acacia")) + +technic_cnc.register_all("default:aspen_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"default_aspen_wood.png"}, + S("Aspen")) + +-- STONE +-------- +technic_cnc.register_all("default:stone", + {cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_stone.png"}, + S("Stone")) + +technic_cnc.register_all("default:stonebrick", + {crumbly=2, cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_stone_brick.png"}, + S("Stone Brick")) + +technic_cnc.register_all("default:stone_block", + {crumbly=2, cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_stone_block.png"}, + S("Stone Block")) + + +technic_cnc.register_all("default:desert_stone", + {cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_desert_stone.png"}, + S("Desert Stone")) + +technic_cnc.register_all("default:desert_stonebrick", + {crumbly=2, cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_desert_stone_brick.png"}, + S("Desert Stone Brick")) + +technic_cnc.register_all("default:desert_stone_block", + {crumbly=2, cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_desert_stone_block.png"}, + S("Desert Stone Block")) + +-- COBBLE +--------- +technic_cnc.register_all("default:cobble", + {cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_cobble.png"}, + S("Cobble")) + +technic_cnc.register_all("default:mossycobble", + {cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_mossycobble.png"}, + S("Mossy Cobblestone")) + +technic_cnc.register_all("default:desert_cobble", + {cracky=3, stone=1, not_in_creative_inventory=1}, + {"default_desert_cobble.png"}, + S("Desert Cobble")) + +-- BRICK +-------- +technic_cnc.register_all("default:brick", + {cracky=3, not_in_creative_inventory=1}, + {"default_brick.png"}, + S("Brick")) + +-- SANDSTONE +------------ +technic_cnc.register_all("default:sandstone", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_sandstone.png"}, + S("Sandstone")) + +technic_cnc.register_all("default:sandstonebrick", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_sandstone_brick.png"}, + S("Sandstone Brick")) + +technic_cnc.register_all("default:sandstone_block", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_sandstone_block.png"}, + S("Sandstone Block")) + + +technic_cnc.register_all("default:desert_sandstone", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_desert_sandstone.png"}, + S("Desert Sandstone")) + +technic_cnc.register_all("default:desert_sandstone_brick", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_desert_sandstone_brick.png"}, + S("Desert Sandstone Brick")) + +technic_cnc.register_all("default:desert_sandstone_block", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_desert_sandstone_block.png"}, + S("Desert Sandstone Block")) + + +technic_cnc.register_all("default:silver_sandstone", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_silver_sandstone.png"}, + S("Silver Sandstone")) + +technic_cnc.register_all("default:silver_sandstone_brick", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_silver_sandstone_brick.png"}, + S("Silver Sandstone Brick")) + +technic_cnc.register_all("default:silver_sandstone_block", + {crumbly=2, cracky=3, not_in_creative_inventory=1}, + {"default_silver_sandstone_block.png"}, + S("Silver Sandstone Block")) + + + + +-- LEAVES +--------- +technic_cnc.register_all("default:leaves", + {snappy=2, choppy=2, oddly_breakable_by_hand=3, not_in_creative_inventory=1}, + {"default_leaves.png"}, + S("Leaves")) + +-- TREE +------- +technic_cnc.register_all("default:tree", + {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, wood=1, not_in_creative_inventory=1}, + {"default_tree.png"}, + S("Tree")) + +-- ICE +------- +technic_cnc.register_all("default:ice", + {cracky=3, puts_out_fire=1, cools_lava=1, not_in_creative_inventory=1}, + {"default_ice.png"}, + S("Ice")) + + +-- OBSIDIAN +----------- +technic_cnc.register_all("default:obsidian_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"default_obsidian_block.png"}, + S("Obsidian")) + + +-- WROUGHT IRON +--------------- +technic_cnc.register_all("default:steelblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"technic_wrought_iron_block.png"}, + S("Wrought Iron")) + +-- Bronze +-------- +technic_cnc.register_all("default:bronzeblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"default_bronze_block.png"}, + S("Bronze")) + +-- Zinc +-------- +technic_cnc.register_all("technic:zinc_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"technic_zinc_block.png"}, + S("Zinc")) + +local steeltex = "default_steel_block.png" +local steelname = "Steel" + +-- Cast Iron +------------ +technic_cnc.register_all("technic:cast_iron_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"technic_cast_iron_block.png"}, + S("Cast Iron")) + +if technic_cnc.technic_modpath then + steeltex = "technic_wrought_iron_block.png" + steelname = "Wrought Iron" + + -- Stainless Steel + -------- + technic_cnc.register_all("technic:stainless_steel_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"technic_stainless_steel_block.png"}, + S("Stainless Steel")) + + -- Marble + ------------ + technic_cnc.register_all("technic:marble", + {cracky=3, not_in_creative_inventory=1}, + {"technic_marble.png"}, + S("Marble")) + + -- Granite + ------------ + technic_cnc.register_all("technic:granite", + {cracky=1, not_in_creative_inventory=1}, + {"technic_granite.png"}, + S("Granite")) + + -- Blast-resistant concrete + --------------------------- + + technic_cnc.register_all("technic:blast_resistant_concrete", + {cracky=2, level=2, not_in_creative_inventory=1}, + {"technic_blast_resistant_concrete_block.png"}, + S("Blast-resistant concrete")) +end + +technic_cnc.register_all("default:steelblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {steeltex}, + S(steelname)) + +-- CONCRETE AND CEMENT +---------------------- + +technic_cnc.register_all("basic_materials:concrete_block", + {cracky=2, level=2, not_in_creative_inventory=1}, + {"basic_materials_concrete_block.png"}, + S("Concrete")) + +technic_cnc.register_all("basic_materials:cement_block", + {cracky=2, level=2, not_in_creative_inventory=1}, + {"basic_materials_cement_block.png"}, + S("Cement")) + +technic_cnc.register_all("basic_materials:brass_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"basic_materials_brass_block.png"}, + S("Brass block")) +-- Brass +-------- +technic_cnc.register_all("technic:brass_block", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"basic_materials_brass_block.png"}, + S("Brass")) + +-- Copper +--------- +technic_cnc.register_all("default:copperblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"default_copper_block.png"}, + S("Copper")) + +-- Tin +------ +technic_cnc.register_all("default:tinblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"default_tin_block.png"}, + S("Tin")) + +-- Gold +------- +technic_cnc.register_all("default:goldblock", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"default_gold_block.png"}, + S("Gold")) + + + + +if minetest.get_modpath("ethereal") then + -- Glostone + ------------ + technic_cnc.register_all("ethereal:glostone", + {cracky=1, not_in_creative_inventory=1, light_source=13}, + {"glostone.png"}, + S("Glo Stone")) + + -- Crystal block + ---------------- + technic_cnc.register_all("ethereal:crystal_block", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"crystal_block.png"}, + S("Crystal")) + + -- Misc. Wood types + ------------------- + technic_cnc.register_all("ethereal:banana_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"banana_wood.png"}, + S("Banana Wood")) + + technic_cnc.register_all("ethereal:birch_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"moretrees_birch_wood.png"}, + S("Birch Wood")) + + technic_cnc.register_all("ethereal:frost_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"frost_wood.png"}, + S("Frost Wood")) + + technic_cnc.register_all("ethereal:palm_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"moretrees_palm_wood.png"}, + S("Palm Wood")) + + technic_cnc.register_all("ethereal:willow_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"willow_wood.png"}, + S("Willow Wood")) + + technic_cnc.register_all("ethereal:yellow_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"yellow_wood.png"}, + S("Healing Tree Wood")) + + technic_cnc.register_all("ethereal:redwood_wood", + {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + {"redwood_wood.png"}, + S("Redwood")) +end + + +if minetest.get_modpath("moreblocks") then + -- Tiles + ------------ + technic_cnc.register_all("moreblocks:stone_tile", + {stone=1, cracky=3, not_in_creative_inventory=1}, + {"moreblocks_stone_tile.png"}, + S("Stone Tile")) + + technic_cnc.register_all("moreblocks:split_stone_tile", + {stone=1, cracky=3, not_in_creative_inventory=1}, + {"moreblocks_split_stone_tile.png"}, + S("Split Stone Tile")) + + technic_cnc.register_all("moreblocks:checker_stone_tile", + {stone=1, cracky=3, not_in_creative_inventory=1}, + {"moreblocks_checker_stone_tile.png"}, + S("Checker Stone Tile")) + + technic_cnc.register_all("moreblocks:cactus_checker", + {stone=1, cracky=3, not_in_creative_inventory=1}, + {"moreblocks_cactus_checker.png"}, + S("Cactus Checker")) + + -- Bricks + ------------ + technic_cnc.register_all("moreblocks:cactus_brick", + {cracky=3, not_in_creative_inventory=1}, + {"moreblocks_cactus_brick.png"}, + S("Cactus Brick")) + + technic_cnc.register_all("moreblocks:grey_bricks", + {cracky=3, not_in_creative_inventory=1}, + {"moreblocks_grey_bricks.png"}, + S("Grey Bricks")) + + -- Metals + ------------ + technic_cnc.register_all("moreblocks:copperpatina", + {cracky=1, level=2, not_in_creative_inventory=1}, + {"moreblocks_copperpatina.png"}, + S("Copper Patina")) + + -- Clay + ------------ + technic_cnc.register_all("bakedclay:red", + {cracky=3, not_in_creative_inventory=1}, + {"baked_clay_red.png"}, + S("Red Clay")) + + technic_cnc.register_all("bakedclay:orange", + {cracky=3, not_in_creative_inventory=1}, + {"baked_clay_orange.png"}, + S("Orange Clay")) + + technic_cnc.register_all("bakedclay:grey", + {cracky=3, not_in_creative_inventory=1}, + {"baked_clay_grey.png"}, + S("Grey Clay")) + +end diff --git a/mods/technic_plus/technic_cnc/depends.txt b/mods/technic_plus/technic_cnc/depends.txt new file mode 100644 index 0000000..bdaa161 --- /dev/null +++ b/mods/technic_plus/technic_cnc/depends.txt @@ -0,0 +1,3 @@ +default +basic_materials +technic? diff --git a/mods/technic_plus/technic_cnc/init.lua b/mods/technic_plus/technic_cnc/init.lua new file mode 100644 index 0000000..12b67af --- /dev/null +++ b/mods/technic_plus/technic_cnc/init.lua @@ -0,0 +1,33 @@ +local modpath = minetest.get_modpath("technic_cnc") + +technic_cnc = {} + +technic_cnc.technic_modpath = minetest.get_modpath("technic") + +technic_cnc.use_technic = technic_cnc.technic_modpath + and minetest.settings:get_bool("technic_cnc_use_technic") ~= false + +if rawget(_G, "intllib") then + technic_cnc.getter = intllib.Getter() +else + technic_cnc.getter = function(s, a, ...) + if a == nil then + return s + end + a = {a, ...} + return s:gsub( + "(@?)@(%(?)(%d+)(%)?)", + function(e, o, n, c) + if e == "" then + return a[tonumber(n)] .. (o == "" and c or "") + else + return "@" .. o .. n .. c + end + end + ) + end +end + +dofile(modpath.."/cnc.lua") +dofile(modpath.."/cnc_api.lua") +dofile(modpath.."/cnc_materials.lua") diff --git a/mods/technic_plus/technic_cnc/locale/de.txt b/mods/technic_plus/technic_cnc/locale/de.txt new file mode 100644 index 0000000..8b4e5ff --- /dev/null +++ b/mods/technic_plus/technic_cnc/locale/de.txt @@ -0,0 +1,36 @@ +## CNC +CNC Machine = CNC-Maschine +%s CNC Machine = %s CNC-Maschine +Cylinder = Zylinder +Element Cross = Halbes Kreuzelement +Element Cross Double = Kreuzelement +Element Edge = Halbes Eckelement +Element Edge Double = Eckelement +Element End = Halbes Endelement +Element End Double = Endelement +Element Straight = Halbes aufrechtes Element +Element Straight Double = Aufrechtes Element +Element T = Halbes T-Element +Element T Double = T-Element +Horizontal Cylinder = Liegender Zylinder +One Curved Edge Block = Block mit einer abgerundeten Kante +Pyramid = Pyramide +Slope = Schraege +Slope Edge = Schraege mit Ecke +Slope Inner Edge = Schraege mit Innenecke +Slope Lying = Liegende Schraege +Slope Upside Down = Umgedrehte Schraege +Slope Upside Down Edge = Umgedrehte Schraege mit Ecke +Slope Upside Down Inner Edge = Umgedrehte Schraege mit Innenecke +Sphere = Kugel +Spike = Spitze +Stick = Stange +Two Curved Edge Block = Block mit zwei abgerundeten Kanten +Brick = Ziegel: +Cobble = Pflasterstein: +Dirt = Erde: +Leaves = Laub: +Sandstone = Sandstein: +Stone = Stein: +Tree = Baumstamm: +Wooden = Holz: diff --git a/mods/technic_plus/technic_cnc/locale/es.txt b/mods/technic_plus/technic_cnc/locale/es.txt new file mode 100644 index 0000000..f18fdfa --- /dev/null +++ b/mods/technic_plus/technic_cnc/locale/es.txt @@ -0,0 +1,35 @@ +## CNC +CNC Machine = Maquina CNC +%s CNC Machine = Maquina CNC %s +Element Edge = Elemento Borde +Tree = Arbol +Element Cross Double = Elemento Cruz Doble +Spike = Pica +Element Edge Double = Elemento Borde Doble +Two Curved Edge Block = Dos Bloques de Borde Curvados +Pyramid = Piramide +Slope Upside Down Inner Edge = Borde Interno de Rampa Al Reves +Slope Upside Down Edge = Borde de Rampa Al Reves +Element Straight Double = Elemento Doble Recto +Sphere = Esfera +Element End Double = Doble Fin de Elemento +Element Straight = Recta de Elemento +Horizontal Cylinder = Cilindro Horizontal +Slope Inner Edge = Borde Interno de Rampa +One Curved Edge Block = Un Bloque de Borde Curvado +Element Cross = Cruce de Elementos +Stick = Varita +Element End = Fin de Elemento +Slope Lying = Rampa en Reposo +Slope Upside Down = Rampa Al Reves +Slope Edge = Borde de Rampa +Slope = Rampa +Element T = Elemento T +Cylinder = Cilindro +Cobble = Adoquines +Stone = Piedra +Brick = Ladrillo +Dirt = Tierra +Sandstone = Arenisca +Wooden = Madera +Leaves = Hojas diff --git a/mods/technic_plus/technic_cnc/locale/it.txt b/mods/technic_plus/technic_cnc/locale/it.txt new file mode 100644 index 0000000..e50fd74 --- /dev/null +++ b/mods/technic_plus/technic_cnc/locale/it.txt @@ -0,0 +1,36 @@ +## CNC +CNC Machine = Tornio CNC +%s CNC Machine = Tornio CNC %s +Cylinder = Cilindro +Element Cross = Elemento a croce +Element Cross Double = Elemento a croce doppio +Element Edge = Elemento bordo +Element Edge Double = Elemento bordo doppio +Element End = Elemento finale +Element End Double = Elemento finale doppio +Element Straight = Elemento dritto +Element Straight Double = Elemento dritto doppio +Element T = Elemento a T +Element T Double = Elemento a T doppio +Horizontal Cylinder = Cilindro orizzontale +One Curved Edge Block = Blocco con bordo curvo +Pyramid = Piramide +Slope = Inclinato +Slope Edge = Bordo inclinato +Slope Inner Edge = Bordo interno inclinato +Slope Lying = Pendenza bugiarda +Slope Upside Down = Pendenza capovolta +Slope Upside Down Edge = Bordo inclinato capovolto +Slope Upside Down Inner Edge = Bordo interno inclinato capovolto +Sphere = Sfera +Spike = Spuntone +Stick = Bastone +Two Curved Edge Block = Blocco con bordo a doppia curva +Brick = Mattone +Cobble = Ciottolato +Dirt = Terra +Leaves = Foglie +Sandstone = Arenaria +Stone = Pietra +Tree = Albero +Wooden = Legno diff --git a/mods/technic_plus/technic_cnc/locale/pl.txt b/mods/technic_plus/technic_cnc/locale/pl.txt new file mode 100644 index 0000000..76cc200 --- /dev/null +++ b/mods/technic_plus/technic_cnc/locale/pl.txt @@ -0,0 +1,36 @@ +## CNC +CNC Machine = Obrabiarka CNC +%s CNC Machine = %s Obrabiarka CNC +Cylinder = Walec +Element Cross = Część krzyżowa +Element Cross Double = Podwójna część krzyżowa +Element Edge = Krawędź części +Element Edge Double = Podwójna krawędź części +Element End = Końcowa część +Element End Double = Podwójna końcowa część +Element Straight = Prosta część +Element Straight Double = Podwójna prosta część +Element T = Część T +Element T Double = Podwójna część T +Horizontal Cylinder = Poziomy walec +One Curved Edge Block = Blok z zagiętą krawędzią +Pyramid = Ostrosłup +Slope = Spad +Slope Edge = Krawędź spadu +Slope Inner Edge = Wewnętrzna krawędź spadu +Slope Lying = Leżący spad +Slope Upside Down = Odwrócony spad +Slope Upside Down Edge = Krawędź odwróconego spadu +Slope Upside Down Inner Edge = Wewnętrzna krawędz odwróconego spadu +Sphere = Kula +Spike = Kolec +Stick = Patyk +Two Curved Edge Block = Blok z dwoma zagiętymi krawędziami +Brick = Cegła +Cobble = Bruk +Dirt = Ziemia +Leaves = Liście +Sandstone = Piaskowiec +Stone = Kamień +Tree = Drzewo +Wooden = Drewniany diff --git a/mods/technic_plus/technic_cnc/locale/template.txt b/mods/technic_plus/technic_cnc/locale/template.txt new file mode 100644 index 0000000..bf3cb08 --- /dev/null +++ b/mods/technic_plus/technic_cnc/locale/template.txt @@ -0,0 +1,36 @@ +## CNC +CNC Machine = +%s CNC Machine = +Cylinder = +Element Cross = +Element Cross Double = +Element Edge = +Element Edge Double = +Element End = +Element End Double = +Element Straight = +Element Straight Double = +Element T = +Element T Double = +Horizontal Cylinder = +One Curved Edge Block = +Pyramid = +Slope = +Slope Edge = +Slope Inner Edge = +Slope Lying = +Slope Upside Down = +Slope Upside Down Edge = +Slope Upside Down Inner Edge = +Sphere = +Spike = +Stick = +Two Curved Edge Block = +Brick = +Cobble = +Dirt = +Leaves = +Sandstone = +Stone = +Tree = +Wooden = diff --git a/mods/technic_plus/technic_cnc/locale/zh_CN.txt b/mods/technic_plus/technic_cnc/locale/zh_CN.txt new file mode 100644 index 0000000..9a68649 --- /dev/null +++ b/mods/technic_plus/technic_cnc/locale/zh_CN.txt @@ -0,0 +1,35 @@ +CNC Machine =Êý¿ػú´² +%s CNC Machine =%sÊý¿ػú´² +Cylinder =ԲÖù +Element Cross =ԪËؽ»²æ +Element Cross Double =ԪËؽ»²æ˫¾«¶È +Element Edge =ԪËرßԵ +Element Edge Double =ԪËرßԵ˫ +Element End =ԪËؽáÊø +Element End Double =˫¶ËԪ¼þ +Element Straight =ֱÏßԪËØ +Element Straight Double =ԪËØֱÏß˫¾«¶È +Element T =ԪËØT +Element T Double =ԪËØT˫ +Horizontal Cylinder =ÎÔʽԲͲ +One Curved Edge Block =һ¸öÇú±߿é +Pyramid =½ð×ÖËþ +Slope =Æ¶È +Slope Edge =бÆ±ßԵ +Slope Inner Edge =бÆÂÄڱßԵ +Slope Lying =бÆÂʽ +Slope Upside Down =µ¹ÆÂ +Slope Upside Down Edge =бÆµ¹Àâ +Slope Upside Down Inner Edge =бÆÂÉÏÏÂÄÚԵ +Sphere =ÇòÌå +Spike =¼â·å +Stick =¹÷×Ó +Two Curved Edge Block =˫Íä±߿é +Brick =ש +Cobble =ÂÑʯ +Dirt =ÄàÍÁ +Leaves =Ê÷Ҷ +Sandstone =ɰÑÒ +Stone =ʯͷ +Tree =Ê÷ +Wooden =ľÖÆ diff --git a/mods/technic_plus/technic_cnc/mod.conf b/mods/technic_plus/technic_cnc/mod.conf new file mode 100644 index 0000000..4e0f940 --- /dev/null +++ b/mods/technic_plus/technic_cnc/mod.conf @@ -0,0 +1,3 @@ +name = technic_cnc +depends = default, basic_materials +optional_depends = technic diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_cylinder.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_cylinder.obj new file mode 100644 index 0000000..2622347 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_cylinder.obj @@ -0,0 +1,238 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_cylinder_onetexture.blend' +# www.blender.org +o Cylinder_Cylinder.001 +v 0.000000 -0.500000 -0.500000 +v 0.000000 0.500000 -0.500000 +v 0.097545 -0.500000 -0.490393 +v 0.097545 0.500000 -0.490393 +v 0.191342 -0.500000 -0.461940 +v 0.191342 0.500000 -0.461940 +v 0.277785 -0.500000 -0.415735 +v 0.277785 0.500000 -0.415735 +v 0.353553 -0.500000 -0.353554 +v 0.353553 0.500000 -0.353554 +v 0.415735 -0.500000 -0.277785 +v 0.415735 0.500000 -0.277785 +v 0.461940 -0.500000 -0.191342 +v 0.461940 0.500000 -0.191342 +v 0.490393 -0.500000 -0.097545 +v 0.490393 0.500000 -0.097545 +v 0.500000 -0.500000 -0.000000 +v 0.500000 0.500000 -0.000000 +v 0.490393 -0.500000 0.097545 +v 0.490393 0.500000 0.097545 +v 0.461940 -0.500000 0.191341 +v 0.461940 0.500000 0.191341 +v 0.415735 -0.500000 0.277785 +v 0.415735 0.500000 0.277785 +v 0.353553 -0.500000 0.353553 +v 0.353553 0.500000 0.353553 +v 0.277785 -0.500000 0.415735 +v 0.277785 0.500000 0.415735 +v 0.191342 -0.500000 0.461940 +v 0.191342 0.500000 0.461940 +v 0.097545 -0.500000 0.490392 +v 0.097545 0.500000 0.490392 +v -0.000000 -0.500000 0.500000 +v -0.000000 0.500000 0.500000 +v -0.097545 -0.500000 0.490392 +v -0.097545 0.500000 0.490392 +v -0.191342 -0.500000 0.461939 +v -0.191342 0.500000 0.461939 +v -0.277785 -0.500000 0.415734 +v -0.277785 0.500000 0.415734 +v -0.353554 -0.500000 0.353553 +v -0.353554 0.500000 0.353553 +v -0.415735 -0.500000 0.277785 +v -0.415735 0.500000 0.277785 +v -0.461940 -0.500000 0.191341 +v -0.461940 0.500000 0.191341 +v -0.490393 -0.500000 0.097545 +v -0.490393 0.500000 0.097545 +v -0.500000 -0.500000 -0.000001 +v -0.500000 0.500000 -0.000001 +v -0.490393 -0.500000 -0.097546 +v -0.490393 0.500000 -0.097546 +v -0.461940 -0.500000 -0.191342 +v -0.461940 0.500000 -0.191342 +v -0.415734 -0.500000 -0.277786 +v -0.415734 0.500000 -0.277786 +v -0.353553 -0.500000 -0.353554 +v -0.353553 0.500000 -0.353554 +v -0.277785 -0.500000 -0.415735 +v -0.277785 0.500000 -0.415735 +v -0.191341 -0.500000 -0.461940 +v -0.191341 0.500000 -0.461940 +v -0.097544 -0.500000 -0.490393 +v -0.097544 0.500000 -0.490393 +vt 0.499996 0.999997 +vt 0.499995 0.000005 +vt 0.562495 0.000004 +vt 0.562496 0.999997 +vt 0.624995 0.000003 +vt 0.624997 0.999997 +vt 0.687496 0.000002 +vt 0.687497 0.999998 +vt 0.749997 0.000001 +vt 0.749997 0.999998 +vt 0.812497 0.000001 +vt 0.812497 0.999998 +vt 0.874997 -0.000000 +vt 0.874997 0.999998 +vt 0.937498 -0.000000 +vt 0.937498 0.999998 +vt 0.999998 -0.000000 +vt 0.999998 0.999998 +vt 0.000005 0.999997 +vt 0.000001 0.000024 +vt 0.062500 0.000023 +vt 0.062505 0.999996 +vt 0.124999 0.000021 +vt 0.125004 0.999996 +vt 0.187498 0.000020 +vt 0.187503 0.999995 +vt 0.249997 0.000018 +vt 0.250003 0.999994 +vt 0.312497 0.000017 +vt 0.312502 0.999994 +vt 0.374997 0.000015 +vt 0.375002 0.999993 +vt 0.437496 0.000014 +vt 0.437501 0.999993 +vt 0.402487 0.009601 +vt 0.597576 0.009614 +vt 0.691371 0.038072 +vt 0.777811 0.084282 +vt 0.853576 0.146469 +vt 0.915753 0.222242 +vt 0.961953 0.308689 +vt 0.990399 0.402487 +vt 1.000000 0.500033 +vt 0.990386 0.597577 +vt 0.961928 0.691370 +vt 0.915717 0.777811 +vt 0.853531 0.853575 +vt 0.777758 0.915753 +vt 0.691312 0.961952 +vt 0.597514 0.990398 +vt 0.402424 0.990386 +vt 0.308630 0.961928 +vt 0.222188 0.915717 +vt 0.146424 0.853531 +vt 0.084248 0.777759 +vt 0.038049 0.691313 +vt 0.009602 0.597515 +vt 0.000000 0.499970 +vt 0.009614 0.402425 +vt 0.038073 0.308630 +vt 0.084283 0.222189 +vt 0.146470 0.146424 +vt 0.222243 0.084248 +vt 0.308689 0.038048 +vt 0.499927 0.999999 +vt 0.084226 0.777725 +vt 0.000000 0.499927 +vt 0.222277 0.084224 +vt 0.500074 0.000000 +vt 0.915777 0.222279 +vt 1.000000 0.500077 +vt 0.777724 0.915775 +vn 0.000000 -0.685700 -0.727900 +vn 0.000000 0.685700 -0.727900 +vn 0.142000 0.685700 -0.713900 +vn 0.142000 -0.685700 -0.713900 +vn 0.278500 0.685700 -0.672500 +vn 0.278500 -0.685700 -0.672500 +vn 0.404400 0.685700 -0.605200 +vn 0.404400 -0.685700 -0.605200 +vn 0.514700 0.685700 -0.514700 +vn 0.514700 -0.685700 -0.514700 +vn 0.605200 0.685700 -0.404400 +vn 0.605200 -0.685700 -0.404400 +vn 0.672500 0.685700 -0.278500 +vn 0.672500 -0.685700 -0.278500 +vn 0.713900 0.685700 -0.142000 +vn 0.713900 -0.685700 -0.142000 +vn 0.727900 0.685700 0.000000 +vn 0.727900 -0.685700 0.000000 +vn 0.713900 0.685700 0.142000 +vn 0.713900 -0.685700 0.142000 +vn 0.672500 0.685700 0.278500 +vn 0.672500 -0.685700 0.278500 +vn 0.605200 0.685700 0.404400 +vn 0.605200 -0.685700 0.404400 +vn 0.514700 0.685700 0.514700 +vn 0.514700 -0.685700 0.514700 +vn 0.404400 0.685700 0.605200 +vn 0.404400 -0.685700 0.605200 +vn 0.278500 0.685700 0.672500 +vn 0.278500 -0.685700 0.672500 +vn 0.142000 0.685700 0.713900 +vn 0.142000 -0.685700 0.713900 +vn 0.000000 0.685700 0.727900 +vn 0.000000 -0.685700 0.727900 +vn -0.142000 0.685700 0.713900 +vn -0.142000 -0.685700 0.713900 +vn -0.278500 0.685700 0.672500 +vn -0.278500 -0.685700 0.672500 +vn -0.404400 0.685700 0.605200 +vn -0.404400 -0.685700 0.605200 +vn -0.514700 0.685700 0.514700 +vn -0.514700 -0.685700 0.514700 +vn -0.605200 0.685700 0.404400 +vn -0.605200 -0.685700 0.404400 +vn -0.672500 0.685700 0.278500 +vn -0.672500 -0.685700 0.278500 +vn -0.713900 0.685700 0.142000 +vn -0.713900 -0.685700 0.142000 +vn -0.727900 0.685700 0.000000 +vn -0.727900 -0.685700 0.000000 +vn -0.713900 0.685700 -0.142000 +vn -0.713900 -0.685700 -0.142000 +vn -0.672500 0.685700 -0.278500 +vn -0.672500 -0.685700 -0.278500 +vn -0.605200 0.685700 -0.404400 +vn -0.605200 -0.685700 -0.404400 +vn -0.514700 0.685700 -0.514700 +vn -0.514700 -0.685700 -0.514700 +vn -0.404400 0.685700 -0.605200 +vn -0.404400 -0.685700 -0.605200 +vn -0.278500 0.685700 -0.672500 +vn -0.278500 -0.685700 -0.672500 +vn -0.142000 0.685700 -0.713900 +vn -0.142000 -0.685700 -0.713900 +s 1 +f 1/1/1 2/2/2 4/3/3 3/4/4 +f 3/4/4 4/3/3 6/5/5 5/6/6 +f 5/6/6 6/5/5 8/7/7 7/8/8 +f 7/8/8 8/7/7 10/9/9 9/10/10 +f 9/10/10 10/9/9 12/11/11 11/12/12 +f 11/12/12 12/11/11 14/13/13 13/14/14 +f 13/14/14 14/13/13 16/15/15 15/16/16 +f 15/16/16 16/15/15 18/17/17 17/18/18 +f 17/19/18 18/20/17 20/21/19 19/22/20 +f 19/22/20 20/21/19 22/23/21 21/24/22 +f 21/24/22 22/23/21 24/25/23 23/26/24 +f 23/26/24 24/25/23 26/27/25 25/28/26 +f 25/28/26 26/27/25 28/29/27 27/30/28 +f 27/30/28 28/29/27 30/31/29 29/32/30 +f 29/32/30 30/31/29 32/33/31 31/34/32 +f 31/34/32 32/33/31 34/2/33 33/1/34 +f 33/1/34 34/2/33 36/3/35 35/4/36 +f 35/4/36 36/3/35 38/5/37 37/6/38 +f 37/6/38 38/5/37 40/7/39 39/8/40 +f 39/8/40 40/7/39 42/9/41 41/10/42 +f 41/10/42 42/9/41 44/11/43 43/12/44 +f 43/12/44 44/11/43 46/13/45 45/14/46 +f 45/14/46 46/13/45 48/15/47 47/16/48 +f 47/16/48 48/15/47 50/17/49 49/18/50 +f 49/19/50 50/20/49 52/21/51 51/22/52 +f 51/22/52 52/21/51 54/23/53 53/24/54 +f 53/24/54 54/23/53 56/25/55 55/26/56 +f 55/26/56 56/25/55 58/27/57 57/28/58 +f 57/28/58 58/27/57 60/29/59 59/30/60 +f 59/30/60 60/29/59 62/31/61 61/32/62 +f 4/35/3 2/2/2 64/36/63 62/37/61 60/38/59 58/39/57 56/40/55 54/41/53 52/42/51 50/43/49 48/44/47 46/45/45 44/46/43 42/47/41 40/48/39 38/49/37 36/50/35 34/1/33 32/51/31 30/52/29 28/53/27 26/54/25 24/55/23 22/56/21 20/57/19 18/58/17 16/59/15 14/60/13 12/61/11 10/62/9 8/63/7 6/64/5 +f 63/34/64 64/33/63 2/2/2 1/1/1 +f 61/32/62 62/31/61 64/33/63 63/34/64 +f 1/65/1 3/51/4 5/52/6 7/53/8 9/54/10 11/66/12 13/56/14 15/57/16 17/67/18 19/59/20 21/60/22 23/61/24 25/62/26 27/68/28 29/64/30 31/35/32 33/69/34 35/36/36 37/37/38 39/38/40 41/39/42 43/70/44 45/41/46 47/42/48 49/71/50 51/44/52 53/45/54 55/46/56 57/47/58 59/72/60 61/49/62 63/50/64 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_cylinder_horizontal.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_cylinder_horizontal.obj new file mode 100644 index 0000000..d00b1d6 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_cylinder_horizontal.obj @@ -0,0 +1,238 @@ +# Blender v2.73 (sub 0) OBJ File: 'technic-cylinder-horizontal.blend' +# www.blender.org +o Cylinder_Cylinder.001 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.097545 -0.490393 +v -0.500000 0.097545 -0.490393 +v 0.500000 0.191342 -0.461940 +v -0.500000 0.191342 -0.461940 +v 0.500000 0.277785 -0.415735 +v -0.500000 0.277785 -0.415735 +v 0.500000 0.353553 -0.353553 +v -0.500000 0.353553 -0.353554 +v 0.500000 0.415735 -0.277785 +v -0.500000 0.415735 -0.277785 +v 0.500000 0.461940 -0.191342 +v -0.500000 0.461940 -0.191342 +v 0.500000 0.490393 -0.097545 +v -0.500000 0.490393 -0.097545 +v 0.500000 0.500000 -0.000000 +v -0.500000 0.500000 -0.000000 +v 0.500000 0.490393 0.097545 +v -0.500000 0.490393 0.097545 +v 0.500000 0.461940 0.191342 +v -0.500000 0.461940 0.191341 +v 0.500000 0.415735 0.277785 +v -0.500000 0.415735 0.277785 +v 0.500000 0.353553 0.353553 +v -0.500000 0.353553 0.353553 +v 0.500000 0.277785 0.415735 +v -0.500000 0.277785 0.415735 +v 0.500000 0.191342 0.461940 +v -0.500000 0.191342 0.461940 +v 0.500000 0.097545 0.490393 +v -0.500000 0.097545 0.490392 +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v 0.500000 -0.097546 0.490392 +v -0.500000 -0.097545 0.490392 +v 0.500000 -0.191342 0.461940 +v -0.500000 -0.191342 0.461939 +v 0.500000 -0.277785 0.415734 +v -0.500000 -0.277785 0.415734 +v 0.500000 -0.353554 0.353553 +v -0.500000 -0.353554 0.353553 +v 0.500000 -0.415735 0.277785 +v -0.500000 -0.415735 0.277785 +v 0.500000 -0.461940 0.191341 +v -0.500000 -0.461940 0.191341 +v 0.500000 -0.490393 0.097545 +v -0.500000 -0.490393 0.097544 +v 0.500000 -0.500000 -0.000001 +v -0.500000 -0.500000 -0.000001 +v 0.500000 -0.490393 -0.097546 +v -0.500000 -0.490393 -0.097546 +v 0.500000 -0.461940 -0.191342 +v -0.500000 -0.461940 -0.191343 +v 0.500000 -0.415734 -0.277786 +v -0.500000 -0.415734 -0.277786 +v 0.500000 -0.353553 -0.353554 +v -0.500000 -0.353553 -0.353554 +v 0.500000 -0.277785 -0.415735 +v -0.500000 -0.277784 -0.415735 +v 0.500000 -0.191341 -0.461940 +v -0.500000 -0.191341 -0.461940 +v 0.500000 -0.097544 -0.490393 +v -0.500000 -0.097544 -0.490393 +vt 0.000003 0.499996 +vt 0.999995 0.499995 +vt 0.999996 0.562495 +vt 0.000002 0.562496 +vt 0.999997 0.624995 +vt 0.000003 0.624996 +vt 0.999998 0.687496 +vt 0.000002 0.687496 +vt 0.999999 0.749997 +vt 0.000002 0.749996 +vt 0.999999 0.812497 +vt 0.000002 0.812497 +vt 1.000000 0.874997 +vt 0.000001 0.874997 +vt 1.000000 0.937498 +vt 0.000001 0.937497 +vt 1.000000 0.999998 +vt 0.000001 0.999998 +vt 0.000003 0.000005 +vt 0.999976 0.000001 +vt 0.999977 0.062500 +vt 0.000003 0.062505 +vt 0.999978 0.124999 +vt 0.000004 0.125004 +vt 0.999980 0.187498 +vt 0.000005 0.187503 +vt 0.999982 0.249997 +vt 0.000005 0.250003 +vt 0.999983 0.312497 +vt 0.000006 0.312502 +vt 0.999985 0.374997 +vt 0.000007 0.375001 +vt 0.999986 0.437496 +vt 0.000007 0.437501 +vt 0.009601 0.597512 +vt 0.009614 0.402424 +vt 0.038072 0.308628 +vt 0.084283 0.222189 +vt 0.146469 0.146424 +vt 0.222242 0.084247 +vt 0.308689 0.038047 +vt 0.402487 0.009601 +vt 0.500033 -0.000000 +vt 0.597577 0.009613 +vt 0.691371 0.038072 +vt 0.777811 0.084283 +vt 0.853575 0.146469 +vt 0.915753 0.222242 +vt 0.961952 0.308688 +vt 0.990398 0.402486 +vt 0.990386 0.597576 +vt 0.961928 0.691370 +vt 0.915717 0.777812 +vt 0.853531 0.853576 +vt 0.777759 0.915752 +vt 0.691313 0.961951 +vt 0.597515 0.990398 +vt 0.499970 1.000000 +vt 0.402425 0.990386 +vt 0.308630 0.961927 +vt 0.222189 0.915717 +vt 0.146424 0.853530 +vt 0.084248 0.777757 +vt 0.038048 0.691311 +vt 0.999999 0.500073 +vt 0.777724 0.915774 +vt 0.499927 0.999999 +vt 0.084224 0.777723 +vt 0.000000 0.499925 +vt 0.222279 0.084223 +vt 0.500078 -0.000000 +vt 0.915775 0.222276 +vn 0.685700 0.000000 -0.727900 +vn -0.685700 0.000000 -0.727900 +vn -0.685700 0.142000 -0.713900 +vn 0.685700 0.142000 -0.713900 +vn -0.685700 0.278500 -0.672500 +vn 0.685700 0.278500 -0.672500 +vn -0.685700 0.404400 -0.605200 +vn 0.685700 0.404400 -0.605200 +vn -0.685700 0.514700 -0.514700 +vn 0.685700 0.514700 -0.514700 +vn -0.685700 0.605200 -0.404400 +vn 0.685700 0.605200 -0.404400 +vn -0.685700 0.672500 -0.278500 +vn 0.685700 0.672500 -0.278500 +vn -0.685700 0.713900 -0.142000 +vn 0.685700 0.713900 -0.142000 +vn -0.685700 0.727900 0.000000 +vn 0.685700 0.727900 0.000000 +vn -0.685700 0.713900 0.142000 +vn 0.685700 0.713900 0.142000 +vn -0.685700 0.672500 0.278500 +vn 0.685700 0.672500 0.278500 +vn -0.685700 0.605200 0.404400 +vn 0.685700 0.605200 0.404400 +vn -0.685700 0.514700 0.514700 +vn 0.685700 0.514700 0.514700 +vn -0.685700 0.404400 0.605200 +vn 0.685700 0.404400 0.605200 +vn -0.685700 0.278500 0.672500 +vn 0.685700 0.278500 0.672500 +vn -0.685700 0.142000 0.713900 +vn 0.685700 0.142000 0.713900 +vn -0.685700 0.000000 0.727900 +vn 0.685700 0.000000 0.727900 +vn -0.685700 -0.142000 0.713900 +vn 0.685700 -0.142000 0.713900 +vn -0.685700 -0.278500 0.672500 +vn 0.685700 -0.278500 0.672500 +vn -0.685700 -0.404400 0.605200 +vn 0.685700 -0.404400 0.605200 +vn -0.685700 -0.514700 0.514700 +vn 0.685700 -0.514700 0.514700 +vn -0.685700 -0.605200 0.404400 +vn 0.685700 -0.605200 0.404400 +vn -0.685700 -0.672500 0.278500 +vn 0.685700 -0.672500 0.278500 +vn -0.685700 -0.713900 0.142000 +vn 0.685700 -0.713900 0.142000 +vn -0.685700 -0.727900 0.000000 +vn 0.685700 -0.727900 0.000000 +vn -0.685700 -0.713900 -0.142000 +vn 0.685700 -0.713900 -0.142000 +vn -0.685700 -0.672500 -0.278500 +vn 0.685700 -0.672500 -0.278500 +vn -0.685700 -0.605200 -0.404400 +vn 0.685700 -0.605200 -0.404400 +vn -0.685700 -0.514700 -0.514700 +vn 0.685700 -0.514700 -0.514700 +vn -0.685700 -0.404400 -0.605200 +vn 0.685700 -0.404400 -0.605200 +vn -0.685700 -0.278500 -0.672500 +vn 0.685700 -0.278500 -0.672500 +vn -0.685700 -0.142000 -0.713900 +vn 0.685700 -0.142000 -0.713900 +s 1 +f 1/1/1 2/2/2 4/3/3 3/4/4 +f 3/4/4 4/3/3 6/5/5 5/6/6 +f 5/6/6 6/5/5 8/7/7 7/8/8 +f 7/8/8 8/7/7 10/9/9 9/10/10 +f 9/10/10 10/9/9 12/11/11 11/12/12 +f 11/12/12 12/11/11 14/13/13 13/14/14 +f 13/14/14 14/13/13 16/15/15 15/16/16 +f 15/16/16 16/15/15 18/17/17 17/18/18 +f 17/19/18 18/20/17 20/21/19 19/22/20 +f 19/22/20 20/21/19 22/23/21 21/24/22 +f 21/24/22 22/23/21 24/25/23 23/26/24 +f 23/26/24 24/25/23 26/27/25 25/28/26 +f 25/28/26 26/27/25 28/29/27 27/30/28 +f 27/30/28 28/29/27 30/31/29 29/32/30 +f 29/32/30 30/31/29 32/33/31 31/34/32 +f 31/34/32 32/33/31 34/2/33 33/1/34 +f 33/1/34 34/2/33 36/3/35 35/4/36 +f 35/4/36 36/3/35 38/5/37 37/6/38 +f 37/6/38 38/5/37 40/7/39 39/8/40 +f 39/8/40 40/7/39 42/9/41 41/10/42 +f 41/10/42 42/9/41 44/11/43 43/12/44 +f 43/12/44 44/11/43 46/13/45 45/14/46 +f 45/14/46 46/13/45 48/15/47 47/16/48 +f 47/16/48 48/15/47 50/17/49 49/18/50 +f 49/19/50 50/20/49 52/21/51 51/22/52 +f 51/22/52 52/21/51 54/23/53 53/24/54 +f 53/24/54 54/23/53 56/25/55 55/26/56 +f 55/26/56 56/25/55 58/27/57 57/28/58 +f 57/28/58 58/27/57 60/29/59 59/30/60 +f 59/30/60 60/29/59 62/31/61 61/32/62 +f 4/35/3 2/1/2 64/36/63 62/37/61 60/38/59 58/39/57 56/40/55 54/41/53 52/42/51 50/43/49 48/44/47 46/45/45 44/46/43 42/47/41 40/48/39 38/49/37 36/50/35 34/2/33 32/51/31 30/52/29 28/53/27 26/54/25 24/55/23 22/56/21 20/57/19 18/58/17 16/59/15 14/60/13 12/61/11 10/62/9 8/63/7 6/64/5 +f 63/34/64 64/33/63 2/2/2 1/1/1 +f 61/32/62 62/31/61 64/33/63 63/34/64 +f 1/65/1 3/51/4 5/52/6 7/53/8 9/54/10 11/66/12 13/56/14 15/57/16 17/67/18 19/59/20 21/60/22 23/61/24 25/62/26 27/68/28 29/64/30 31/35/32 33/69/34 35/36/36 37/37/38 39/38/40 41/39/42 43/70/44 45/41/46 47/42/48 49/71/50 51/44/52 53/45/54 55/46/56 57/47/58 59/72/60 61/49/62 63/50/64 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_innercorner.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_innercorner.obj new file mode 100644 index 0000000..c962aeb --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_innercorner.obj @@ -0,0 +1,33 @@ +# Blender v2.73 (sub 0) OBJ File: 'technic-icorner.blend' +# www.blender.org +o Cube_Cube.000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.707100 0.707100 -0.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn -1.000000 -0.000000 -0.000000 +vn 0.000000 0.707100 -0.707100 +s off +f 6/1/1 1/2/1 7/3/1 8/4/1 +f 2/1/2 5/3/2 3/4/2 +f 2/1/3 1/2/3 5/4/3 +f 6/2/4 8/3/4 9/4/4 +f 9/1/5 8/2/5 7/3/5 3/4/5 +f 3/3/6 7/4/6 1/1/6 2/2/6 +f 1/1/7 6/2/7 9/3/7 +l 1 4 +l 3 4 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_innercorner_upsdown.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_innercorner_upsdown.obj new file mode 100644 index 0000000..68eb560 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_innercorner_upsdown.obj @@ -0,0 +1,33 @@ +# Blender v2.73 (sub 0) OBJ File: 'technic-icorner-upsdown.blend' +# www.blender.org +o Cube_Cube.000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn -0.000000 -0.707100 -0.707100 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.707100 -0.707100 -0.000000 +s off +f 6/1/1 1/2/1 7/3/1 8/4/1 +f 2/1/2 5/3/2 3/4/2 +f 2/1/3 1/2/3 5/4/3 +f 6/2/4 8/3/4 9/4/4 +f 9/1/5 8/2/5 7/3/5 3/4/5 +f 3/3/6 7/4/6 1/1/6 2/2/6 +f 1/1/7 6/2/7 9/3/7 +l 1 4 +l 3 4 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_oblate_spheroid.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_oblate_spheroid.obj new file mode 100644 index 0000000..e949f5b --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_oblate_spheroid.obj @@ -0,0 +1,300 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_blob_onetexture.blend' +# www.blender.org +o Cube +v 0.213679 -0.450000 -0.213679 +v -0.213679 -0.450000 0.213680 +v 0.213680 -0.450000 0.213680 +v -0.213679 -0.450000 -0.213679 +v 0.213679 0.450000 -0.213679 +v -0.213679 0.450000 -0.213679 +v 0.213679 0.450000 0.213680 +v 0.500000 -0.000003 0.500000 +v 0.277785 -0.415735 0.277785 +v -0.277785 -0.415735 0.277785 +v 0.353553 -0.353554 0.353553 +v -0.353553 -0.353554 0.353553 +v -0.500000 -0.000002 0.500000 +v 0.415735 -0.277786 0.415735 +v -0.277785 0.415735 0.277785 +v 0.277785 0.415735 0.277785 +v -0.415735 -0.277785 0.415735 +v 0.353554 0.353553 0.353554 +v -0.500000 -0.000002 -0.499983 +v 0.461940 -0.191342 0.461940 +v -0.461940 -0.191342 0.461940 +v -0.353553 0.353553 0.353554 +v 0.490393 -0.097546 0.490393 +v 0.500000 -0.000002 -0.500000 +v 0.490393 0.097545 -0.490392 +v 0.490393 0.097545 0.490393 +v -0.490393 -0.097546 0.490393 +v 0.490393 -0.097545 -0.490393 +v 0.461940 0.191341 0.461940 +v -0.461940 0.191341 0.461940 +v 0.461940 0.191342 -0.461940 +v -0.490393 0.097545 0.490393 +v 0.415735 0.277785 0.415735 +v -0.490393 0.097545 -0.490392 +v -0.415735 0.277785 0.415735 +v 0.461940 -0.191341 -0.461940 +v 0.415735 0.277785 -0.415735 +v -0.461940 0.191341 -0.461940 +v -0.415735 0.277785 -0.415735 +v 0.415735 -0.277785 -0.415735 +v -0.490393 -0.097546 -0.490392 +v 0.353553 0.353553 -0.353553 +v -0.213679 0.450000 0.213680 +v -0.353553 0.353553 -0.353553 +v 0.277785 0.415735 -0.277785 +v -0.461940 -0.191342 -0.461939 +v 0.353554 -0.353553 -0.353554 +v -0.277785 0.415735 -0.277785 +v -0.415735 -0.277785 -0.415734 +v 0.277786 -0.415735 -0.277785 +v -0.353553 -0.353554 -0.353553 +v -0.277785 -0.415735 -0.277784 +vt 0.038487 0.679029 +vt 0.010047 0.589789 +vt 0.990397 0.589790 +vt 0.915772 0.767073 +vt 0.084671 0.767071 +vt 0.961957 0.679029 +vt 0.852473 0.146294 +vt 0.914576 0.232749 +vt 0.084146 0.232744 +vt 0.712776 0.000003 +vt 0.221926 0.061588 +vt 0.285951 0.000000 +vt 0.285945 0.999818 +vt 0.221920 0.938229 +vt 0.712771 0.999818 +vt 0.009578 0.589789 +vt 0.989138 0.589792 +vt 0.960721 0.679031 +vt 0.286638 0.000000 +vt 0.777884 0.061589 +vt 0.222561 0.061589 +vt 0.777608 0.938229 +vt 0.222164 0.938229 +vt 0.146413 0.853527 +vt 0.286255 0.999818 +vt 0.713517 0.999818 +vt 0.776800 0.061592 +vt 0.146251 0.146290 +vt 0.000000 0.499907 +vt 0.989139 0.410032 +vt 0.998734 0.499910 +vt 0.853618 0.146291 +vt 0.915772 0.232746 +vt 0.146826 0.146290 +vt 0.961957 0.320789 +vt 0.084672 0.232745 +vt 0.990397 0.410029 +vt 0.038487 0.320789 +vt 0.776796 0.938230 +vt 0.777790 0.938229 +vt 0.146467 0.853526 +vt 0.853556 0.853527 +vt 0.146825 0.853526 +vt 1.000000 0.499907 +vt 0.010047 0.410028 +vt 0.146246 0.853527 +vt 0.222559 0.938228 +vt 0.777882 0.938230 +vt 0.915737 0.767073 +vt 0.084287 0.767072 +vt 0.038083 0.679029 +vt 0.961941 0.679029 +vt 0.037995 0.679029 +vt 0.960723 0.320792 +vt 0.037998 0.320787 +vt 0.009580 0.410028 +vt 0.990167 0.589790 +vt 0.999772 0.499909 +vt 0.961721 0.679029 +vt 0.084246 0.767072 +vt 0.915526 0.767072 +vt 0.853359 0.853527 +vt 0.914573 0.767074 +vt 0.084142 0.767072 +vt 0.852470 0.853528 +vt 0.777609 0.061590 +vt 0.853360 0.146293 +vt 0.222166 0.061589 +vt 0.146414 0.146291 +vt 0.915527 0.232748 +vt 0.084247 0.232746 +vt 0.961721 0.320791 +vt 0.038052 0.320789 +vt 0.990167 0.410031 +vt 0.713686 0.999818 +vt 0.749950 0.250050 +vt 0.749950 0.749950 +vt 0.250050 0.749950 +vt 0.250050 0.250050 +vt 0.713807 0.000000 +vt 0.286258 0.000000 +vt 0.713519 0.000001 +vt 0.250050 0.250050 +vt 0.749950 0.250050 +vt 0.749950 0.749950 +vt 0.286636 0.999817 +vt 0.777791 0.061589 +vt 0.146467 0.146291 +vt 0.084287 0.232745 +vt 0.915737 0.232746 +vt 0.961941 0.320789 +vt 0.000444 0.499907 +vt 0.713687 0.000000 +vt 0.713805 0.999818 +vn -0.620400 0.479600 0.620400 +vn -0.683900 0.254100 0.683900 +vn 0.683900 0.254100 0.683900 +vn 0.531000 0.660300 0.531000 +vn -0.531000 0.660300 0.531000 +vn 0.620400 0.479600 0.620400 +vn -0.429700 -0.794100 0.429700 +vn -0.531000 -0.660300 0.531000 +vn -0.531000 -0.660300 -0.531000 +vn -0.185700 -0.964900 0.185700 +vn -0.325800 -0.887500 -0.325800 +vn -0.185700 -0.964900 -0.185700 +vn -0.185700 0.964900 -0.185700 +vn -0.325800 0.887500 -0.325800 +vn -0.185700 0.964900 0.185700 +vn -0.683900 0.254000 -0.683900 +vn 0.325800 -0.887500 0.325800 +vn -0.325800 -0.887500 0.325800 +vn 0.325800 0.887500 -0.325800 +vn 0.429700 0.794100 -0.429700 +vn 0.185700 0.964900 -0.185700 +vn -0.429700 -0.794100 -0.429700 +vn -0.707100 0.000000 -0.707100 +vn -0.683900 -0.254100 0.683900 +vn -0.707100 0.000000 0.707100 +vn 0.429700 -0.794100 0.429700 +vn 0.531000 -0.660300 0.531000 +vn 0.620400 -0.479600 0.620400 +vn 0.683900 -0.254100 0.683900 +vn -0.620400 -0.479600 0.620400 +vn -0.325800 0.887500 0.325800 +vn 0.185700 0.964900 0.185700 +vn 0.325800 0.887500 0.325800 +vn 0.429700 0.794100 0.429700 +vn -0.429700 0.794100 0.429700 +vn 0.707100 0.000000 0.707100 +vn -0.429700 0.794100 -0.429700 +vn 0.531000 0.660300 -0.531000 +vn 0.683900 0.254100 -0.683900 +vn 0.707100 0.000000 -0.707100 +vn 0.620400 0.479600 -0.620400 +vn -0.620400 0.479600 -0.620400 +vn -0.620400 -0.479600 -0.620400 +vn -0.683900 -0.254000 -0.683900 +vn 0.683900 -0.254100 -0.683900 +vn -0.531000 0.660300 -0.531000 +vn 0.325800 -0.887500 -0.325800 +vn 0.429700 -0.794100 -0.429700 +vn 0.531000 -0.660300 -0.531000 +vn 0.620400 -0.479600 -0.620400 +vn 0.185700 -0.964900 -0.185700 +vn 0.185700 -0.964900 0.185700 +s 1 +f 30/1/1 32/2/2 26/3/3 +f 33/4/4 35/5/5 29/6/6 +f 12/7/7 17/8/8 49/9/9 +f 2/10/10 52/11/11 4/12/12 +f 6/13/13 48/14/14 43/15/15 +f 34/16/16 32/17/2 30/18/1 +f 2/19/10 9/20/17 10/21/18 +f 48/22/14 45/23/19 42/24/20 +f 5/25/21 45/23/19 6/26/13 +f 10/27/18 12/7/7 51/28/22 +f 19/29/23 27/30/24 13/31/25 +f 9/20/17 11/32/26 10/21/18 +f 11/32/26 14/33/27 12/34/7 +f 14/33/27 20/35/28 17/36/8 +f 20/35/28 23/37/29 21/38/30 +f 43/15/15 48/14/14 15/39/31 +f 7/25/32 16/23/33 45/40/19 +f 18/41/34 42/42/20 45/40/19 +f 29/6/6 30/1/1 26/3/3 +f 22/43/35 33/4/4 18/42/34 +f 26/3/3 32/2/2 8/44/36 +f 8/44/36 27/45/24 23/37/29 +f 11/32/26 12/34/7 10/21/18 +f 14/33/27 17/36/8 12/34/7 +f 20/35/28 21/38/30 17/36/8 +f 23/37/29 27/45/24 21/38/30 +f 10/27/18 52/11/11 2/10/10 +f 15/39/31 48/14/14 44/46/37 +f 22/43/35 35/5/5 33/4/4 +f 15/47/31 22/43/35 16/48/33 +f 37/49/38 42/42/20 18/41/34 +f 33/50/4 29/51/6 37/49/38 +f 8/29/36 25/3/39 26/16/3 +f 24/44/40 25/3/39 8/29/36 +f 29/51/6 26/16/3 31/52/41 +f 26/16/3 25/3/39 31/52/41 +f 29/51/6 31/52/41 37/49/38 +f 38/53/42 34/16/16 30/18/1 +f 19/29/23 32/17/2 34/16/16 +f 13/31/25 32/17/2 19/29/23 +f 17/8/8 21/54/30 46/55/43 +f 21/54/30 27/30/24 41/56/44 +f 8/29/36 28/37/45 24/44/40 +f 34/57/16 25/16/39 19/58/23 +f 38/59/42 31/51/41 34/57/16 +f 31/51/41 25/16/39 34/57/16 +f 37/60/38 38/59/42 39/61/46 +f 37/60/38 31/51/41 38/59/42 +f 44/62/37 42/24/20 37/60/38 +f 38/53/42 30/18/1 35/63/5 +f 39/64/46 35/63/5 22/65/35 +f 52/66/11 51/67/22 50/68/47 +f 51/67/22 47/69/48 50/68/47 +f 51/67/22 49/70/9 47/69/48 +f 49/70/9 40/71/49 47/69/48 +f 49/70/9 46/72/43 40/71/49 +f 46/72/43 36/73/50 40/71/49 +f 19/58/23 28/56/45 41/74/44 +f 46/72/43 41/74/44 36/73/50 +f 41/74/44 28/56/45 36/73/50 +f 22/43/35 18/42/34 16/48/33 +f 5/75/21 7/25/32 45/40/19 +f 2/76/10 4/77/12 1/78/51 3/79/52 +f 44/62/37 48/22/14 42/24/20 +f 35/5/5 30/1/1 29/6/6 +f 3/80/52 9/20/17 2/19/10 +f 45/23/19 48/22/14 6/26/13 +f 1/81/51 52/66/11 50/68/47 +f 39/61/46 44/62/37 37/60/38 +f 52/66/11 1/81/51 4/82/12 +f 24/29/40 28/56/45 19/58/23 +f 7/78/32 5/83/21 6/84/13 43/85/15 +f 24/29/40 19/58/23 25/16/39 +f 15/47/31 16/48/33 43/86/15 +f 22/65/35 44/46/37 39/64/46 +f 39/64/46 38/53/42 35/63/5 +f 41/56/44 27/30/24 19/29/23 +f 46/55/43 21/54/30 41/56/44 +f 49/9/9 17/8/8 46/55/43 +f 51/28/22 12/7/7 49/9/9 +f 52/11/11 10/27/18 51/28/22 +f 9/68/17 50/87/47 11/88/26 +f 50/87/47 47/32/48 11/88/26 +f 11/88/26 47/32/48 14/89/27 +f 47/32/48 40/90/49 14/89/27 +f 14/89/27 40/90/49 20/73/28 +f 40/90/49 36/91/50 20/73/28 +f 23/56/29 28/37/45 8/29/36 +f 20/73/28 36/91/50 23/56/29 +f 36/91/50 28/37/45 23/56/29 +f 13/92/25 8/44/36 32/2/2 +f 50/87/47 9/68/17 1/93/51 +f 13/92/25 27/45/24 8/44/36 +f 16/23/33 18/41/34 45/40/19 +f 22/65/35 15/39/31 44/46/37 +f 9/68/17 3/81/52 1/93/51 +f 33/50/4 37/49/38 18/41/34 +f 43/86/15 16/48/33 7/94/32 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_one_curved_edge.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_one_curved_edge.obj new file mode 100644 index 0000000..bb82040 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_one_curved_edge.obj @@ -0,0 +1,132 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_onetexture.blend' +# www.blender.org +o Cylinder +v -0.500000 0.490393 -0.097545 +v 0.500000 0.490393 -0.097545 +v -0.500000 0.461940 -0.191342 +v 0.500000 0.461940 -0.191342 +v -0.500000 0.415735 -0.277785 +v 0.500000 0.415735 -0.277785 +v -0.500000 0.353553 -0.353553 +v 0.500000 0.353553 -0.353553 +v -0.500000 0.277785 -0.415735 +v 0.500000 0.277785 -0.415735 +v -0.500000 0.191342 -0.461940 +v 0.500000 0.191342 -0.461940 +v -0.500000 0.097545 -0.490393 +v 0.500000 0.097545 -0.490393 +v 0.500000 -0.000000 -0.500000 +v 0.500000 0.490393 -0.097545 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.500000 -0.000000 +v 0.500000 0.500000 0.000000 +v -0.500000 0.490393 -0.097545 +v -0.500000 0.461940 -0.191342 +v -0.500000 0.415735 -0.277785 +v -0.500000 0.353553 -0.353553 +v -0.500000 0.277785 -0.415735 +v -0.500000 0.191342 -0.461940 +v -0.500000 0.097545 -0.490393 +v -0.500000 0.000000 0.000000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.500000 -0.000000 +v 0.500000 0.461940 -0.191342 +v 0.500000 0.415735 -0.277785 +v 0.500000 0.353553 -0.353553 +v 0.500000 0.277785 -0.415735 +v 0.500000 0.191342 -0.461940 +v 0.500000 0.097545 -0.490393 +v 0.500000 -0.000000 -0.500000 +v 0.500000 -0.000000 -0.000000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.000000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.500001 0.500000 +vt 0.500001 1.000000 +vt 0.000003 1.000000 +vt 0.000003 0.000000 +vt 0.597546 0.990393 +vt 0.691342 0.961940 +vt 1.000000 1.000000 +vt 0.990393 0.597545 +vt 0.961940 0.691341 +vt 0.777786 0.915735 +vt 0.853554 0.853553 +vt 0.915735 0.777785 +vt 0.146446 0.853552 +vt 0.084265 0.777783 +vt 0.038060 0.691340 +vt 0.308658 0.961938 +vt 0.222214 0.915733 +vt 0.000000 0.499999 +vt 0.402454 0.990391 +vt 0.009607 0.597544 +vt 1.000000 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 1.000000 0.250000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 0.000000 0.750000 +vt 1.000000 0.750000 +vt 0.000000 0.625000 +vt 1.000000 0.625000 +vn 1.000000 -0.000000 0.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.980800 -0.195100 +vn 0.000000 0.923900 -0.382700 +vn -0.000000 0.831500 -0.555600 +vn -0.000000 0.707100 -0.707100 +vn -0.000000 0.555600 -0.831500 +vn -0.000000 0.382700 -0.923900 +vn -0.000000 0.195100 -0.980800 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 0.998800 -0.049100 +vn -0.000000 0.049100 -0.998800 +vn -0.000000 0.000000 -1.000000 +s off +f 46/1/1 44/2/1 45/3/1 49/4/1 48/5/1 47/6/1 +f 16/7/1 49/4/1 45/3/1 38/8/1 +f 55/5/2 53/6/2 54/1/2 56/9/2 +f 43/10/1 42/11/1 45/3/1 44/2/1 +f 39/12/1 38/8/1 45/3/1 40/13/1 +f 41/14/1 40/13/1 45/3/1 42/11/1 +f 50/9/3 51/5/3 52/6/3 17/1/3 +f 28/15/4 29/16/4 30/17/4 32/3/4 +f 26/18/4 27/19/4 28/15/4 32/3/4 +f 35/9/4 37/4/4 32/3/4 36/20/4 34/6/4 33/1/4 +f 37/4/4 25/21/4 26/18/4 32/3/4 +f 30/17/4 31/22/4 36/20/4 32/3/4 +s 1 +f 1/23/5 2/24/5 4/25/6 3/26/6 +f 3/26/6 4/25/6 6/27/7 5/28/7 +f 5/28/7 6/27/7 8/6/8 7/1/8 +f 7/9/8 8/5/8 10/29/9 9/30/9 +f 9/30/9 10/29/9 12/31/10 11/32/10 +f 11/32/10 12/31/10 14/33/11 13/34/11 +f 21/5/12 24/20/13 23/2/13 20/9/12 +f 13/34/11 14/33/11 15/20/14 22/2/14 +f 23/2/13 24/20/13 2/24/5 1/23/5 +f 18/1/15 22/2/14 15/20/14 19/6/15 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_outercorner.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_outercorner.obj new file mode 100644 index 0000000..60ccae6 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_outercorner.obj @@ -0,0 +1,23 @@ +# Blender v2.73 (sub 0) OBJ File: 'technic-ocorner.blend' +# www.blender.org +o Cube_Cube.002 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 -0.000000 0.000000 +vn -0.000000 0.707100 -0.707100 +vn 0.707100 0.707100 -0.000000 +s off +f 3/1/1 2/2/1 4/3/1 5/4/1 +f 1/2/2 3/3/2 5/4/2 +f 1/1/3 2/3/3 3/4/3 +f 1/1/4 4/3/4 2/4/4 +f 1/2/5 5/3/5 4/4/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_outercorner_upsdown.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_outercorner_upsdown.obj new file mode 100644 index 0000000..c89de8a --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_outercorner_upsdown.obj @@ -0,0 +1,23 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.blend' +# www.blender.org +o Cube_Cube.002 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 1.000000 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.707100 -0.707100 0.000000 +vn -0.000000 -0.707100 -0.707100 +s off +f 3/1/1 2/2/1 4/3/1 5/4/1 +f 1/2/2 3/3/2 5/4/2 +f 1/1/3 2/3/3 3/4/3 +f 1/1/4 4/3/4 2/4/4 +f 1/2/5 5/3/5 4/4/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_pyramid.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_pyramid.obj new file mode 100644 index 0000000..a618dcf --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_pyramid.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_short_onetexture.blend' +# www.blender.org +o Cube +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.000000 0.000000 -0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 0.500000 +vn 0.000000 -1.000000 0.000000 +vn -0.707100 0.707100 -0.000000 +vn 0.000000 0.707100 -0.707100 +vn 0.707100 0.707100 0.000000 +vn -0.000000 0.707100 0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 3/4/2 5/5/2 4/3/2 +f 5/5/3 1/3/3 4/4/3 +f 1/4/4 5/5/4 2/3/4 +f 2/4/5 5/5/5 3/3/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_pyramid_spike.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_pyramid_spike.obj new file mode 100644 index 0000000..b305af2 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_pyramid_spike.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_onetexture.blend' +# www.blender.org +o Cube +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.000000 0.500000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.894400 0.447200 -0.000000 +vn 0.000000 0.447200 -0.894400 +vn 0.894400 0.447200 0.000000 +vn -0.000000 0.447200 0.894400 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 3/4/2 5/5/2 4/3/2 +f 5/5/3 1/3/3 4/4/3 +f 1/4/4 5/5/4 2/3/4 +f 2/4/5 5/5/5 3/3/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_slope.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_slope.obj new file mode 100644 index 0000000..f6f4860 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_slope.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend' +# www.blender.org +o Cube_Cube.002 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -1.000000 -0.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.707100 -0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/3/2 3/4/2 5/1/2 6/2/2 +f 2/1/3 5/3/3 3/4/3 +f 1/2/4 4/3/4 6/4/4 +f 2/1/5 1/2/5 6/3/5 5/4/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_slope_horizontal.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_slope_horizontal.obj new file mode 100644 index 0000000..4866a92 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_slope_horizontal.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'technic-slope-horizontal.blend' +# www.blender.org +o Cube_Cube.002 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 1.000000 -0.000000 -0.000000 +vn -0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 -0.000000 +vn -0.707100 0.000000 -0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/1/2 3/2/2 5/3/2 6/4/2 +f 2/3/3 5/1/3 3/2/3 +f 1/4/4 4/1/4 6/2/4 +f 2/3/5 1/4/5 6/1/5 5/2/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_slope_upsdown.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_slope_upsdown.obj new file mode 100644 index 0000000..6880595 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_slope_upsdown.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend' +# www.blender.org +o Cube_Cube.002 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 -0.000000 +vn 1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 -0.000000 +vn -0.000000 -0.707100 -0.707100 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/3/2 3/4/2 5/1/2 6/2/2 +f 2/1/3 5/3/3 3/4/3 +f 1/2/4 4/3/4 6/4/4 +f 2/1/5 1/2/5 6/3/5 5/4/5 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_sphere.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_sphere.obj new file mode 100644 index 0000000..772b570 --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_sphere.obj @@ -0,0 +1,1927 @@ +# Blender v2.73 (sub 0) OBJ File: 'globe.blend' +# www.blender.org +o Sphere +v -0.097545 0.490393 0.000000 +v -0.191342 0.461940 0.000000 +v -0.277785 0.415735 0.000000 +v -0.353553 0.353553 0.000000 +v -0.415735 0.277785 0.000000 +v -0.461940 0.191342 0.000000 +v -0.490393 0.097545 0.000000 +v -0.500000 0.000000 0.000000 +v -0.490393 -0.097545 0.000000 +v -0.461940 -0.191342 0.000000 +v -0.415735 -0.277785 0.000000 +v -0.353553 -0.353553 0.000000 +v -0.277785 -0.415735 0.000000 +v -0.191342 -0.461940 0.000000 +v -0.097545 -0.490393 0.000000 +v -0.095671 0.490393 -0.019030 +v -0.187665 0.461940 -0.037329 +v -0.272448 0.415735 -0.054193 +v -0.346760 0.353553 -0.068975 +v -0.407747 0.277785 -0.081106 +v -0.453064 0.191342 -0.090120 +v -0.480970 0.097545 -0.095671 +v -0.490393 0.000000 -0.097545 +v -0.480970 -0.097545 -0.095671 +v -0.453064 -0.191342 -0.090120 +v -0.407747 -0.277785 -0.081106 +v -0.346760 -0.353553 -0.068975 +v -0.272448 -0.415735 -0.054193 +v -0.187665 -0.461940 -0.037329 +v -0.095671 -0.490393 -0.019030 +v -0.090120 0.490393 -0.037329 +v -0.176777 0.461940 -0.073223 +v -0.256640 0.415735 -0.106304 +v -0.326641 0.353553 -0.135299 +v -0.384089 0.277785 -0.159095 +v -0.426777 0.191342 -0.176777 +v -0.453064 0.097545 -0.187665 +v -0.461940 0.000000 -0.191342 +v -0.453064 -0.097545 -0.187665 +v -0.426777 -0.191342 -0.176777 +v -0.384089 -0.277785 -0.159095 +v -0.326641 -0.353553 -0.135299 +v -0.256640 -0.415735 -0.106304 +v -0.176777 -0.461940 -0.073223 +v -0.090120 -0.490393 -0.037329 +v -0.081106 0.490393 -0.054193 +v -0.159095 0.461940 -0.106304 +v -0.230970 0.415735 -0.154329 +v -0.293969 0.353553 -0.196424 +v -0.345671 0.277785 -0.230970 +v -0.384089 0.191342 -0.256640 +v -0.407746 0.097545 -0.272448 +v -0.415735 0.000000 -0.277785 +v -0.407746 -0.097545 -0.272448 +v -0.384089 -0.191342 -0.256640 +v -0.345671 -0.277785 -0.230970 +v -0.293969 -0.353553 -0.196424 +v -0.230970 -0.415735 -0.154329 +v -0.159095 -0.461940 -0.106304 +v -0.081106 -0.490393 -0.054193 +v -0.068975 0.490393 -0.068975 +v -0.135299 0.461940 -0.135299 +v -0.196424 0.415735 -0.196424 +v -0.250000 0.353553 -0.250000 +v -0.293969 0.277785 -0.293969 +v -0.326641 0.191342 -0.326641 +v -0.346760 0.097545 -0.346760 +v -0.353553 0.000000 -0.353554 +v -0.346760 -0.097545 -0.346760 +v -0.326641 -0.191342 -0.326641 +v -0.293969 -0.277785 -0.293969 +v -0.250000 -0.353553 -0.250000 +v -0.196424 -0.415735 -0.196424 +v -0.135299 -0.461940 -0.135299 +v -0.068975 -0.490393 -0.068975 +v -0.054193 0.490393 -0.081106 +v -0.106304 0.461940 -0.159095 +v -0.154329 0.415735 -0.230970 +v -0.196424 0.353553 -0.293969 +v -0.230970 0.277785 -0.345671 +v -0.256640 0.191342 -0.384089 +v -0.272447 0.097545 -0.407747 +v -0.277785 0.000000 -0.415735 +v -0.272447 -0.097545 -0.407747 +v -0.256640 -0.191342 -0.384089 +v -0.230970 -0.277785 -0.345671 +v -0.196424 -0.353553 -0.293969 +v -0.154329 -0.415735 -0.230970 +v -0.106304 -0.461940 -0.159095 +v -0.054193 -0.490393 -0.081106 +v -0.037329 0.490393 -0.090120 +v -0.073223 0.461940 -0.176777 +v -0.106304 0.415735 -0.256640 +v -0.135299 0.353553 -0.326641 +v -0.159095 0.277785 -0.384089 +v -0.176777 0.191342 -0.426777 +v -0.187665 0.097545 -0.453064 +v -0.191342 0.000000 -0.461940 +v -0.187665 -0.097545 -0.453064 +v -0.176777 -0.191342 -0.426777 +v -0.159095 -0.277785 -0.384089 +v -0.135299 -0.353553 -0.326641 +v -0.106304 -0.415735 -0.256640 +v -0.073223 -0.461940 -0.176777 +v -0.037329 -0.490393 -0.090120 +v -0.019030 0.490393 -0.095671 +v -0.037329 0.461940 -0.187665 +v -0.054193 0.415735 -0.272448 +v -0.068975 0.353553 -0.346760 +v -0.081106 0.277785 -0.407747 +v -0.090120 0.191342 -0.453064 +v -0.095671 0.097545 -0.480970 +v -0.097545 0.000000 -0.490393 +v -0.095671 -0.097545 -0.480970 +v -0.090120 -0.191342 -0.453064 +v -0.081106 -0.277785 -0.407747 +v -0.068975 -0.353553 -0.346760 +v -0.054193 -0.415735 -0.272448 +v -0.037329 -0.461940 -0.187665 +v -0.019030 -0.490393 -0.095671 +v 0.000000 0.490393 -0.097545 +v 0.000000 0.461940 -0.191342 +v 0.000000 0.415735 -0.277785 +v 0.000000 0.353553 -0.353553 +v 0.000000 0.277785 -0.415735 +v 0.000000 0.191342 -0.461940 +v 0.000000 0.097545 -0.490393 +v 0.000000 0.000000 -0.500000 +v 0.000000 -0.097545 -0.490393 +v 0.000000 -0.191342 -0.461940 +v 0.000000 -0.277785 -0.415735 +v 0.000000 -0.353553 -0.353553 +v 0.000000 -0.415735 -0.277785 +v 0.000000 -0.461940 -0.191342 +v 0.000000 -0.490393 -0.097545 +v 0.019030 0.490393 -0.095671 +v 0.037329 0.461940 -0.187665 +v 0.054193 0.415735 -0.272448 +v 0.068975 0.353553 -0.346760 +v 0.081106 0.277785 -0.407747 +v 0.090120 0.191342 -0.453064 +v 0.095671 0.097545 -0.480970 +v 0.097545 0.000000 -0.490393 +v 0.095671 -0.097545 -0.480970 +v 0.090120 -0.191342 -0.453064 +v 0.081106 -0.277785 -0.407747 +v 0.068975 -0.353553 -0.346760 +v 0.054193 -0.415735 -0.272448 +v 0.037329 -0.461940 -0.187665 +v 0.019030 -0.490393 -0.095671 +v 0.037329 0.490393 -0.090120 +v 0.073224 0.461940 -0.176777 +v 0.106304 0.415735 -0.256640 +v 0.135299 0.353553 -0.326641 +v 0.159095 0.277785 -0.384089 +v 0.176777 0.191342 -0.426777 +v 0.187665 0.097545 -0.453064 +v 0.191342 0.000000 -0.461940 +v 0.187665 -0.097545 -0.453064 +v 0.176777 -0.191342 -0.426777 +v 0.159095 -0.277785 -0.384089 +v 0.135299 -0.353553 -0.326641 +v 0.106304 -0.415735 -0.256640 +v 0.073223 -0.461940 -0.176777 +v 0.037329 -0.490393 -0.090120 +v 0.054193 0.490393 -0.081106 +v 0.106304 0.461940 -0.159095 +v 0.154329 0.415735 -0.230970 +v 0.196424 0.353553 -0.293969 +v 0.230970 0.277785 -0.345671 +v 0.256640 0.191342 -0.384089 +v 0.272448 0.097545 -0.407747 +v 0.277785 0.000000 -0.415735 +v 0.272448 -0.097545 -0.407747 +v 0.256640 -0.191342 -0.384089 +v 0.230970 -0.277785 -0.345671 +v 0.196424 -0.353553 -0.293969 +v 0.154329 -0.415735 -0.230970 +v 0.106304 -0.461940 -0.159095 +v 0.054193 -0.490393 -0.081106 +v 0.068975 0.490393 -0.068975 +v 0.135299 0.461940 -0.135299 +v 0.196424 0.415735 -0.196424 +v 0.250000 0.353553 -0.250000 +v 0.293969 0.277785 -0.293969 +v 0.326641 0.191342 -0.326641 +v 0.346760 0.097545 -0.346760 +v 0.353554 0.000000 -0.353553 +v 0.346760 -0.097545 -0.346760 +v 0.326641 -0.191342 -0.326641 +v 0.293969 -0.277785 -0.293969 +v 0.250000 -0.353553 -0.250000 +v 0.196424 -0.415735 -0.196424 +v 0.135299 -0.461940 -0.135299 +v 0.068975 -0.490393 -0.068975 +v 0.081106 0.490393 -0.054193 +v 0.159095 0.461940 -0.106304 +v 0.230970 0.415735 -0.154329 +v 0.293969 0.353553 -0.196424 +v 0.345671 0.277785 -0.230970 +v 0.384089 0.191342 -0.256640 +v 0.407747 0.097545 -0.272447 +v 0.415735 0.000000 -0.277785 +v 0.407747 -0.097545 -0.272447 +v 0.384089 -0.191342 -0.256640 +v 0.345671 -0.277785 -0.230970 +v 0.293969 -0.353553 -0.196424 +v 0.230970 -0.415735 -0.154329 +v 0.159095 -0.461940 -0.106304 +v 0.081106 -0.490393 -0.054193 +v 0.090120 0.490393 -0.037329 +v 0.176777 0.461940 -0.073223 +v 0.256640 0.415735 -0.106304 +v 0.326641 0.353553 -0.135299 +v 0.384089 0.277785 -0.159095 +v 0.426777 0.191342 -0.176777 +v 0.453064 0.097545 -0.187665 +v 0.461940 0.000000 -0.191342 +v 0.453064 -0.097545 -0.187665 +v 0.426777 -0.191342 -0.176777 +v 0.384089 -0.277785 -0.159095 +v 0.326641 -0.353553 -0.135299 +v 0.256640 -0.415735 -0.106304 +v 0.176777 -0.461940 -0.073223 +v 0.090120 -0.490393 -0.037329 +v 0.095671 0.490393 -0.019030 +v 0.187665 0.461940 -0.037329 +v 0.272448 0.415735 -0.054193 +v 0.346760 0.353553 -0.068975 +v 0.407747 0.277785 -0.081106 +v 0.453064 0.191342 -0.090120 +v 0.480970 0.097545 -0.095671 +v 0.490393 0.000000 -0.097545 +v 0.480970 -0.097545 -0.095671 +v 0.453064 -0.191342 -0.090120 +v 0.407747 -0.277785 -0.081106 +v 0.346760 -0.353553 -0.068975 +v 0.272448 -0.415735 -0.054193 +v 0.187665 -0.461940 -0.037329 +v 0.095671 -0.490393 -0.019030 +v 0.097545 0.490393 0.000000 +v 0.191342 0.461940 -0.000000 +v 0.277785 0.415735 -0.000000 +v 0.353554 0.353553 0.000000 +v 0.415735 0.277785 0.000000 +v 0.461940 0.191342 -0.000000 +v 0.490393 0.097545 0.000000 +v 0.500000 0.000000 0.000000 +v 0.490393 -0.097545 0.000000 +v 0.461940 -0.191342 -0.000000 +v 0.415735 -0.277785 0.000000 +v 0.353554 -0.353553 0.000000 +v 0.277785 -0.415735 0.000000 +v 0.191342 -0.461940 -0.000000 +v 0.097545 -0.490393 -0.000000 +v 0.095671 0.490393 0.019030 +v 0.187665 0.461940 0.037329 +v 0.272448 0.415735 0.054193 +v 0.346760 0.353553 0.068975 +v 0.407747 0.277785 0.081106 +v 0.453064 0.191342 0.090120 +v 0.480970 0.097545 0.095671 +v 0.490393 0.000000 0.097545 +v 0.480970 -0.097545 0.095671 +v 0.453064 -0.191342 0.090120 +v 0.407747 -0.277785 0.081106 +v 0.346760 -0.353553 0.068975 +v 0.272448 -0.415735 0.054193 +v 0.187665 -0.461940 0.037329 +v 0.095671 -0.490393 0.019030 +v 0.090120 0.490393 0.037329 +v 0.176777 0.461940 0.073223 +v 0.256640 0.415735 0.106304 +v 0.326641 0.353553 0.135299 +v 0.384089 0.277785 0.159095 +v 0.426777 0.191342 0.176777 +v 0.453064 0.097545 0.187665 +v 0.461940 0.000000 0.191342 +v 0.453064 -0.097545 0.187665 +v 0.426777 -0.191342 0.176777 +v 0.384089 -0.277785 0.159095 +v 0.326641 -0.353553 0.135299 +v 0.256640 -0.415735 0.106304 +v 0.176777 -0.461940 0.073223 +v 0.090120 -0.490393 0.037329 +v 0.081106 0.490393 0.054193 +v 0.159095 0.461940 0.106304 +v 0.230970 0.415735 0.154329 +v 0.293969 0.353553 0.196424 +v 0.345671 0.277785 0.230970 +v 0.384089 0.191342 0.256640 +v 0.407747 0.097545 0.272448 +v 0.415735 0.000000 0.277785 +v 0.407747 -0.097545 0.272448 +v 0.384089 -0.191342 0.256640 +v 0.345671 -0.277785 0.230970 +v 0.293969 -0.353553 0.196424 +v 0.230970 -0.415735 0.154329 +v 0.159095 -0.461940 0.106304 +v 0.081106 -0.490393 0.054193 +v 0.068975 0.490393 0.068975 +v 0.135299 0.461940 0.135299 +v 0.196424 0.415735 0.196424 +v 0.250000 0.353553 0.250000 +v 0.293969 0.277785 0.293969 +v 0.326641 0.191342 0.326641 +v 0.346760 0.097545 0.346760 +v 0.353553 0.000000 0.353553 +v 0.346760 -0.097545 0.346760 +v 0.326641 -0.191342 0.326641 +v 0.293969 -0.277785 0.293969 +v 0.250000 -0.353553 0.250000 +v 0.196424 -0.415735 0.196424 +v 0.135299 -0.461940 0.135299 +v 0.068975 -0.490393 0.068975 +v 0.054193 0.490393 0.081106 +v 0.106304 0.461940 0.159095 +v 0.154329 0.415735 0.230970 +v 0.196424 0.353553 0.293969 +v 0.230970 0.277785 0.345671 +v 0.256640 0.191342 0.384089 +v 0.272448 0.097545 0.407746 +v 0.277785 0.000000 0.415735 +v 0.272448 -0.097545 0.407746 +v 0.256640 -0.191342 0.384089 +v 0.230970 -0.277785 0.345671 +v 0.196424 -0.353553 0.293969 +v 0.154329 -0.415735 0.230970 +v 0.106304 -0.461940 0.159095 +v 0.054193 -0.490393 0.081106 +v 0.037329 0.490393 0.090120 +v 0.073223 0.461940 0.176777 +v 0.106304 0.415735 0.256640 +v 0.135299 0.353553 0.326641 +v 0.159095 0.277785 0.384089 +v 0.176777 0.191342 0.426777 +v 0.187665 0.097545 0.453064 +v 0.191342 0.000000 0.461940 +v 0.187665 -0.097545 0.453064 +v 0.176777 -0.191342 0.426777 +v 0.159095 -0.277785 0.384089 +v 0.135299 -0.353553 0.326641 +v 0.106304 -0.415735 0.256640 +v 0.073223 -0.461940 0.176777 +v 0.037329 -0.490393 0.090120 +v 0.019030 0.490393 0.095671 +v 0.037329 0.461940 0.187665 +v 0.054193 0.415735 0.272448 +v 0.068975 0.353553 0.346760 +v 0.081106 0.277785 0.407746 +v 0.090120 0.191342 0.453064 +v 0.095671 0.097545 0.480970 +v 0.097545 0.000000 0.490393 +v 0.095671 -0.097545 0.480970 +v 0.090120 -0.191342 0.453064 +v 0.081106 -0.277785 0.407746 +v 0.068975 -0.353553 0.346760 +v 0.054193 -0.415735 0.272447 +v 0.037329 -0.461940 0.187665 +v 0.019030 -0.490393 0.095671 +v 0.000000 0.490393 0.097545 +v 0.000000 0.461940 0.191342 +v 0.000000 0.415735 0.277785 +v 0.000000 0.353553 0.353553 +v 0.000000 0.277785 0.415735 +v 0.000000 0.191342 0.461940 +v 0.000000 0.097545 0.490392 +v 0.000000 0.000000 0.500000 +v 0.000000 -0.097545 0.490392 +v 0.000000 -0.191342 0.461940 +v 0.000000 -0.277785 0.415735 +v 0.000000 -0.353553 0.353553 +v 0.000000 -0.415735 0.277785 +v 0.000000 -0.461940 0.191342 +v 0.000000 -0.490393 0.097545 +v -0.019030 0.490393 0.095671 +v -0.037329 0.461940 0.187665 +v -0.054193 0.415735 0.272448 +v -0.068975 0.353553 0.346760 +v -0.081106 0.277785 0.407746 +v -0.090120 0.191342 0.453064 +v -0.095671 0.097545 0.480970 +v -0.097545 0.000000 0.490393 +v -0.095671 -0.097545 0.480970 +v -0.090120 -0.191342 0.453064 +v -0.081106 -0.277785 0.407746 +v -0.068975 -0.353553 0.346760 +v -0.054193 -0.415735 0.272447 +v -0.037329 -0.461940 0.187665 +v -0.019030 -0.490393 0.095671 +v -0.037329 0.490393 0.090120 +v -0.073223 0.461940 0.176777 +v -0.106304 0.415735 0.256640 +v -0.135299 0.353553 0.326641 +v -0.159095 0.277785 0.384089 +v -0.176777 0.191342 0.426777 +v -0.187665 0.097545 0.453063 +v -0.191342 0.000000 0.461940 +v -0.187665 -0.097545 0.453063 +v -0.176777 -0.191342 0.426777 +v -0.159095 -0.277785 0.384089 +v -0.135299 -0.353553 0.326641 +v -0.106304 -0.415735 0.256640 +v -0.073223 -0.461940 0.176777 +v -0.037329 -0.490393 0.090120 +v -0.054193 0.490393 0.081106 +v -0.106304 0.461940 0.159095 +v -0.154329 0.415735 0.230970 +v -0.196424 0.353553 0.293969 +v -0.230970 0.277785 0.345671 +v -0.256640 0.191342 0.384089 +v -0.272447 0.097545 0.407746 +v -0.277785 0.000000 0.415735 +v -0.272447 -0.097545 0.407746 +v -0.256640 -0.191342 0.384089 +v -0.230970 -0.277785 0.345671 +v -0.196424 -0.353553 0.293969 +v -0.154329 -0.415735 0.230970 +v -0.106304 -0.461940 0.159095 +v -0.054193 -0.490393 0.081106 +v -0.068975 0.490393 0.068975 +v -0.135299 0.461940 0.135299 +v -0.196424 0.415735 0.196424 +v -0.250000 0.353553 0.250000 +v -0.293969 0.277785 0.293969 +v -0.326641 0.191342 0.326641 +v -0.346760 0.097545 0.346760 +v -0.353553 0.000000 0.353553 +v -0.346760 -0.097545 0.346760 +v -0.326641 -0.191342 0.326641 +v -0.293969 -0.277785 0.293969 +v -0.250000 -0.353553 0.250000 +v -0.196424 -0.415735 0.196424 +v -0.135299 -0.461940 0.135299 +v -0.068975 -0.490393 0.068975 +v -0.081106 0.490393 0.054193 +v -0.159095 0.461940 0.106304 +v -0.230970 0.415735 0.154329 +v -0.293969 0.353553 0.196424 +v -0.345671 0.277785 0.230970 +v -0.384089 0.191342 0.256640 +v -0.407746 0.097545 0.272447 +v -0.415735 0.000000 0.277785 +v -0.407746 -0.097545 0.272447 +v -0.384089 -0.191342 0.256640 +v -0.345671 -0.277785 0.230970 +v -0.293969 -0.353553 0.196424 +v -0.230970 -0.415735 0.154329 +v -0.159095 -0.461940 0.106304 +v -0.081106 -0.490393 0.054193 +v -0.090120 0.490393 0.037329 +v -0.176776 0.461940 0.073223 +v -0.256640 0.415735 0.106304 +v -0.326641 0.353553 0.135299 +v -0.384089 0.277785 0.159095 +v -0.426776 0.191342 0.176777 +v -0.453063 0.097545 0.187665 +v -0.461939 0.000000 0.191342 +v -0.453063 -0.097545 0.187665 +v -0.426776 -0.191342 0.176777 +v -0.384089 -0.277785 0.159095 +v -0.326641 -0.353553 0.135299 +v -0.256640 -0.415735 0.106304 +v -0.176776 -0.461940 0.073223 +v -0.090120 -0.490393 0.037329 +v -0.095671 0.490393 0.019030 +v -0.187665 0.461940 0.037329 +v -0.272447 0.415735 0.054193 +v -0.346760 0.353553 0.068975 +v -0.407746 0.277785 0.081106 +v -0.453063 0.191342 0.090120 +v -0.480969 0.097545 0.095671 +v -0.490392 0.000000 0.097545 +v -0.480969 -0.097545 0.095671 +v -0.453063 -0.191342 0.090120 +v -0.407746 -0.277785 0.081106 +v -0.346760 -0.353553 0.068975 +v -0.272447 -0.415735 0.054193 +v -0.187665 -0.461940 0.037329 +v -0.095671 -0.490393 0.019030 +v -0.013167 -0.495196 0.000000 +v -0.005039 0.495196 0.012165 +v -0.013167 0.495196 0.000000 +v -0.012914 0.495196 -0.002569 +v -0.012914 -0.495196 -0.002569 +v -0.012165 0.495196 -0.005039 +v -0.012165 -0.495196 -0.005039 +v -0.010948 0.495196 -0.007315 +v -0.010948 -0.495196 -0.007315 +v -0.009311 0.495196 -0.009311 +v -0.009311 -0.495196 -0.009311 +v -0.007315 0.495196 -0.010948 +v -0.007315 -0.495196 -0.010948 +v -0.005039 0.495196 -0.012165 +v -0.005039 -0.495196 -0.012165 +v -0.002569 0.495196 -0.012914 +v -0.002569 -0.495196 -0.012914 +v 0.000000 0.495196 -0.013167 +v 0.000000 -0.495196 -0.013167 +v 0.002569 0.495196 -0.012914 +v 0.002569 -0.495196 -0.012914 +v 0.005039 0.495196 -0.012165 +v 0.005039 -0.495196 -0.012165 +v 0.007316 0.495196 -0.010948 +v 0.007316 -0.495196 -0.010948 +v 0.009311 0.495196 -0.009311 +v 0.009311 -0.495196 -0.009311 +v 0.010948 0.495196 -0.007315 +v 0.010948 -0.495196 -0.007315 +v 0.012165 0.495196 -0.005039 +v 0.012165 -0.495196 -0.005039 +v 0.012915 0.495196 -0.002569 +v 0.012915 -0.495196 -0.002569 +v 0.013168 0.495196 0.000000 +v 0.013168 -0.495196 0.000000 +v 0.012915 0.495196 0.002569 +v 0.012915 -0.495196 0.002569 +v 0.012165 0.495196 0.005039 +v 0.012165 -0.495196 0.005039 +v 0.010948 0.495196 0.007315 +v 0.010948 -0.495196 0.007315 +v 0.009311 0.495196 0.009311 +v 0.009311 -0.495196 0.009311 +v 0.007316 0.495196 0.010948 +v 0.007316 -0.495196 0.010948 +v 0.005039 0.495196 0.012165 +v 0.005039 -0.495196 0.012165 +v 0.002569 0.495196 0.012914 +v 0.002569 -0.495196 0.012914 +v 0.000000 0.495196 0.013167 +v 0.000000 -0.495196 0.013167 +v -0.002569 0.495196 0.012914 +v -0.002569 -0.495196 0.012914 +v -0.005039 -0.495196 0.012165 +v -0.007315 0.495196 0.010948 +v -0.007315 -0.495196 0.010948 +v -0.009311 0.495196 0.009311 +v -0.009311 -0.495196 0.009311 +v -0.010948 0.495196 0.007315 +v -0.010948 -0.495196 0.007315 +v -0.012165 0.495196 0.005039 +v -0.012165 -0.495196 0.005039 +v -0.012914 0.495196 0.002569 +v -0.012914 -0.495196 0.002569 +vt 0.437500 0.750000 +vt 0.437500 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.750000 +vt 0.437500 0.062500 +vt 0.437500 0.125000 +vt 0.375000 0.125000 +vt 0.375000 0.062500 +vt 0.437500 0.875000 +vt 0.437500 0.937500 +vt 0.375000 0.937500 +vt 0.375000 0.875000 +vt 0.437500 0.187500 +vt 0.437500 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.187500 +vt 0.437500 0.312500 +vt 0.437500 0.375000 +vt 0.375000 0.375000 +vt 0.375000 0.312500 +vt 0.437500 0.437500 +vt 0.437500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.562500 +vt 0.437500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.687500 +vt 0.375000 0.687500 +vt 0.312500 0.437500 +vt 0.312500 0.375000 +vt 0.312500 0.562500 +vt 0.312500 0.500000 +vt 0.312500 0.687500 +vt 0.312500 0.625000 +vt 0.312500 0.812500 +vt 0.312500 0.750000 +vt 0.312500 0.125000 +vt 0.312500 0.062500 +vt 0.312500 0.937500 +vt 0.312500 0.875000 +vt 0.312500 0.250000 +vt 0.312500 0.187500 +vt 0.312500 0.312500 +vt 0.250000 0.437500 +vt 0.250000 0.375000 +vt 0.250000 0.562500 +vt 0.250000 0.500000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt 0.250000 0.812500 +vt 0.250000 0.750000 +vt 0.250000 0.125000 +vt 0.250000 0.062500 +vt 0.250000 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.250000 +vt 0.250000 0.187500 +vt 0.250000 0.312500 +vt 0.187500 0.437500 +vt 0.187500 0.375000 +vt 0.187500 0.562500 +vt 0.187500 0.500000 +vt 0.187500 0.687500 +vt 0.187500 0.625000 +vt 0.187500 0.812500 +vt 0.187500 0.750000 +vt 0.187500 0.125000 +vt 0.187500 0.062500 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.187500 0.250000 +vt 0.187500 0.187500 +vt 0.187500 0.312500 +vt 0.125000 0.437500 +vt 0.125000 0.375000 +vt 0.125000 0.562500 +vt 0.125000 0.500000 +vt 0.125000 0.687500 +vt 0.125000 0.625000 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.125000 0.125000 +vt 0.125000 0.062500 +vt 0.125000 0.937500 +vt 0.125000 0.875000 +vt 0.125000 0.250000 +vt 0.125000 0.187500 +vt 0.125000 0.312500 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.062500 0.562500 +vt 0.062500 0.500000 +vt 0.062500 0.687500 +vt 0.062500 0.625000 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.062500 0.125000 +vt 0.062500 0.062500 +vt 0.062500 0.937500 +vt 0.062500 0.875000 +vt 0.062500 0.250000 +vt 0.062500 0.187500 +vt 0.062500 0.312500 +vt 0.000000 0.437500 +vt 0.000000 0.375000 +vt 0.000000 0.562500 +vt 0.000000 0.500000 +vt 0.000000 0.687500 +vt 0.000000 0.625000 +vt 0.000000 0.812500 +vt 0.000000 0.750000 +vt 0.000000 0.125000 +vt 0.000000 0.062500 +vt 0.000000 0.937500 +vt 0.000000 0.875000 +vt 0.000000 0.250000 +vt 0.000000 0.187500 +vt 0.000000 0.312500 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 0.937500 0.437500 +vt 0.937500 0.375000 +vt 1.000000 0.500000 +vt 1.000000 0.562500 +vt 0.937500 0.562500 +vt 0.937500 0.500000 +vt 1.000000 0.625000 +vt 1.000000 0.687500 +vt 0.937500 0.687500 +vt 0.937500 0.625000 +vt 1.000000 0.750000 +vt 1.000000 0.812500 +vt 0.937500 0.812500 +vt 0.937500 0.750000 +vt 1.000000 0.062500 +vt 1.000000 0.125000 +vt 0.937500 0.125000 +vt 0.937500 0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.937500 +vt 0.937500 0.937500 +vt 0.937500 0.875000 +vt 1.000000 0.187500 +vt 1.000000 0.250000 +vt 0.937500 0.250000 +vt 0.937500 0.187500 +vt 1.000000 0.312500 +vt 0.937500 0.312500 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.875000 0.562500 +vt 0.875000 0.500000 +vt 0.875000 0.687500 +vt 0.875000 0.625000 +vt 0.875000 0.812500 +vt 0.875000 0.750000 +vt 0.875000 0.125000 +vt 0.875000 0.062500 +vt 0.875000 0.937500 +vt 0.875000 0.875000 +vt 0.875000 0.250000 +vt 0.875000 0.187500 +vt 0.875000 0.312500 +vt 0.812500 0.437500 +vt 0.812500 0.375000 +vt 0.812500 0.562500 +vt 0.812500 0.500000 +vt 0.812500 0.687500 +vt 0.812500 0.625000 +vt 0.812500 0.812500 +vt 0.812500 0.750000 +vt 0.812500 0.125000 +vt 0.812500 0.062500 +vt 0.812500 0.937500 +vt 0.812500 0.875000 +vt 0.812500 0.250000 +vt 0.812500 0.187500 +vt 0.812500 0.312500 +vt 0.750000 0.437500 +vt 0.750000 0.375000 +vt 0.750000 0.562500 +vt 0.750000 0.500000 +vt 0.750000 0.687500 +vt 0.750000 0.625000 +vt 0.750000 0.812500 +vt 0.750000 0.750000 +vt 0.750000 0.125000 +vt 0.750000 0.062500 +vt 0.750000 0.937500 +vt 0.750000 0.875000 +vt 0.750000 0.250000 +vt 0.750000 0.187500 +vt 0.750000 0.312500 +vt 0.687500 0.437500 +vt 0.687500 0.375000 +vt 0.687500 0.562500 +vt 0.687500 0.500000 +vt 0.687500 0.687500 +vt 0.687500 0.625000 +vt 0.687500 0.812500 +vt 0.687500 0.750000 +vt 0.687500 0.125000 +vt 0.687500 0.062500 +vt 0.687500 0.937500 +vt 0.687500 0.875000 +vt 0.687500 0.250000 +vt 0.687500 0.187500 +vt 0.687500 0.312500 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.625000 0.562500 +vt 0.625000 0.500000 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.625000 0.812500 +vt 0.625000 0.750000 +vt 0.625000 0.125000 +vt 0.625000 0.062500 +vt 0.625000 0.937500 +vt 0.625000 0.875000 +vt 0.625000 0.250000 +vt 0.625000 0.187500 +vt 0.625000 0.312500 +vt 0.562500 0.437500 +vt 0.562500 0.375000 +vt 0.562500 0.562500 +vt 0.562500 0.500000 +vt 0.562500 0.687500 +vt 0.562500 0.625000 +vt 0.562500 0.812500 +vt 0.562500 0.750000 +vt 0.562500 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.937500 +vt 0.562500 0.875000 +vt 0.562500 0.250000 +vt 0.562500 0.187500 +vt 0.562500 0.312500 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.500000 0.562500 +vt 0.500000 0.500000 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.500000 0.750000 +vt 0.500000 0.125000 +vt 0.500000 0.062500 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.500000 0.250000 +vt 0.500000 0.187500 +vt 0.500000 0.312500 +vt 0.437500 0.000000 +vt 0.375000 0.000000 +vt 0.312500 0.000000 +vt 0.250000 0.000000 +vt 0.187500 0.000000 +vt 0.125000 0.000000 +vt 0.062500 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.875000 0.000000 +vt 0.812500 0.000000 +vt 0.750000 0.000000 +vt 0.687500 0.000000 +vt 0.625000 0.000000 +vt 0.562500 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.437500 1.000000 +vt 0.562500 1.000000 +vt 0.625000 1.000000 +vt 0.687500 1.000000 +vt 0.750000 1.000000 +vt 0.812500 1.000000 +vt 0.875000 1.000000 +vt 0.937500 1.000000 +vt 1.000000 1.000000 +vt 0.062500 1.000000 +vt -0.000000 1.000000 +vt 0.125000 1.000000 +vt 0.187500 1.000000 +vt 0.250000 1.000000 +vt 0.312500 1.000000 +vt 0.375000 1.000000 +vt 0.031303 0.999906 +vt 0.037377 0.999307 +vt 0.043218 0.997535 +vt 0.048601 0.994658 +vt 0.053319 0.990786 +vt 0.057192 0.986068 +vt 0.060069 0.980685 +vt 0.061841 0.974844 +vt 0.062439 0.968769 +vt 0.061841 0.962695 +vt 0.060069 0.956854 +vt 0.057192 0.951471 +vt 0.053319 0.946753 +vt 0.048601 0.942881 +vt 0.043218 0.940004 +vt 0.037377 0.938232 +vt 0.031303 0.937633 +vt 0.025229 0.938232 +vt 0.019388 0.940004 +vt 0.014005 0.942881 +vt 0.009286 0.946753 +vt 0.005414 0.951471 +vt 0.002537 0.956854 +vt 0.000765 0.962695 +vt 0.000167 0.968770 +vt 0.000765 0.974844 +vt 0.002537 0.980685 +vt 0.005414 0.986068 +vt 0.009286 0.990786 +vt 0.014005 0.994658 +vt 0.019388 0.997535 +vt 0.025229 0.999307 +vn -0.710100 0.704000 0.000000 +vn -0.559800 0.828600 0.000000 +vn -0.549000 0.828600 -0.109200 +vn -0.696500 0.704000 -0.138500 +vn -0.182000 -0.983300 0.000000 +vn -0.387900 -0.921700 0.000000 +vn -0.380400 -0.921700 -0.075700 +vn -0.178400 -0.983300 -0.035500 +vn -0.387900 0.921700 0.000000 +vn -0.182000 0.983300 0.000000 +vn -0.178400 0.983300 -0.035500 +vn -0.380400 0.921700 -0.075700 +vn -0.559800 -0.828600 0.000000 +vn -0.710100 -0.704000 0.000000 +vn -0.696500 -0.704000 -0.138500 +vn -0.549000 -0.828600 -0.109200 +vn -0.833300 -0.552800 0.000000 +vn -0.924700 -0.380500 0.000000 +vn -0.907000 -0.380500 -0.180400 +vn -0.817300 -0.552800 -0.162600 +vn -0.981000 -0.193900 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.980800 0.000000 -0.195100 +vn -0.962200 -0.193900 -0.191400 +vn -0.981000 0.193900 0.000000 +vn -0.924700 0.380500 0.000000 +vn -0.907000 0.380500 -0.180400 +vn -0.962200 0.193900 -0.191400 +vn -0.833300 0.552800 0.000000 +vn -0.817300 0.552800 -0.162600 +vn -0.906300 -0.193900 -0.375400 +vn -0.854400 -0.380500 -0.353900 +vn -0.906300 0.193900 -0.375400 +vn -0.923900 0.000000 -0.382700 +vn -0.769900 0.552800 -0.318900 +vn -0.854400 0.380500 -0.353900 +vn -0.517100 0.828600 -0.214200 +vn -0.656100 0.704000 -0.271700 +vn -0.358300 -0.921700 -0.148400 +vn -0.168100 -0.983300 -0.069600 +vn -0.168100 0.983300 -0.069600 +vn -0.358300 0.921700 -0.148400 +vn -0.656100 -0.704000 -0.271700 +vn -0.517100 -0.828600 -0.214200 +vn -0.769900 -0.552800 -0.318900 +vn -0.815700 -0.193900 -0.545000 +vn -0.768900 -0.380500 -0.513700 +vn -0.815700 0.193900 -0.545000 +vn -0.831400 0.000000 -0.555600 +vn -0.692900 0.552800 -0.463000 +vn -0.768900 0.380500 -0.513700 +vn -0.465400 0.828600 -0.311000 +vn -0.590400 0.704000 -0.394500 +vn -0.322500 -0.921700 -0.215500 +vn -0.151300 -0.983300 -0.101100 +vn -0.151300 0.983300 -0.101100 +vn -0.322500 0.921700 -0.215500 +vn -0.590400 -0.704000 -0.394500 +vn -0.465400 -0.828600 -0.311000 +vn -0.692900 -0.552800 -0.463000 +vn -0.693700 -0.193900 -0.693700 +vn -0.653900 -0.380500 -0.653900 +vn -0.693700 0.193900 -0.693700 +vn -0.707100 0.000000 -0.707100 +vn -0.589300 0.552800 -0.589300 +vn -0.653900 0.380500 -0.653900 +vn -0.395800 0.828600 -0.395800 +vn -0.502100 0.704000 -0.502100 +vn -0.274300 -0.921700 -0.274300 +vn -0.128600 -0.983300 -0.128600 +vn -0.128600 0.983300 -0.128600 +vn -0.274300 0.921700 -0.274300 +vn -0.502100 -0.704000 -0.502100 +vn -0.395800 -0.828600 -0.395800 +vn -0.589300 -0.552800 -0.589300 +vn -0.545000 -0.193900 -0.815700 +vn -0.513700 -0.380500 -0.768900 +vn -0.545000 0.193900 -0.815700 +vn -0.555600 0.000000 -0.831400 +vn -0.463000 0.552800 -0.692900 +vn -0.513700 0.380500 -0.768900 +vn -0.311000 0.828600 -0.465400 +vn -0.394500 0.704000 -0.590400 +vn -0.215500 -0.921700 -0.322500 +vn -0.101100 -0.983300 -0.151300 +vn -0.101100 0.983300 -0.151300 +vn -0.215500 0.921700 -0.322500 +vn -0.394500 -0.704000 -0.590400 +vn -0.311000 -0.828600 -0.465400 +vn -0.463000 -0.552800 -0.692900 +vn -0.375400 -0.193900 -0.906300 +vn -0.353900 -0.380500 -0.854400 +vn -0.375400 0.193900 -0.906300 +vn -0.382700 0.000000 -0.923900 +vn -0.318900 0.552800 -0.769900 +vn -0.353900 0.380500 -0.854400 +vn -0.214200 0.828600 -0.517100 +vn -0.271700 0.704000 -0.656100 +vn -0.148400 -0.921700 -0.358300 +vn -0.069600 -0.983300 -0.168100 +vn -0.069600 0.983300 -0.168100 +vn -0.148400 0.921700 -0.358300 +vn -0.271700 -0.704000 -0.656100 +vn -0.214200 -0.828600 -0.517100 +vn -0.318900 -0.552800 -0.769900 +vn -0.191400 -0.193900 -0.962200 +vn -0.180400 -0.380500 -0.907000 +vn -0.191400 0.193900 -0.962200 +vn -0.195100 0.000000 -0.980800 +vn -0.162600 0.552800 -0.817300 +vn -0.180400 0.380500 -0.907000 +vn -0.109200 0.828600 -0.549000 +vn -0.138500 0.704000 -0.696500 +vn -0.075700 -0.921700 -0.380400 +vn -0.035500 -0.983300 -0.178400 +vn -0.035500 0.983300 -0.178400 +vn -0.075700 0.921700 -0.380400 +vn -0.138500 -0.704000 -0.696500 +vn -0.109200 -0.828600 -0.549000 +vn -0.162600 -0.552800 -0.817300 +vn 0.000000 -0.193900 -0.981000 +vn 0.000000 -0.380500 -0.924700 +vn 0.000000 0.193900 -0.981000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.552800 -0.833300 +vn 0.000000 0.380500 -0.924700 +vn 0.000000 0.828600 -0.559800 +vn 0.000000 0.704000 -0.710100 +vn 0.000000 -0.921700 -0.387900 +vn 0.000000 -0.983300 -0.182000 +vn 0.000000 0.983300 -0.182000 +vn 0.000000 0.921700 -0.387900 +vn 0.000000 -0.704000 -0.710100 +vn 0.000000 -0.828600 -0.559800 +vn 0.000000 -0.552800 -0.833300 +vn 0.191400 -0.193900 -0.962200 +vn 0.180400 -0.380500 -0.907000 +vn 0.191400 0.193900 -0.962200 +vn 0.195100 0.000000 -0.980800 +vn 0.162600 0.552800 -0.817300 +vn 0.180400 0.380500 -0.907000 +vn 0.109200 0.828600 -0.549000 +vn 0.138500 0.704000 -0.696500 +vn 0.075700 -0.921700 -0.380400 +vn 0.035500 -0.983300 -0.178400 +vn 0.035500 0.983300 -0.178400 +vn 0.075700 0.921700 -0.380400 +vn 0.138500 -0.704000 -0.696500 +vn 0.109200 -0.828600 -0.549000 +vn 0.162600 -0.552800 -0.817300 +vn 0.375400 -0.193900 -0.906300 +vn 0.353900 -0.380500 -0.854400 +vn 0.375400 0.193900 -0.906300 +vn 0.382700 0.000000 -0.923900 +vn 0.318900 0.552800 -0.769900 +vn 0.353900 0.380500 -0.854400 +vn 0.214200 0.828600 -0.517100 +vn 0.271700 0.704000 -0.656100 +vn 0.148400 -0.921700 -0.358300 +vn 0.069600 -0.983300 -0.168100 +vn 0.069600 0.983300 -0.168100 +vn 0.148400 0.921700 -0.358300 +vn 0.271700 -0.704000 -0.656100 +vn 0.214200 -0.828600 -0.517100 +vn 0.318900 -0.552800 -0.769900 +vn 0.545000 -0.193900 -0.815700 +vn 0.513700 -0.380500 -0.768900 +vn 0.545000 0.193900 -0.815700 +vn 0.555600 0.000000 -0.831400 +vn 0.463000 0.552800 -0.692900 +vn 0.513700 0.380500 -0.768900 +vn 0.311000 0.828600 -0.465400 +vn 0.394500 0.704000 -0.590400 +vn 0.215500 -0.921700 -0.322500 +vn 0.101100 -0.983300 -0.151300 +vn 0.101100 0.983300 -0.151300 +vn 0.215500 0.921700 -0.322500 +vn 0.394500 -0.704000 -0.590400 +vn 0.311000 -0.828600 -0.465400 +vn 0.463000 -0.552800 -0.692900 +vn 0.693700 -0.193900 -0.693700 +vn 0.653900 -0.380500 -0.653900 +vn 0.693700 0.193900 -0.693700 +vn 0.707100 0.000000 -0.707100 +vn 0.589300 0.552800 -0.589300 +vn 0.653900 0.380500 -0.653900 +vn 0.395800 0.828600 -0.395800 +vn 0.502100 0.704000 -0.502100 +vn 0.274300 -0.921700 -0.274300 +vn 0.128600 -0.983300 -0.128600 +vn 0.128600 0.983300 -0.128600 +vn 0.274300 0.921700 -0.274300 +vn 0.502100 -0.704000 -0.502100 +vn 0.395800 -0.828600 -0.395800 +vn 0.589300 -0.552800 -0.589300 +vn 0.815700 -0.193900 -0.545000 +vn 0.768900 -0.380500 -0.513700 +vn 0.815700 0.193900 -0.545000 +vn 0.831400 0.000000 -0.555600 +vn 0.692900 0.552800 -0.463000 +vn 0.768900 0.380500 -0.513700 +vn 0.465400 0.828600 -0.311000 +vn 0.590400 0.704000 -0.394500 +vn 0.322500 -0.921700 -0.215500 +vn 0.151300 -0.983300 -0.101100 +vn 0.151300 0.983300 -0.101100 +vn 0.322500 0.921700 -0.215500 +vn 0.590400 -0.704000 -0.394500 +vn 0.465400 -0.828600 -0.311000 +vn 0.692900 -0.552800 -0.463000 +vn 0.906300 -0.193900 -0.375400 +vn 0.854400 -0.380500 -0.353900 +vn 0.906300 0.193900 -0.375400 +vn 0.923900 0.000000 -0.382700 +vn 0.769900 0.552800 -0.318900 +vn 0.854400 0.380500 -0.353900 +vn 0.517100 0.828600 -0.214200 +vn 0.656100 0.704000 -0.271700 +vn 0.358300 -0.921700 -0.148400 +vn 0.168100 -0.983300 -0.069600 +vn 0.168100 0.983300 -0.069600 +vn 0.358300 0.921700 -0.148400 +vn 0.656100 -0.704000 -0.271700 +vn 0.517100 -0.828600 -0.214200 +vn 0.769900 -0.552800 -0.318900 +vn 0.962200 -0.193900 -0.191400 +vn 0.907000 -0.380500 -0.180400 +vn 0.962200 0.193900 -0.191400 +vn 0.980800 0.000000 -0.195100 +vn 0.817300 0.552800 -0.162600 +vn 0.907000 0.380500 -0.180400 +vn 0.549000 0.828600 -0.109200 +vn 0.696500 0.704000 -0.138500 +vn 0.380400 -0.921700 -0.075700 +vn 0.178400 -0.983300 -0.035500 +vn 0.178400 0.983300 -0.035500 +vn 0.380400 0.921700 -0.075700 +vn 0.696500 -0.704000 -0.138500 +vn 0.549000 -0.828600 -0.109200 +vn 0.817300 -0.552800 -0.162600 +vn 0.981000 -0.193900 0.000000 +vn 0.924700 -0.380500 0.000000 +vn 0.981000 0.193900 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.833300 0.552800 0.000000 +vn 0.924700 0.380500 0.000000 +vn 0.559800 0.828600 0.000000 +vn 0.710100 0.704000 0.000000 +vn 0.387900 -0.921700 0.000000 +vn 0.182000 -0.983300 0.000000 +vn 0.182000 0.983300 0.000000 +vn 0.387900 0.921700 0.000000 +vn 0.710100 -0.704000 0.000000 +vn 0.559800 -0.828600 0.000000 +vn 0.833300 -0.552800 0.000000 +vn 0.962200 -0.193900 0.191400 +vn 0.907000 -0.380500 0.180400 +vn 0.962200 0.193900 0.191400 +vn 0.980800 0.000000 0.195100 +vn 0.817300 0.552800 0.162600 +vn 0.907000 0.380500 0.180400 +vn 0.549000 0.828600 0.109200 +vn 0.696500 0.704000 0.138500 +vn 0.380400 -0.921700 0.075700 +vn 0.178400 -0.983300 0.035500 +vn 0.178400 0.983300 0.035500 +vn 0.380400 0.921700 0.075700 +vn 0.696500 -0.704000 0.138500 +vn 0.549000 -0.828600 0.109200 +vn 0.817300 -0.552800 0.162600 +vn 0.906300 -0.193900 0.375400 +vn 0.854400 -0.380500 0.353900 +vn 0.906300 0.193900 0.375400 +vn 0.923900 0.000000 0.382700 +vn 0.769900 0.552800 0.318900 +vn 0.854400 0.380500 0.353900 +vn 0.517100 0.828600 0.214200 +vn 0.656100 0.704000 0.271700 +vn 0.358300 -0.921700 0.148400 +vn 0.168100 -0.983300 0.069600 +vn 0.168100 0.983300 0.069600 +vn 0.358300 0.921700 0.148400 +vn 0.656100 -0.704000 0.271700 +vn 0.517100 -0.828600 0.214200 +vn 0.769900 -0.552800 0.318900 +vn 0.815700 -0.193900 0.545000 +vn 0.768900 -0.380500 0.513700 +vn 0.815700 0.193900 0.545000 +vn 0.831400 0.000000 0.555600 +vn 0.692900 0.552800 0.463000 +vn 0.768900 0.380500 0.513700 +vn 0.465400 0.828600 0.311000 +vn 0.590400 0.704000 0.394500 +vn 0.322500 -0.921700 0.215500 +vn 0.151300 -0.983300 0.101100 +vn 0.151300 0.983300 0.101100 +vn 0.322500 0.921700 0.215500 +vn 0.590400 -0.704000 0.394500 +vn 0.465400 -0.828600 0.311000 +vn 0.692900 -0.552800 0.463000 +vn 0.693700 -0.193900 0.693700 +vn 0.653900 -0.380500 0.653900 +vn 0.693700 0.193900 0.693700 +vn 0.707100 0.000000 0.707100 +vn 0.589300 0.552800 0.589300 +vn 0.653900 0.380500 0.653900 +vn 0.395800 0.828600 0.395800 +vn 0.502100 0.704000 0.502100 +vn 0.274300 -0.921700 0.274300 +vn 0.128600 -0.983300 0.128600 +vn 0.128600 0.983300 0.128600 +vn 0.274300 0.921700 0.274300 +vn 0.502100 -0.704000 0.502100 +vn 0.395800 -0.828600 0.395800 +vn 0.589300 -0.552800 0.589300 +vn 0.545000 -0.193900 0.815700 +vn 0.513700 -0.380500 0.768900 +vn 0.545000 0.193900 0.815700 +vn 0.555600 0.000000 0.831400 +vn 0.463000 0.552800 0.692900 +vn 0.513700 0.380500 0.768900 +vn 0.311000 0.828600 0.465400 +vn 0.394500 0.704000 0.590400 +vn 0.215500 -0.921700 0.322500 +vn 0.101100 -0.983300 0.151300 +vn 0.101100 0.983300 0.151300 +vn 0.215500 0.921700 0.322500 +vn 0.394500 -0.704000 0.590400 +vn 0.311000 -0.828600 0.465400 +vn 0.463000 -0.552800 0.692900 +vn 0.375400 -0.193900 0.906300 +vn 0.353900 -0.380500 0.854400 +vn 0.375400 0.193900 0.906300 +vn 0.382700 0.000000 0.923900 +vn 0.318900 0.552800 0.769900 +vn 0.353900 0.380500 0.854400 +vn 0.214200 0.828600 0.517100 +vn 0.271700 0.704000 0.656100 +vn 0.148400 -0.921700 0.358300 +vn 0.069600 -0.983300 0.168100 +vn 0.069600 0.983300 0.168100 +vn 0.148400 0.921700 0.358300 +vn 0.271700 -0.704000 0.656100 +vn 0.214200 -0.828600 0.517100 +vn 0.318900 -0.552800 0.769900 +vn 0.191400 -0.193900 0.962200 +vn 0.180400 -0.380500 0.907000 +vn 0.191400 0.193900 0.962200 +vn 0.195100 0.000000 0.980800 +vn 0.162600 0.552800 0.817300 +vn 0.180400 0.380500 0.907000 +vn 0.109200 0.828600 0.549000 +vn 0.138500 0.704000 0.696500 +vn 0.075700 -0.921700 0.380400 +vn 0.035500 -0.983300 0.178400 +vn 0.035500 0.983300 0.178400 +vn 0.075700 0.921700 0.380400 +vn 0.138500 -0.704000 0.696500 +vn 0.109200 -0.828600 0.549000 +vn 0.162600 -0.552800 0.817300 +vn 0.000000 -0.193900 0.981000 +vn 0.000000 -0.380500 0.924700 +vn 0.000000 0.193900 0.981000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.552800 0.833300 +vn 0.000000 0.380500 0.924700 +vn 0.000000 0.828600 0.559800 +vn 0.000000 0.704000 0.710100 +vn 0.000000 -0.921700 0.387900 +vn 0.000000 -0.983300 0.182000 +vn 0.000000 0.983300 0.182000 +vn 0.000000 0.921700 0.387900 +vn 0.000000 -0.704000 0.710100 +vn 0.000000 -0.828600 0.559800 +vn 0.000000 -0.552800 0.833300 +vn -0.191400 -0.193900 0.962200 +vn -0.180400 -0.380500 0.907000 +vn -0.191400 0.193900 0.962200 +vn -0.195100 0.000000 0.980800 +vn -0.162600 0.552800 0.817300 +vn -0.180400 0.380500 0.907000 +vn -0.109200 0.828600 0.549000 +vn -0.138500 0.704000 0.696500 +vn -0.075700 -0.921700 0.380400 +vn -0.035500 -0.983300 0.178400 +vn -0.035500 0.983300 0.178400 +vn -0.075700 0.921700 0.380400 +vn -0.138500 -0.704000 0.696500 +vn -0.109200 -0.828600 0.549000 +vn -0.162600 -0.552800 0.817300 +vn -0.375400 -0.193900 0.906300 +vn -0.353900 -0.380500 0.854400 +vn -0.375400 0.193900 0.906300 +vn -0.382700 0.000000 0.923900 +vn -0.318900 0.552800 0.769900 +vn -0.353900 0.380500 0.854400 +vn -0.214200 0.828600 0.517100 +vn -0.271700 0.704000 0.656100 +vn -0.148400 -0.921700 0.358300 +vn -0.069600 -0.983300 0.168100 +vn -0.069600 0.983300 0.168100 +vn -0.148400 0.921700 0.358300 +vn -0.271700 -0.704000 0.656100 +vn -0.214200 -0.828600 0.517100 +vn -0.318900 -0.552800 0.769900 +vn -0.545000 -0.193900 0.815700 +vn -0.513700 -0.380500 0.768900 +vn -0.545000 0.193900 0.815700 +vn -0.555600 0.000000 0.831400 +vn -0.463000 0.552800 0.692900 +vn -0.513700 0.380500 0.768900 +vn -0.311000 0.828600 0.465400 +vn -0.394500 0.704000 0.590400 +vn -0.215500 -0.921700 0.322500 +vn -0.101100 -0.983300 0.151300 +vn -0.101100 0.983300 0.151300 +vn -0.215500 0.921700 0.322500 +vn -0.394500 -0.704000 0.590400 +vn -0.311000 -0.828600 0.465400 +vn -0.463000 -0.552800 0.692900 +vn -0.693700 -0.193900 0.693700 +vn -0.653900 -0.380500 0.653900 +vn -0.693700 0.193900 0.693700 +vn -0.707100 0.000000 0.707100 +vn -0.589300 0.552800 0.589300 +vn -0.653900 0.380500 0.653900 +vn -0.395800 0.828600 0.395800 +vn -0.502100 0.704000 0.502100 +vn -0.274300 -0.921700 0.274300 +vn -0.128600 -0.983300 0.128600 +vn -0.128600 0.983300 0.128600 +vn -0.274300 0.921700 0.274300 +vn -0.502100 -0.704000 0.502100 +vn -0.395800 -0.828600 0.395800 +vn -0.589300 -0.552800 0.589300 +vn -0.815700 -0.193900 0.545000 +vn -0.768900 -0.380500 0.513700 +vn -0.815700 0.193900 0.545000 +vn -0.831400 0.000000 0.555600 +vn -0.692900 0.552800 0.463000 +vn -0.768900 0.380500 0.513700 +vn -0.465400 0.828600 0.311000 +vn -0.590400 0.704000 0.394500 +vn -0.322500 -0.921700 0.215500 +vn -0.151300 -0.983300 0.101100 +vn -0.151300 0.983300 0.101100 +vn -0.322500 0.921700 0.215500 +vn -0.590400 -0.704000 0.394500 +vn -0.465400 -0.828600 0.311000 +vn -0.692900 -0.552800 0.463000 +vn -0.906300 -0.193900 0.375400 +vn -0.854400 -0.380500 0.353900 +vn -0.906300 0.193900 0.375400 +vn -0.923900 0.000000 0.382700 +vn -0.769900 0.552800 0.318900 +vn -0.854400 0.380500 0.353900 +vn -0.517100 0.828600 0.214200 +vn -0.656100 0.704000 0.271700 +vn -0.358300 -0.921700 0.148400 +vn -0.168100 -0.983300 0.069600 +vn -0.168100 0.983300 0.069600 +vn -0.358300 0.921700 0.148400 +vn -0.656100 -0.704000 0.271700 +vn -0.517100 -0.828600 0.214200 +vn -0.769900 -0.552800 0.318900 +vn -0.962200 -0.193900 0.191400 +vn -0.907000 -0.380500 0.180400 +vn -0.962200 0.193900 0.191400 +vn -0.980800 0.000000 0.195100 +vn -0.817300 0.552800 0.162600 +vn -0.907000 0.380500 0.180400 +vn -0.549000 0.828600 0.109200 +vn -0.696500 0.704000 0.138500 +vn -0.380400 -0.921700 0.075700 +vn -0.178400 -0.983300 0.035500 +vn -0.178400 0.983300 0.035500 +vn -0.380400 0.921700 0.075700 +vn -0.696500 -0.704000 0.138500 +vn -0.549000 -0.828600 0.109200 +vn -0.817300 -0.552800 0.162600 +vn -0.030200 -0.999500 0.000000 +vn -0.029600 -0.999500 -0.005900 +vn -0.027900 -0.999500 -0.011500 +vn -0.025100 -0.999500 -0.016800 +vn -0.021300 -0.999500 -0.021300 +vn -0.016800 -0.999500 -0.025100 +vn -0.011500 -0.999500 -0.027900 +vn -0.005900 -0.999500 -0.029600 +vn 0.000000 -0.999500 -0.030200 +vn 0.005900 -0.999500 -0.029600 +vn 0.011500 -0.999500 -0.027900 +vn 0.016800 -0.999500 -0.025100 +vn 0.021300 -0.999500 -0.021300 +vn 0.025100 -0.999500 -0.016800 +vn 0.027900 -0.999500 -0.011500 +vn 0.029600 -0.999500 -0.005900 +vn 0.030200 -0.999500 0.000000 +vn 0.029600 -0.999500 0.005900 +vn 0.027900 -0.999500 0.011500 +vn 0.025100 -0.999500 0.016800 +vn 0.021300 -0.999500 0.021300 +vn 0.016800 -0.999500 0.025100 +vn 0.011500 -0.999500 0.027900 +vn 0.005900 -0.999500 0.029600 +vn 0.000000 -0.999500 0.030200 +vn -0.005900 -0.999500 0.029600 +vn -0.011500 -0.999500 0.027900 +vn -0.016800 -0.999500 0.025100 +vn -0.021300 -0.999500 0.021300 +vn -0.025100 -0.999500 0.016800 +vn -0.027900 -0.999500 0.011500 +vn -0.029600 -0.999500 0.005900 +vn -0.029600 0.999500 0.005900 +vn -0.030200 0.999500 0.000000 +vn -0.027900 0.999500 0.011500 +vn -0.025100 0.999500 0.016800 +vn -0.021300 0.999500 0.021300 +vn -0.016800 0.999500 0.025100 +vn -0.011500 0.999500 0.027900 +vn -0.005900 0.999500 0.029600 +vn 0.000000 0.999500 0.030200 +vn 0.005900 0.999500 0.029600 +vn 0.011500 0.999500 0.027900 +vn 0.016800 0.999500 0.025100 +vn 0.021300 0.999500 0.021300 +vn 0.025100 0.999500 0.016800 +vn 0.027900 0.999500 0.011500 +vn 0.029600 0.999500 0.005900 +vn 0.030200 0.999500 0.000000 +vn 0.029600 0.999500 -0.005900 +vn 0.027900 0.999500 -0.011500 +vn 0.025100 0.999500 -0.016800 +vn 0.021300 0.999500 -0.021300 +vn 0.016800 0.999500 -0.025100 +vn 0.011500 0.999500 -0.027900 +vn 0.005900 0.999500 -0.029600 +vn 0.000000 0.999500 -0.030200 +vn -0.005900 0.999500 -0.029600 +vn -0.011500 0.999500 -0.027900 +vn -0.016800 0.999500 -0.025100 +vn -0.021300 0.999500 -0.021300 +vn -0.025100 0.999500 -0.016800 +vn -0.027900 0.999500 -0.011500 +vn -0.029600 0.999500 -0.005900 +s 1 +f 4/1/1 3/2/2 18/3/3 19/4/4 +f 15/5/5 14/6/6 29/7/7 30/8/8 +f 2/9/9 1/10/10 16/11/11 17/12/12 +f 13/13/13 12/14/14 27/15/15 28/16/16 +f 11/17/17 10/18/18 25/19/19 26/20/20 +f 9/21/21 8/22/22 23/23/23 24/24/24 +f 7/25/25 6/26/26 21/27/27 22/28/28 +f 5/29/29 4/1/1 19/4/4 20/30/30 +f 3/2/2 2/9/9 17/12/12 18/3/3 +f 14/6/6 13/13/13 28/16/16 29/7/7 +f 12/14/14 11/17/17 26/20/20 27/15/15 +f 10/18/18 9/21/21 24/24/24 25/19/19 +f 8/22/22 7/25/25 22/28/28 23/23/23 +f 6/26/26 5/29/29 20/30/30 21/27/27 +f 25/19/19 24/24/24 39/31/31 40/32/32 +f 23/23/23 22/28/28 37/33/33 38/34/34 +f 21/27/27 20/30/30 35/35/35 36/36/36 +f 19/4/4 18/3/3 33/37/37 34/38/38 +f 30/8/8 29/7/7 44/39/39 45/40/40 +f 17/12/12 16/11/11 31/41/41 32/42/42 +f 28/16/16 27/15/15 42/43/43 43/44/44 +f 26/20/20 25/19/19 40/32/32 41/45/45 +f 24/24/24 23/23/23 38/34/34 39/31/31 +f 22/28/28 21/27/27 36/36/36 37/33/33 +f 20/30/30 19/4/4 34/38/38 35/35/35 +f 18/3/3 17/12/12 32/42/42 33/37/37 +f 29/7/7 28/16/16 43/44/44 44/39/39 +f 27/15/15 26/20/20 41/45/45 42/43/43 +f 40/32/32 39/31/31 54/46/46 55/47/47 +f 38/34/34 37/33/33 52/48/48 53/49/49 +f 36/36/36 35/35/35 50/50/50 51/51/51 +f 34/38/38 33/37/37 48/52/52 49/53/53 +f 45/40/40 44/39/39 59/54/54 60/55/55 +f 32/42/42 31/41/41 46/56/56 47/57/57 +f 43/44/44 42/43/43 57/58/58 58/59/59 +f 41/45/45 40/32/32 55/47/47 56/60/60 +f 39/31/31 38/34/34 53/49/49 54/46/46 +f 37/33/33 36/36/36 51/51/51 52/48/48 +f 35/35/35 34/38/38 49/53/53 50/50/50 +f 33/37/37 32/42/42 47/57/57 48/52/52 +f 44/39/39 43/44/44 58/59/59 59/54/54 +f 42/43/43 41/45/45 56/60/60 57/58/58 +f 55/47/47 54/46/46 69/61/61 70/62/62 +f 53/49/49 52/48/48 67/63/63 68/64/64 +f 51/51/51 50/50/50 65/65/65 66/66/66 +f 49/53/53 48/52/52 63/67/67 64/68/68 +f 60/55/55 59/54/54 74/69/69 75/70/70 +f 47/57/57 46/56/56 61/71/71 62/72/72 +f 58/59/59 57/58/58 72/73/73 73/74/74 +f 56/60/60 55/47/47 70/62/62 71/75/75 +f 54/46/46 53/49/49 68/64/64 69/61/61 +f 52/48/48 51/51/51 66/66/66 67/63/63 +f 50/50/50 49/53/53 64/68/68 65/65/65 +f 48/52/52 47/57/57 62/72/72 63/67/67 +f 59/54/54 58/59/59 73/74/74 74/69/69 +f 57/58/58 56/60/60 71/75/75 72/73/73 +f 70/62/62 69/61/61 84/76/76 85/77/77 +f 68/64/64 67/63/63 82/78/78 83/79/79 +f 66/66/66 65/65/65 80/80/80 81/81/81 +f 64/68/68 63/67/67 78/82/82 79/83/83 +f 75/70/70 74/69/69 89/84/84 90/85/85 +f 62/72/72 61/71/71 76/86/86 77/87/87 +f 73/74/74 72/73/73 87/88/88 88/89/89 +f 71/75/75 70/62/62 85/77/77 86/90/90 +f 69/61/61 68/64/64 83/79/79 84/76/76 +f 67/63/63 66/66/66 81/81/81 82/78/78 +f 65/65/65 64/68/68 79/83/83 80/80/80 +f 63/67/67 62/72/72 77/87/87 78/82/82 +f 74/69/69 73/74/74 88/89/89 89/84/84 +f 72/73/73 71/75/75 86/90/90 87/88/88 +f 85/77/77 84/76/76 99/91/91 100/92/92 +f 83/79/79 82/78/78 97/93/93 98/94/94 +f 81/81/81 80/80/80 95/95/95 96/96/96 +f 79/83/83 78/82/82 93/97/97 94/98/98 +f 90/85/85 89/84/84 104/99/99 105/100/100 +f 77/87/87 76/86/86 91/101/101 92/102/102 +f 88/89/89 87/88/88 102/103/103 103/104/104 +f 86/90/90 85/77/77 100/92/92 101/105/105 +f 84/76/76 83/79/79 98/94/94 99/91/91 +f 82/78/78 81/81/81 96/96/96 97/93/93 +f 80/80/80 79/83/83 94/98/98 95/95/95 +f 78/82/82 77/87/87 92/102/102 93/97/97 +f 89/84/84 88/89/89 103/104/104 104/99/99 +f 87/88/88 86/90/90 101/105/105 102/103/103 +f 100/92/92 99/91/91 114/106/106 115/107/107 +f 98/94/94 97/93/93 112/108/108 113/109/109 +f 96/96/96 95/95/95 110/110/110 111/111/111 +f 94/98/98 93/97/97 108/112/112 109/113/113 +f 105/100/100 104/99/99 119/114/114 120/115/115 +f 92/102/102 91/101/101 106/116/116 107/117/117 +f 103/104/104 102/103/103 117/118/118 118/119/119 +f 101/105/105 100/92/92 115/107/107 116/120/120 +f 99/91/91 98/94/94 113/109/109 114/106/106 +f 97/93/93 96/96/96 111/111/111 112/108/108 +f 95/95/95 94/98/98 109/113/113 110/110/110 +f 93/97/97 92/102/102 107/117/117 108/112/112 +f 104/99/99 103/104/104 118/119/119 119/114/114 +f 102/103/103 101/105/105 116/120/120 117/118/118 +f 115/121/107 114/122/106 129/123/121 130/124/122 +f 113/125/109 112/126/108 127/127/123 128/128/124 +f 111/129/111 110/130/110 125/131/125 126/132/126 +f 109/133/113 108/134/112 123/135/127 124/136/128 +f 120/137/115 119/138/114 134/139/129 135/140/130 +f 107/141/117 106/142/116 121/143/131 122/144/132 +f 118/145/119 117/146/118 132/147/133 133/148/134 +f 116/149/120 115/121/107 130/124/122 131/150/135 +f 114/122/106 113/125/109 128/128/124 129/123/121 +f 112/126/108 111/129/111 126/132/126 127/127/123 +f 110/130/110 109/133/113 124/136/128 125/131/125 +f 108/134/112 107/141/117 122/144/132 123/135/127 +f 119/138/114 118/145/119 133/148/134 134/139/129 +f 117/146/118 116/149/120 131/150/135 132/147/133 +f 130/124/122 129/123/121 144/151/136 145/152/137 +f 128/128/124 127/127/123 142/153/138 143/154/139 +f 126/132/126 125/131/125 140/155/140 141/156/141 +f 124/136/128 123/135/127 138/157/142 139/158/143 +f 135/140/130 134/139/129 149/159/144 150/160/145 +f 122/144/132 121/143/131 136/161/146 137/162/147 +f 133/148/134 132/147/133 147/163/148 148/164/149 +f 131/150/135 130/124/122 145/152/137 146/165/150 +f 129/123/121 128/128/124 143/154/139 144/151/136 +f 127/127/123 126/132/126 141/156/141 142/153/138 +f 125/131/125 124/136/128 139/158/143 140/155/140 +f 123/135/127 122/144/132 137/162/147 138/157/142 +f 134/139/129 133/148/134 148/164/149 149/159/144 +f 132/147/133 131/150/135 146/165/150 147/163/148 +f 145/152/137 144/151/136 159/166/151 160/167/152 +f 143/154/139 142/153/138 157/168/153 158/169/154 +f 141/156/141 140/155/140 155/170/155 156/171/156 +f 139/158/143 138/157/142 153/172/157 154/173/158 +f 150/160/145 149/159/144 164/174/159 165/175/160 +f 137/162/147 136/161/146 151/176/161 152/177/162 +f 148/164/149 147/163/148 162/178/163 163/179/164 +f 146/165/150 145/152/137 160/167/152 161/180/165 +f 144/151/136 143/154/139 158/169/154 159/166/151 +f 142/153/138 141/156/141 156/171/156 157/168/153 +f 140/155/140 139/158/143 154/173/158 155/170/155 +f 138/157/142 137/162/147 152/177/162 153/172/157 +f 149/159/144 148/164/149 163/179/164 164/174/159 +f 147/163/148 146/165/150 161/180/165 162/178/163 +f 160/167/152 159/166/151 174/181/166 175/182/167 +f 158/169/154 157/168/153 172/183/168 173/184/169 +f 156/171/156 155/170/155 170/185/170 171/186/171 +f 154/173/158 153/172/157 168/187/172 169/188/173 +f 165/175/160 164/174/159 179/189/174 180/190/175 +f 152/177/162 151/176/161 166/191/176 167/192/177 +f 163/179/164 162/178/163 177/193/178 178/194/179 +f 161/180/165 160/167/152 175/182/167 176/195/180 +f 159/166/151 158/169/154 173/184/169 174/181/166 +f 157/168/153 156/171/156 171/186/171 172/183/168 +f 155/170/155 154/173/158 169/188/173 170/185/170 +f 153/172/157 152/177/162 167/192/177 168/187/172 +f 164/174/159 163/179/164 178/194/179 179/189/174 +f 162/178/163 161/180/165 176/195/180 177/193/178 +f 175/182/167 174/181/166 189/196/181 190/197/182 +f 173/184/169 172/183/168 187/198/183 188/199/184 +f 171/186/171 170/185/170 185/200/185 186/201/186 +f 169/188/173 168/187/172 183/202/187 184/203/188 +f 180/190/175 179/189/174 194/204/189 195/205/190 +f 167/192/177 166/191/176 181/206/191 182/207/192 +f 178/194/179 177/193/178 192/208/193 193/209/194 +f 176/195/180 175/182/167 190/197/182 191/210/195 +f 174/181/166 173/184/169 188/199/184 189/196/181 +f 172/183/168 171/186/171 186/201/186 187/198/183 +f 170/185/170 169/188/173 184/203/188 185/200/185 +f 168/187/172 167/192/177 182/207/192 183/202/187 +f 179/189/174 178/194/179 193/209/194 194/204/189 +f 177/193/178 176/195/180 191/210/195 192/208/193 +f 190/197/182 189/196/181 204/211/196 205/212/197 +f 188/199/184 187/198/183 202/213/198 203/214/199 +f 186/201/186 185/200/185 200/215/200 201/216/201 +f 184/203/188 183/202/187 198/217/202 199/218/203 +f 195/205/190 194/204/189 209/219/204 210/220/205 +f 182/207/192 181/206/191 196/221/206 197/222/207 +f 193/209/194 192/208/193 207/223/208 208/224/209 +f 191/210/195 190/197/182 205/212/197 206/225/210 +f 189/196/181 188/199/184 203/214/199 204/211/196 +f 187/198/183 186/201/186 201/216/201 202/213/198 +f 185/200/185 184/203/188 199/218/203 200/215/200 +f 183/202/187 182/207/192 197/222/207 198/217/202 +f 194/204/189 193/209/194 208/224/209 209/219/204 +f 192/208/193 191/210/195 206/225/210 207/223/208 +f 205/212/197 204/211/196 219/226/211 220/227/212 +f 203/214/199 202/213/198 217/228/213 218/229/214 +f 201/216/201 200/215/200 215/230/215 216/231/216 +f 199/218/203 198/217/202 213/232/217 214/233/218 +f 210/220/205 209/219/204 224/234/219 225/235/220 +f 197/222/207 196/221/206 211/236/221 212/237/222 +f 208/224/209 207/223/208 222/238/223 223/239/224 +f 206/225/210 205/212/197 220/227/212 221/240/225 +f 204/211/196 203/214/199 218/229/214 219/226/211 +f 202/213/198 201/216/201 216/231/216 217/228/213 +f 200/215/200 199/218/203 214/233/218 215/230/215 +f 198/217/202 197/222/207 212/237/222 213/232/217 +f 209/219/204 208/224/209 223/239/224 224/234/219 +f 207/223/208 206/225/210 221/240/225 222/238/223 +f 220/227/212 219/226/211 234/241/226 235/242/227 +f 218/229/214 217/228/213 232/243/228 233/244/229 +f 216/231/216 215/230/215 230/245/230 231/246/231 +f 214/233/218 213/232/217 228/247/232 229/248/233 +f 225/235/220 224/234/219 239/249/234 240/250/235 +f 212/237/222 211/236/221 226/251/236 227/252/237 +f 223/239/224 222/238/223 237/253/238 238/254/239 +f 221/240/225 220/227/212 235/242/227 236/255/240 +f 219/226/211 218/229/214 233/244/229 234/241/226 +f 217/228/213 216/231/216 231/246/231 232/243/228 +f 215/230/215 214/233/218 229/248/233 230/245/230 +f 213/232/217 212/237/222 227/252/237 228/247/232 +f 224/234/219 223/239/224 238/254/239 239/249/234 +f 222/238/223 221/240/225 236/255/240 237/253/238 +f 235/242/227 234/241/226 249/21/241 250/18/242 +f 233/244/229 232/243/228 247/25/243 248/22/244 +f 231/246/231 230/245/230 245/29/245 246/26/246 +f 229/248/233 228/247/232 243/2/247 244/1/248 +f 240/250/235 239/249/234 254/6/249 255/5/250 +f 227/252/237 226/251/236 241/10/251 242/9/252 +f 238/254/239 237/253/238 252/14/253 253/13/254 +f 236/255/240 235/242/227 250/18/242 251/17/255 +f 234/241/226 233/244/229 248/22/244 249/21/241 +f 232/243/228 231/246/231 246/26/246 247/25/243 +f 230/245/230 229/248/233 244/1/248 245/29/245 +f 228/247/232 227/252/237 242/9/252 243/2/247 +f 239/249/234 238/254/239 253/13/254 254/6/249 +f 237/253/238 236/255/240 251/17/255 252/14/253 +f 250/18/242 249/21/241 264/24/256 265/19/257 +f 248/22/244 247/25/243 262/28/258 263/23/259 +f 246/26/246 245/29/245 260/30/260 261/27/261 +f 244/1/248 243/2/247 258/3/262 259/4/263 +f 255/5/250 254/6/249 269/7/264 270/8/265 +f 242/9/252 241/10/251 256/11/266 257/12/267 +f 253/13/254 252/14/253 267/15/268 268/16/269 +f 251/17/255 250/18/242 265/19/257 266/20/270 +f 249/21/241 248/22/244 263/23/259 264/24/256 +f 247/25/243 246/26/246 261/27/261 262/28/258 +f 245/29/245 244/1/248 259/4/263 260/30/260 +f 243/2/247 242/9/252 257/12/267 258/3/262 +f 254/6/249 253/13/254 268/16/269 269/7/264 +f 252/14/253 251/17/255 266/20/270 267/15/268 +f 265/19/257 264/24/256 279/31/271 280/32/272 +f 263/23/259 262/28/258 277/33/273 278/34/274 +f 261/27/261 260/30/260 275/35/275 276/36/276 +f 259/4/263 258/3/262 273/37/277 274/38/278 +f 270/8/265 269/7/264 284/39/279 285/40/280 +f 257/12/267 256/11/266 271/41/281 272/42/282 +f 268/16/269 267/15/268 282/43/283 283/44/284 +f 266/20/270 265/19/257 280/32/272 281/45/285 +f 264/24/256 263/23/259 278/34/274 279/31/271 +f 262/28/258 261/27/261 276/36/276 277/33/273 +f 260/30/260 259/4/263 274/38/278 275/35/275 +f 258/3/262 257/12/267 272/42/282 273/37/277 +f 269/7/264 268/16/269 283/44/284 284/39/279 +f 267/15/268 266/20/270 281/45/285 282/43/283 +f 280/32/272 279/31/271 294/46/286 295/47/287 +f 278/34/274 277/33/273 292/48/288 293/49/289 +f 276/36/276 275/35/275 290/50/290 291/51/291 +f 274/38/278 273/37/277 288/52/292 289/53/293 +f 285/40/280 284/39/279 299/54/294 300/55/295 +f 272/42/282 271/41/281 286/56/296 287/57/297 +f 283/44/284 282/43/283 297/58/298 298/59/299 +f 281/45/285 280/32/272 295/47/287 296/60/300 +f 279/31/271 278/34/274 293/49/289 294/46/286 +f 277/33/273 276/36/276 291/51/291 292/48/288 +f 275/35/275 274/38/278 289/53/293 290/50/290 +f 273/37/277 272/42/282 287/57/297 288/52/292 +f 284/39/279 283/44/284 298/59/299 299/54/294 +f 282/43/283 281/45/285 296/60/300 297/58/298 +f 295/47/287 294/46/286 309/61/301 310/62/302 +f 293/49/289 292/48/288 307/63/303 308/64/304 +f 291/51/291 290/50/290 305/65/305 306/66/306 +f 289/53/293 288/52/292 303/67/307 304/68/308 +f 300/55/295 299/54/294 314/69/309 315/70/310 +f 287/57/297 286/56/296 301/71/311 302/72/312 +f 298/59/299 297/58/298 312/73/313 313/74/314 +f 296/60/300 295/47/287 310/62/302 311/75/315 +f 294/46/286 293/49/289 308/64/304 309/61/301 +f 292/48/288 291/51/291 306/66/306 307/63/303 +f 290/50/290 289/53/293 304/68/308 305/65/305 +f 288/52/292 287/57/297 302/72/312 303/67/307 +f 299/54/294 298/59/299 313/74/314 314/69/309 +f 297/58/298 296/60/300 311/75/315 312/73/313 +f 310/62/302 309/61/301 324/76/316 325/77/317 +f 308/64/304 307/63/303 322/78/318 323/79/319 +f 306/66/306 305/65/305 320/80/320 321/81/321 +f 304/68/308 303/67/307 318/82/322 319/83/323 +f 315/70/310 314/69/309 329/84/324 330/85/325 +f 302/72/312 301/71/311 316/86/326 317/87/327 +f 313/74/314 312/73/313 327/88/328 328/89/329 +f 311/75/315 310/62/302 325/77/317 326/90/330 +f 309/61/301 308/64/304 323/79/319 324/76/316 +f 307/63/303 306/66/306 321/81/321 322/78/318 +f 305/65/305 304/68/308 319/83/323 320/80/320 +f 303/67/307 302/72/312 317/87/327 318/82/322 +f 314/69/309 313/74/314 328/89/329 329/84/324 +f 312/73/313 311/75/315 326/90/330 327/88/328 +f 325/77/317 324/76/316 339/91/331 340/92/332 +f 323/79/319 322/78/318 337/93/333 338/94/334 +f 321/81/321 320/80/320 335/95/335 336/96/336 +f 319/83/323 318/82/322 333/97/337 334/98/338 +f 330/85/325 329/84/324 344/99/339 345/100/340 +f 317/87/327 316/86/326 331/101/341 332/102/342 +f 328/89/329 327/88/328 342/103/343 343/104/344 +f 326/90/330 325/77/317 340/92/332 341/105/345 +f 324/76/316 323/79/319 338/94/334 339/91/331 +f 322/78/318 321/81/321 336/96/336 337/93/333 +f 320/80/320 319/83/323 334/98/338 335/95/335 +f 318/82/322 317/87/327 332/102/342 333/97/337 +f 329/84/324 328/89/329 343/104/344 344/99/339 +f 327/88/328 326/90/330 341/105/345 342/103/343 +f 340/92/332 339/91/331 354/106/346 355/107/347 +f 338/94/334 337/93/333 352/108/348 353/109/349 +f 336/96/336 335/95/335 350/110/350 351/111/351 +f 334/98/338 333/97/337 348/112/352 349/113/353 +f 345/100/340 344/99/339 359/114/354 360/115/355 +f 332/102/342 331/101/341 346/116/356 347/117/357 +f 343/104/344 342/103/343 357/118/358 358/119/359 +f 341/105/345 340/92/332 355/107/347 356/120/360 +f 339/91/331 338/94/334 353/109/349 354/106/346 +f 337/93/333 336/96/336 351/111/351 352/108/348 +f 335/95/335 334/98/338 349/113/353 350/110/350 +f 333/97/337 332/102/342 347/117/357 348/112/352 +f 344/99/339 343/104/344 358/119/359 359/114/354 +f 342/103/343 341/105/345 356/120/360 357/118/358 +f 355/121/347 354/122/346 369/123/361 370/124/362 +f 353/125/349 352/126/348 367/127/363 368/128/364 +f 351/129/351 350/130/350 365/131/365 366/132/366 +f 349/133/353 348/134/352 363/135/367 364/136/368 +f 360/137/355 359/138/354 374/139/369 375/140/370 +f 347/141/357 346/142/356 361/143/371 362/144/372 +f 358/145/359 357/146/358 372/147/373 373/148/374 +f 356/149/360 355/121/347 370/124/362 371/150/375 +f 354/122/346 353/125/349 368/128/364 369/123/361 +f 352/126/348 351/129/351 366/132/366 367/127/363 +f 350/130/350 349/133/353 364/136/368 365/131/365 +f 348/134/352 347/141/357 362/144/372 363/135/367 +f 359/138/354 358/145/359 373/148/374 374/139/369 +f 357/146/358 356/149/360 371/150/375 372/147/373 +f 370/124/362 369/123/361 384/151/376 385/152/377 +f 368/128/364 367/127/363 382/153/378 383/154/379 +f 366/132/366 365/131/365 380/155/380 381/156/381 +f 364/136/368 363/135/367 378/157/382 379/158/383 +f 375/140/370 374/139/369 389/159/384 390/160/385 +f 362/144/372 361/143/371 376/161/386 377/162/387 +f 373/148/374 372/147/373 387/163/388 388/164/389 +f 371/150/375 370/124/362 385/152/377 386/165/390 +f 369/123/361 368/128/364 383/154/379 384/151/376 +f 367/127/363 366/132/366 381/156/381 382/153/378 +f 365/131/365 364/136/368 379/158/383 380/155/380 +f 363/135/367 362/144/372 377/162/387 378/157/382 +f 374/139/369 373/148/374 388/164/389 389/159/384 +f 372/147/373 371/150/375 386/165/390 387/163/388 +f 385/152/377 384/151/376 399/166/391 400/167/392 +f 383/154/379 382/153/378 397/168/393 398/169/394 +f 381/156/381 380/155/380 395/170/395 396/171/396 +f 379/158/383 378/157/382 393/172/397 394/173/398 +f 390/160/385 389/159/384 404/174/399 405/175/400 +f 377/162/387 376/161/386 391/176/401 392/177/402 +f 388/164/389 387/163/388 402/178/403 403/179/404 +f 386/165/390 385/152/377 400/167/392 401/180/405 +f 384/151/376 383/154/379 398/169/394 399/166/391 +f 382/153/378 381/156/381 396/171/396 397/168/393 +f 380/155/380 379/158/383 394/173/398 395/170/395 +f 378/157/382 377/162/387 392/177/402 393/172/397 +f 389/159/384 388/164/389 403/179/404 404/174/399 +f 387/163/388 386/165/390 401/180/405 402/178/403 +f 400/167/392 399/166/391 414/181/406 415/182/407 +f 398/169/394 397/168/393 412/183/408 413/184/409 +f 396/171/396 395/170/395 410/185/410 411/186/411 +f 394/173/398 393/172/397 408/187/412 409/188/413 +f 405/175/400 404/174/399 419/189/414 420/190/415 +f 392/177/402 391/176/401 406/191/416 407/192/417 +f 403/179/404 402/178/403 417/193/418 418/194/419 +f 401/180/405 400/167/392 415/182/407 416/195/420 +f 399/166/391 398/169/394 413/184/409 414/181/406 +f 397/168/393 396/171/396 411/186/411 412/183/408 +f 395/170/395 394/173/398 409/188/413 410/185/410 +f 393/172/397 392/177/402 407/192/417 408/187/412 +f 404/174/399 403/179/404 418/194/419 419/189/414 +f 402/178/403 401/180/405 416/195/420 417/193/418 +f 415/182/407 414/181/406 429/196/421 430/197/422 +f 413/184/409 412/183/408 427/198/423 428/199/424 +f 411/186/411 410/185/410 425/200/425 426/201/426 +f 409/188/413 408/187/412 423/202/427 424/203/428 +f 420/190/415 419/189/414 434/204/429 435/205/430 +f 407/192/417 406/191/416 421/206/431 422/207/432 +f 418/194/419 417/193/418 432/208/433 433/209/434 +f 416/195/420 415/182/407 430/197/422 431/210/435 +f 414/181/406 413/184/409 428/199/424 429/196/421 +f 412/183/408 411/186/411 426/201/426 427/198/423 +f 410/185/410 409/188/413 424/203/428 425/200/425 +f 408/187/412 407/192/417 422/207/432 423/202/427 +f 419/189/414 418/194/419 433/209/434 434/204/429 +f 417/193/418 416/195/420 431/210/435 432/208/433 +f 430/197/422 429/196/421 444/211/436 445/212/437 +f 428/199/424 427/198/423 442/213/438 443/214/439 +f 426/201/426 425/200/425 440/215/440 441/216/441 +f 424/203/428 423/202/427 438/217/442 439/218/443 +f 435/205/430 434/204/429 449/219/444 450/220/445 +f 422/207/432 421/206/431 436/221/446 437/222/447 +f 433/209/434 432/208/433 447/223/448 448/224/449 +f 431/210/435 430/197/422 445/212/437 446/225/450 +f 429/196/421 428/199/424 443/214/439 444/211/436 +f 427/198/423 426/201/426 441/216/441 442/213/438 +f 425/200/425 424/203/428 439/218/443 440/215/440 +f 423/202/427 422/207/432 437/222/447 438/217/442 +f 434/204/429 433/209/434 448/224/449 449/219/444 +f 432/208/433 431/210/435 446/225/450 447/223/448 +f 445/212/437 444/211/436 459/226/451 460/227/452 +f 443/214/439 442/213/438 457/228/453 458/229/454 +f 441/216/441 440/215/440 455/230/455 456/231/456 +f 439/218/443 438/217/442 453/232/457 454/233/458 +f 450/220/445 449/219/444 464/234/459 465/235/460 +f 437/222/447 436/221/446 451/236/461 452/237/462 +f 448/224/449 447/223/448 462/238/463 463/239/464 +f 446/225/450 445/212/437 460/227/452 461/240/465 +f 444/211/436 443/214/439 458/229/454 459/226/451 +f 442/213/438 441/216/441 456/231/456 457/228/453 +f 440/215/440 439/218/443 454/233/458 455/230/455 +f 438/217/442 437/222/447 452/237/462 453/232/457 +f 449/219/444 448/224/449 463/239/464 464/234/459 +f 447/223/448 446/225/450 461/240/465 462/238/463 +f 460/227/452 459/226/451 474/241/466 475/242/467 +f 458/229/454 457/228/453 472/243/468 473/244/469 +f 456/231/456 455/230/455 470/245/470 471/246/471 +f 454/233/458 453/232/457 468/247/472 469/248/473 +f 465/235/460 464/234/459 479/249/474 480/250/475 +f 452/237/462 451/236/461 466/251/476 467/252/477 +f 463/239/464 462/238/463 477/253/478 478/254/479 +f 461/240/465 460/227/452 475/242/467 476/255/480 +f 459/226/451 458/229/454 473/244/469 474/241/466 +f 457/228/453 456/231/456 471/246/471 472/243/468 +f 455/230/455 454/233/458 469/248/473 470/245/470 +f 453/232/457 452/237/462 467/252/477 468/247/472 +f 464/234/459 463/239/464 478/254/479 479/249/474 +f 462/238/463 461/240/465 476/255/480 477/253/478 +f 481/256/481 15/5/5 30/8/8 485/257/482 +f 485/257/482 30/8/8 45/40/40 487/258/483 +f 487/258/483 45/40/40 60/55/55 489/259/484 +f 489/259/484 60/55/55 75/70/70 491/260/485 +f 491/260/485 75/70/70 90/85/85 493/261/486 +f 493/261/486 90/85/85 105/100/100 495/262/487 +f 495/262/487 105/100/100 120/115/115 497/263/488 +f 497/264/488 120/137/115 135/140/130 499/265/489 +f 499/265/489 135/140/130 150/160/145 501/266/490 +f 501/266/490 150/160/145 165/175/160 503/267/491 +f 503/267/491 165/175/160 180/190/175 505/268/492 +f 505/268/492 180/190/175 195/205/190 507/269/493 +f 507/269/493 195/205/190 210/220/205 509/270/494 +f 509/270/494 210/220/205 225/235/220 511/271/495 +f 511/271/495 225/235/220 240/250/235 513/272/496 +f 513/272/496 240/250/235 255/5/250 515/256/497 +f 515/256/497 255/5/250 270/8/265 517/257/498 +f 517/257/498 270/8/265 285/40/280 519/258/499 +f 519/258/499 285/40/280 300/55/295 521/259/500 +f 521/259/500 300/55/295 315/70/310 523/260/501 +f 523/260/501 315/70/310 330/85/325 525/261/502 +f 525/261/502 330/85/325 345/100/340 527/262/503 +f 527/262/503 345/100/340 360/115/355 529/263/504 +f 529/264/504 360/137/355 375/140/370 531/265/505 +f 531/265/505 375/140/370 390/160/385 533/266/506 +f 533/266/506 390/160/385 405/175/400 534/267/507 +f 534/267/507 405/175/400 420/190/415 536/268/508 +f 536/268/508 420/190/415 435/205/430 538/269/509 +f 538/269/509 435/205/430 450/220/445 540/270/510 +f 540/270/510 450/220/445 465/235/460 542/271/511 +f 542/271/511 465/235/460 480/250/475 544/272/512 +f 475/242/467 474/241/466 9/21/21 10/18/18 +f 473/244/469 472/243/468 7/25/25 8/22/22 +f 471/246/471 470/245/470 5/29/29 6/26/26 +f 469/248/473 468/247/472 3/2/2 4/1/1 +f 480/250/475 479/249/474 14/6/6 15/5/5 +f 467/252/477 466/251/476 1/10/10 2/9/9 +f 478/254/479 477/253/478 12/14/14 13/13/13 +f 476/255/480 475/242/467 10/18/18 11/17/17 +f 474/241/466 473/244/469 8/22/22 9/21/21 +f 472/243/468 471/246/471 6/26/26 7/25/25 +f 470/245/470 469/248/473 4/1/1 5/29/29 +f 544/272/512 480/250/475 15/5/5 481/256/481 +f 468/247/472 467/252/477 2/9/9 3/2/2 +f 479/249/474 478/254/479 13/13/13 14/6/6 +f 477/253/478 476/255/480 11/17/17 12/14/14 +f 466/251/476 543/273/513 483/274/514 1/10/10 +f 451/236/461 541/275/515 543/273/513 466/251/476 +f 436/221/446 539/276/516 541/275/515 451/236/461 +f 421/206/431 537/277/517 539/276/516 436/221/446 +f 406/191/416 535/278/518 537/277/517 421/206/431 +f 391/176/401 482/279/519 535/278/518 406/191/416 +f 376/161/386 532/280/520 482/279/519 391/176/401 +f 361/143/371 530/281/521 532/280/520 376/161/386 +f 346/142/356 528/282/522 530/281/521 361/143/371 +f 331/101/341 526/283/523 528/284/522 346/116/356 +f 316/86/326 524/285/524 526/283/523 331/101/341 +f 301/71/311 522/286/525 524/285/524 316/86/326 +f 286/56/296 520/287/526 522/286/525 301/71/311 +f 271/41/281 518/288/527 520/287/526 286/56/296 +f 256/11/266 516/289/528 518/288/527 271/41/281 +f 241/10/251 514/274/529 516/289/528 256/11/266 +f 226/251/236 512/273/530 514/274/529 241/10/251 +f 211/236/221 510/275/531 512/273/530 226/251/236 +f 196/221/206 508/276/532 510/275/531 211/236/221 +f 181/206/191 506/277/533 508/276/532 196/221/206 +f 166/191/176 504/278/534 506/277/533 181/206/191 +f 151/176/161 502/279/535 504/278/534 166/191/176 +f 136/161/146 500/280/536 502/279/535 151/176/161 +f 121/143/131 498/281/537 500/280/536 136/161/146 +f 106/142/116 496/282/538 498/281/537 121/143/131 +f 91/101/101 494/283/539 496/284/538 106/116/116 +f 76/86/86 492/285/540 494/283/539 91/101/101 +f 61/71/71 490/286/541 492/285/540 76/86/86 +f 46/56/56 488/287/542 490/286/541 61/71/71 +f 31/41/41 486/288/543 488/287/542 46/56/56 +f 16/11/11 484/289/544 486/288/543 31/41/41 +f 1/10/10 483/274/514 484/289/544 16/11/11 +f 543/290/513 541/291/515 539/292/516 537/293/517 535/294/518 482/295/519 532/296/520 530/297/521 528/298/522 526/299/523 524/300/524 522/301/525 520/302/526 518/303/527 516/304/528 514/305/529 512/306/530 510/307/531 508/308/532 506/309/533 504/310/534 502/311/535 500/312/536 498/313/537 496/314/538 494/315/539 492/316/540 490/317/541 488/318/542 486/319/543 484/320/544 483/321/514 +f 544/290/512 481/291/481 485/292/482 487/293/483 489/294/484 491/295/485 493/296/486 495/297/487 497/298/488 499/299/489 501/300/490 503/301/491 505/302/492 507/303/493 509/304/494 511/305/495 513/306/496 515/307/497 517/308/498 519/309/499 521/310/500 523/311/501 525/312/502 527/313/503 529/314/504 531/315/505 533/316/506 534/317/507 536/318/508 538/319/509 540/320/510 542/321/511 diff --git a/mods/technic_plus/technic_cnc/models/technic_cnc_two_curved_edge.obj b/mods/technic_plus/technic_cnc/models/technic_cnc_two_curved_edge.obj new file mode 100644 index 0000000..a468ddf --- /dev/null +++ b/mods/technic_plus/technic_cnc/models/technic_cnc_two_curved_edge.obj @@ -0,0 +1,207 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_corner_onetexture.blend' +# www.blender.org +o corner1_Cylinder +v 0.415732 0.277783 0.499997 +v 0.461936 0.191340 0.499997 +v 0.415735 0.277783 -0.415732 +v 0.461940 0.191340 -0.461937 +v 0.490389 0.097544 0.499997 +v 0.353551 0.353551 0.499997 +v 0.353555 0.353551 -0.353551 +v 0.499996 -0.000000 0.499997 +v 0.277783 0.415732 0.499997 +v 0.490393 0.097544 -0.490389 +v 0.277787 0.415732 -0.277784 +v 0.191340 0.461936 0.499997 +v 0.191344 0.461937 -0.191341 +v 0.097544 0.490389 0.499997 +v 0.097547 0.490391 -0.097545 +v -0.000000 0.499996 0.499997 +v -0.499997 0.499997 0.499997 +v -0.499997 0.499997 -0.000030 +v -0.499997 0.415735 -0.277785 +v -0.499997 0.461940 -0.191342 +v -0.499997 0.490393 -0.097545 +v -0.500000 -0.500000 -0.500000 +v -0.499997 -0.499997 0.499997 +v 0.000000 0.499998 0.000000 +v -0.499998 0.000014 -0.499999 +v -0.499997 0.353553 -0.353554 +v -0.499998 0.097545 -0.490393 +v -0.499997 0.277785 -0.415735 +v -0.499998 0.191342 -0.461940 +v 0.499997 -0.000000 -0.499996 +v 0.500000 -0.500000 -0.500000 +v 0.499997 -0.499997 0.499997 +v -0.499997 -0.499997 0.499997 +v -0.499997 0.499997 0.499997 +v -0.499997 0.499997 -0.000030 +v -0.499997 0.415735 -0.277785 +v -0.499997 0.461940 -0.191342 +v -0.499997 0.490393 -0.097545 +v -0.500000 -0.500000 -0.500000 +v -0.499998 0.000014 -0.499999 +v -0.499997 0.353553 -0.353554 +v -0.499998 0.097545 -0.490393 +v -0.499997 0.277785 -0.415735 +v -0.499998 0.191342 -0.461940 +v -0.499998 -0.033351 0.033348 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.499997 -0.499997 0.499997 +v 0.415732 0.277783 0.499997 +v 0.461936 0.191340 0.499997 +v 0.490389 0.097544 0.499997 +v 0.353551 0.353551 0.499997 +v 0.499996 -0.000000 0.499997 +v 0.277783 0.415732 0.499997 +v 0.191340 0.461936 0.499997 +v -0.499997 -0.499997 0.499997 +v 0.097544 0.490389 0.499997 +v -0.000000 0.499996 0.499997 +v -0.499997 0.499997 0.499997 +v -0.033351 -0.033351 0.499997 +v 0.499997 -0.499997 0.499997 +vt 1.000000 0.500100 +vt 0.990395 0.597625 +vt 0.466756 0.466756 +vt 1.000000 0.000200 +vt 0.000201 0.000201 +vt 0.597626 0.990394 +vt 0.500101 1.000000 +vt 0.691404 0.961947 +vt 0.777830 0.915751 +vt 0.853583 0.853583 +vt 0.915752 0.777829 +vt 0.000201 1.000000 +vt 0.961948 0.691403 +vt -0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 0.533443 0.466757 +vt 0.000202 0.500115 +vt 0.402575 0.990397 +vt 0.308797 0.961949 +vt 0.222371 0.915753 +vt 0.146617 0.853584 +vt 0.084449 0.777831 +vt 0.038253 0.691405 +vt 0.009806 0.597626 +vt 0.999996 0.125448 +vt 0.222353 0.125462 +vt 0.146597 0.000612 +vt 0.999995 0.000594 +vt 0.000178 0.874582 +vt 0.915751 0.874577 +vt 0.853580 0.999436 +vt 0.000178 0.999439 +vt 0.999808 0.625427 +vt 0.009599 0.625446 +vt -0.000005 0.500594 +vt 0.999807 0.500594 +vt 0.597441 0.374574 +vt 0.499912 0.499435 +vt 0.000000 0.499434 +vt 0.000000 0.374576 +vt 0.999999 0.375154 +vt 1.000000 0.499969 +vt 0.500093 0.500015 +vt 0.402562 0.375164 +vt 0.999812 0.999983 +vt 0.146415 1.000000 +vt 0.084244 0.875149 +vt 0.999811 0.875131 +vt 0.990396 0.624861 +vt 0.961947 0.749719 +vt 0.000178 0.749724 +vt 0.000178 0.624866 +vt 0.777649 0.124857 +vt 0.691221 0.249715 +vt 0.000001 0.249719 +vt 0.000001 0.124861 +vt 0.308782 0.250314 +vt 0.999998 0.250301 +vt 0.853403 -0.000000 +vt 0.038047 0.750298 +vt 0.999809 0.750280 +vt 0.000177 0.500008 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.831500 -0.555600 +vn 0.325800 0.887500 -0.325800 +vn 0.429700 0.794100 -0.429700 +vn 0.000000 0.707100 -0.707100 +vn 0.831500 0.555600 0.000000 +vn 0.531000 0.660300 -0.531000 +vn 0.707100 0.707100 0.000000 +vn 0.000000 0.195100 -0.980800 +vn 0.683900 0.254100 -0.683900 +vn 0.705500 0.067100 -0.705500 +vn 0.000000 0.049100 -0.998800 +vn 0.123100 0.984700 -0.123100 +vn 0.036800 0.998600 -0.036800 +vn 0.049100 0.998800 0.000000 +vn 0.195100 0.980800 0.000000 +vn 0.000000 0.980800 -0.195100 +vn 0.000000 0.998800 -0.049100 +vn 0.000000 0.555600 -0.831500 +vn 0.620400 0.479600 -0.620400 +vn 0.923900 0.382700 0.000000 +vn 0.980800 0.195100 0.000000 +vn 0.223300 0.948800 -0.223200 +vn 0.382700 0.923900 0.000000 +vn 0.555600 0.831500 0.000000 +vn 0.000000 0.923900 -0.382700 +vn 0.000000 0.382700 -0.923900 +vn 0.998800 0.049100 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +s off +f 53/1/1 51/2/1 60/3/1 +f 61/4/1 53/1/1 60/3/1 56/5/1 +f 57/6/1 58/7/1 60/3/1 +f 55/8/1 57/6/1 60/3/1 +f 54/9/1 55/8/1 60/3/1 +f 52/10/1 54/9/1 60/3/1 +f 49/11/1 52/10/1 60/3/1 +f 59/12/1 56/5/1 60/3/1 58/7/1 +f 50/13/1 49/11/1 60/3/1 +f 48/14/2 23/15/2 46/16/2 47/17/2 +f 39/5/3 33/4/3 45/18/3 40/19/3 +f 35/7/3 38/20/3 45/18/3 +f 38/20/3 37/21/3 45/18/3 +f 37/21/3 36/22/3 45/18/3 +f 36/22/3 41/23/3 45/18/3 +f 41/23/3 43/24/3 45/18/3 +f 43/24/3 44/25/3 45/18/3 +f 44/25/3 42/26/3 45/18/3 +f 42/26/3 40/19/3 45/18/3 +f 34/16/3 35/7/3 45/18/3 33/4/3 +f 51/2/1 50/13/1 60/3/1 +s 1 +f 19/27/4 11/28/5 7/29/6 26/30/7 +f 1/31/8 3/32/9 7/33/6 6/34/10 +f 27/35/11 10/36/12 30/37/13 25/38/14 +f 15/39/15 24/40/16 16/41/17 14/42/18 +f 21/43/19 18/44/20 24/45/16 15/46/15 +f 26/47/7 7/48/6 3/49/9 28/50/21 +f 10/51/12 4/52/22 2/53/23 5/54/24 +f 11/55/5 13/56/25 12/57/26 9/58/27 +f 21/43/19 15/46/15 13/59/25 20/60/28 +f 20/60/28 13/59/25 11/28/5 19/27/4 +f 9/58/27 6/14/10 7/61/6 11/55/5 +f 4/52/22 3/32/9 1/31/8 2/53/23 +f 3/49/9 4/62/22 29/63/29 28/50/21 +f 10/51/12 5/54/24 8/64/30 30/44/13 +f 29/63/29 4/62/22 10/36/12 27/35/11 +f 25/44/14 30/65/13 31/14/31 22/15/32 +f 16/66/17 24/67/16 18/44/20 17/16/33 +f 8/65/30 32/14/34 31/15/31 30/44/13 +f 12/57/26 13/56/25 15/39/15 14/42/18 diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_bottom.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_bottom.png new file mode 100644 index 0000000..fc907e3 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_bottom.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_cylinder.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_cylinder.png new file mode 100644 index 0000000..c82e8ce Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_cylinder.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_cylinder_horizontal.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_cylinder_horizontal.png new file mode 100644 index 0000000..edf07c3 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_cylinder_horizontal.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_element_cross.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_cross.png new file mode 100644 index 0000000..6f879b3 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_cross.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_element_edge.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_edge.png new file mode 100644 index 0000000..6668296 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_edge.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_element_end.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_end.png new file mode 100644 index 0000000..e8dbbfe Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_end.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_element_straight.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_straight.png new file mode 100644 index 0000000..5c2d5b4 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_straight.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_element_t.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_t.png new file mode 100644 index 0000000..f60b5ef Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_element_t.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_front.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_front.png new file mode 100644 index 0000000..e1bf419 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_front.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_front_active.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_front_active.png new file mode 100644 index 0000000..2c53def Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_front_active.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_full.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_full.png new file mode 100644 index 0000000..7f40364 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_full.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_half.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_half.png new file mode 100644 index 0000000..e32dd6a Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_half.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_milling_background.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_milling_background.png new file mode 100644 index 0000000..56bccc1 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_milling_background.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_oblate_spheroid.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_oblate_spheroid.png new file mode 100644 index 0000000..7109d3e Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_oblate_spheroid.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_onecurvededge.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_onecurvededge.png new file mode 100644 index 0000000..4bdceba Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_onecurvededge.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_pyramid.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_pyramid.png new file mode 100644 index 0000000..2f299a2 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_pyramid.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_side.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_side.png new file mode 100644 index 0000000..4feb412 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_side.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope.png new file mode 100644 index 0000000..d2b3ce4 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_edge.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_edge.png new file mode 100644 index 0000000..3906f50 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_edge.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_edge_upsdwn.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_edge_upsdwn.png new file mode 100644 index 0000000..f507d0f Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_edge_upsdwn.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_inner_edge.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_inner_edge.png new file mode 100644 index 0000000..0184ef1 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_inner_edge.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_inner_edge_upsdwn.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_inner_edge_upsdwn.png new file mode 100644 index 0000000..8b4aa25 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_inner_edge_upsdwn.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_lying.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_lying.png new file mode 100644 index 0000000..32ff8ab Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_lying.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_upsdwn.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_upsdwn.png new file mode 100644 index 0000000..d15bf2b Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_slope_upsdwn.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_sphere.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_sphere.png new file mode 100644 index 0000000..61e71ff Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_sphere.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_spike.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_spike.png new file mode 100644 index 0000000..cf82667 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_spike.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_stick.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_stick.png new file mode 100644 index 0000000..c284642 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_stick.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_top.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_top.png new file mode 100644 index 0000000..7fcf617 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_top.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_top_active.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_top_active.png new file mode 100644 index 0000000..24e3cd4 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_top_active.png differ diff --git a/mods/technic_plus/technic_cnc/textures/technic_cnc_twocurvededge.png b/mods/technic_plus/technic_cnc/textures/technic_cnc_twocurvededge.png new file mode 100644 index 0000000..5d7fbe5 Binary files /dev/null and b/mods/technic_plus/technic_cnc/textures/technic_cnc_twocurvededge.png differ diff --git a/mods/technic_plus/technic_worldgen/config.lua b/mods/technic_plus/technic_worldgen/config.lua new file mode 100644 index 0000000..4ac748c --- /dev/null +++ b/mods/technic_plus/technic_worldgen/config.lua @@ -0,0 +1,15 @@ +technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf") + +local conf_table = technic.config:to_table() + +local defaults = { + enable_granite_generation = "true", + enable_marble_generation = "true", + enable_rubber_tree_generation = "true", +} + +for k, v in pairs(defaults) do + if conf_table[k] == nil then + technic.config:set(k, v) + end +end diff --git a/mods/technic_plus/technic_worldgen/crafts.lua b/mods/technic_plus/technic_worldgen/crafts.lua new file mode 100644 index 0000000..71294cf --- /dev/null +++ b/mods/technic_plus/technic_worldgen/crafts.lua @@ -0,0 +1,194 @@ + +local S = technic.worldgen.gettext + +minetest.register_craftitem(":technic:uranium_lump", { + description = S("Uranium Lump"), + inventory_image = "technic_uranium_lump.png", +}) +minetest.register_alias("technic:uranium", "technic:uranium_lump") + +minetest.register_craftitem(":technic:uranium_ingot", { + description = S("Uranium Ingot"), + inventory_image = "technic_uranium_ingot.png", + groups = {uranium_ingot=1}, +}) + +minetest.register_craftitem(":technic:chromium_lump", { + description = S("Chromium Lump"), + inventory_image = "technic_chromium_lump.png", +}) + +minetest.register_craftitem(":technic:chromium_ingot", { + description = S("Chromium Ingot"), + inventory_image = "technic_chromium_ingot.png", +}) + +minetest.register_craftitem(":technic:zinc_lump", { + description = S("Zinc Lump"), + inventory_image = "technic_zinc_lump.png", +}) + +minetest.register_craftitem(":technic:zinc_ingot", { + description = S("Zinc Ingot"), + inventory_image = "technic_zinc_ingot.png", +}) + +minetest.register_craftitem(":technic:lead_lump", { + description = S("Lead Lump"), + inventory_image = "technic_lead_lump.png", +}) + +minetest.register_craftitem(":technic:lead_ingot", { + description = S("Lead Ingot"), + inventory_image = "technic_lead_ingot.png", +}) + +minetest.register_craftitem(":technic:sulfur_lump", { + description = S("Sulfur Lump"), + inventory_image = "technic_sulfur_lump.png", +}) + +minetest.register_alias("technic:wrought_iron_ingot", "default:steel_ingot") + +minetest.override_item("default:steel_ingot", { + description = S("Wrought Iron Ingot"), + -- make the color of the ingot a bit darker to separate it better from tin + inventory_image = "technic_wrought_iron_ingot.png^[multiply:#bbbbbbff", +}) + +minetest.register_craftitem(":technic:cast_iron_ingot", { + description = S("Cast Iron Ingot"), + inventory_image = "technic_cast_iron_ingot.png", +}) + +minetest.register_craftitem(":technic:carbon_steel_ingot", { + description = S("Carbon Steel Ingot"), + inventory_image = "technic_carbon_steel_ingot.png", +}) + +minetest.register_craftitem(":technic:stainless_steel_ingot", { + description = S("Stainless Steel Ingot"), + inventory_image = "technic_stainless_steel_ingot.png", +}) + +local function register_block(block, ingot) + minetest.register_craft({ + output = block, + recipe = { + {ingot, ingot, ingot}, + {ingot, ingot, ingot}, + {ingot, ingot, ingot}, + } + }) + + minetest.register_craft({ + output = ingot.." 9", + recipe = { + {block} + } + }) +end + +register_block("technic:uranium_block", "technic:uranium_ingot") +register_block("technic:chromium_block", "technic:chromium_ingot") +register_block("technic:zinc_block", "technic:zinc_ingot") +register_block("technic:lead_block", "technic:lead_ingot") +register_block("technic:cast_iron_block", "technic:cast_iron_ingot") +register_block("technic:carbon_steel_block", "technic:carbon_steel_ingot") +register_block("technic:stainless_steel_block", "technic:stainless_steel_ingot") +register_block("technic:sulfur_block", "technic:sulfur_lump") + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:zinc_lump", + output = "technic:zinc_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:chromium_lump", + output = "technic:chromium_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:uranium_lump", + output = "technic:uranium_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:lead_lump", + output = "technic:lead_ingot", +}) + + +minetest.register_craft({ + type = 'cooking', + recipe = minetest.registered_aliases["technic:wrought_iron_ingot"], + output = "technic:cast_iron_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:cast_iron_ingot", + cooktime = 2, + output = "technic:wrought_iron_ingot", +}) + +minetest.register_craft({ + type = 'cooking', + recipe = "technic:carbon_steel_ingot", + cooktime = 2, + output = "technic:wrought_iron_ingot", +}) + +local function for_each_registered_item(action) + local already_reg = {} + for k, _ in pairs(minetest.registered_items) do + table.insert(already_reg, k) + end + local really_register_craftitem = minetest.register_craftitem + minetest.register_craftitem = function(name, def) + really_register_craftitem(name, def) + action(string.gsub(name, "^:", "")) + end + local really_register_tool = minetest.register_tool + minetest.register_tool = function(name, def) + really_register_tool(name, def) + action(string.gsub(name, "^:", "")) + end + local really_register_node = minetest.register_node + minetest.register_node = function(name, def) + really_register_node(name, def) + action(string.gsub(name, "^:", "")) + end + for _, name in ipairs(already_reg) do + action(name) + end +end + +local steel_to_iron = {} +for _, i in ipairs({ + "default:axe_steel", + "default:pick_steel", + "default:shovel_steel", + "default:sword_steel", + "doors:door_steel", + "farming:hoe_steel", + "glooptest:hammer_steel", + "glooptest:handsaw_steel", + "glooptest:reinforced_crystal_glass", + "mesecons_doors:op_door_steel", + "mesecons_doors:sig_door_steel", + "vessels:steel_bottle", +}) do + steel_to_iron[i] = true +end + +for_each_registered_item(function(item_name) + local item_def = minetest.registered_items[item_name] + if steel_to_iron[item_name] and string.find(item_def.description, "Steel") then + minetest.override_item(item_name, { description = string.gsub(item_def.description, "Steel", S("Iron")) }) + end +end) diff --git a/mods/technic_plus/technic_worldgen/depends.txt b/mods/technic_plus/technic_worldgen/depends.txt new file mode 100644 index 0000000..6a92b7d --- /dev/null +++ b/mods/technic_plus/technic_worldgen/depends.txt @@ -0,0 +1,9 @@ +default +basic_materials +intllib? +mg? +doors? +farming? +glooptest? +mesecons_doors? +vessels? diff --git a/mods/technic_plus/technic_worldgen/init.lua b/mods/technic_plus/technic_worldgen/init.lua new file mode 100644 index 0000000..2f36920 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/init.lua @@ -0,0 +1,26 @@ +local modpath = minetest.get_modpath("technic_worldgen") + +technic = rawget(_G, "technic") or {} +technic.worldgen = { + gettext = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end, +} + +dofile(modpath.."/config.lua") +dofile(modpath.."/nodes.lua") +dofile(modpath.."/oregen.lua") +dofile(modpath.."/crafts.lua") + +-- Rubber trees, moretrees also supplies these +if not minetest.get_modpath("moretrees") then + dofile(modpath.."/rubber.lua") +else + -- older versions of technic provided rubber trees regardless + minetest.register_alias("technic:rubber_sapling", "moretrees:rubber_tree_sapling") + minetest.register_alias("technic:rubber_tree_empty", "moretrees:rubber_tree_trunk_empty") +end + +-- mg suppport +if minetest.get_modpath("mg") then + dofile(modpath.."/mg.lua") +end + diff --git a/mods/technic_plus/technic_worldgen/locale/de.txt b/mods/technic_plus/technic_worldgen/locale/de.txt new file mode 100644 index 0000000..401c94c --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/de.txt @@ -0,0 +1,39 @@ +# German Translation for technic_worldgen +# Deutsche Übersetzung von technic_worldgen +# by Xanthin + +## crafts.lua +Uranium Lump = Uranklumpen +Uranium Ingot = Uranbarren +Chromium Lump = Chromklumpen +Chromium Ingot = Chrombarren +Zinc Lump = Zinkklumpen +Zinc Ingot = Zinkbarren +Brass Ingot = Messingbarren +Wrought Iron Ingot = Schmiedeeisenbarren +Cast Iron Ingot = Gusseisenbarren +Carbon Steel Ingot = Kohlenstoffstahlbarren +Stainless Steel Ingot = Edelstahlbarren +Iron = Eisen + +## nodes.lua +Uranium Ore = Uranerz +Chromium Ore = Chromerz +Zinc Ore = Zinkerz +Granite = Granit +Marble = Marmor +Marble Bricks = Marmorziegel +Uranium Block = Uranblock +Chromium Block = Chromblock +Zinc Block = Zinkblock +Wrought Iron Block = Schmiedeeisenblock +Cast Iron Block = Gusseisenblock +Carbon Steel Block = Kohlenstoffstahlblock +Stainless Steel Block = Edelstahlblock +Brass Block = Messingblock +Wrought Iron = Schmiedeeisen + +## rubber.lua +Rubber Tree Sapling = Gummibaumsetzling +Rubber Tree = Gummibaum + diff --git a/mods/technic_plus/technic_worldgen/locale/es.txt b/mods/technic_plus/technic_worldgen/locale/es.txt new file mode 100644 index 0000000..a3920c2 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/es.txt @@ -0,0 +1,36 @@ +# technic_worldgen traducido por Carlos Barraza + +###crafts.lua +Uranium Lump = Pepita de Uranio +Uranium Ingot = Lingote de Uranio +Chromium Lump = Pepita de Cromo +Chromium Ingot = Lingote de Cromo +Zinc Lump = Pepita de Zinc +Zinc Ingot = Lingote de Zinc +Brass Ingot = Lingote de Latón +Wrought Iron Ingot = Lingote de Hierro Forjado +Cast Iron Ingot = Lingote de Hierro Fundido +Carbon Steel Ingot = Lingote de Acero al Carbon +Stainless Steel Ingot = Lingote de Acero inoxidable +Iron = Lingote + +###nodes.lua +Uranium Ore = Mineral de Uranio +Chromium Ore = Mineral de Cromo +Zinc Ore = Mineral de Zinc +Granite = Granito +Marble = Mármol +Marble Bricks = Ladrillos de Mármol +Uranium Block = Bloque de Uranio +Chromium Block = Bloque de Cromo +Zinc Block = Bloque de Zinc +Wrought Iron Block = Bloque de Hierro Forjado +Cast Iron Block = Bloque de Hierro Fundido +Carbon Steel Block = Bloque de Acero al Carbon +Stainless Steel Block = Bloque de Acero Inoxidable +Brass Block = Bloque de Latón +Wrought Iron = Hierro Forjado + +###rubber.lua +Rubber Tree Sapling = Retoño de Árbol de Goma +Rubber Tree = Árbol de Goma diff --git a/mods/technic_plus/technic_worldgen/locale/fr.txt b/mods/technic_plus/technic_worldgen/locale/fr.txt new file mode 100644 index 0000000..5bdd148 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/fr.txt @@ -0,0 +1,37 @@ +# template.txt +# technic_worldgen translation template + +###crafts.lua +Uranium Lump = Morceau d'uranium +Uranium Ingot = Lingot d'uranium +Chromium Lump = Morceau de chrome +Chromium Ingot = Lingot de chrome +Zinc Lump = Morceau de zinc +Zinc Ingot = Lingot de zinc +Brass Ingot = Lingot de laiton +Wrought Iron Ingot = Lingot de fer forgé +Cast Iron Ingot = Lingot de fonte +Carbon Steel Ingot = Lingot d'acier au carbone +Stainless Steel Ingot = Lingot d'acier inoxydable +Iron = Fer + +###nodes.lua +Uranium Ore = Minerai d'uranium +Chromium Ore = Minerai de chrome +Zinc Ore = Minerai de zinc +Granite = Granite +Marble = Marbre +Marble Bricks = Briques en marbre +Uranium Block = Bloc d'uranium +Chromium Block = Bloc de chrome +Zinc Block = Bloc de zinc +Wrought Iron Block = Bloc de fer forgé +Cast Iron Block = Bloc de fonte +Carbon Steel Block = Bloc d'acier au carbone +Stainless Steel Block = Bloc d'acier inoxydable +Brass Block = Bloc de laiton +Wrought Iron = Fer forgé + +###rubber.lua +Rubber Tree Sapling = Pousse d'arbre à caoutchouc +Rubber Tree = Arbre à caoutchouc diff --git a/mods/technic_plus/technic_worldgen/locale/pl.txt b/mods/technic_plus/technic_worldgen/locale/pl.txt new file mode 100644 index 0000000..76039ca --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/pl.txt @@ -0,0 +1,38 @@ +# Polish Translation for technic_worldgen +# Polskie tłumaczenie technic_worldgen +# by mat9117 + +###crafts.lua +Uranium Lump = Bryłka uranu +Uranium Ingot = Sztabka uranu +Chromium Lump = Bryłka chromu +Chromium Ingot = Sztabka chromu +Zinc Lump = Bryłka cynku +Zinc Ingot = Sztabka cynku +Brass Ingot = Sztabka mosiądzu +Wrought Iron Ingot = Sztabka kutego żelaza +Cast Iron Ingot = Sztabka żelaziwa +Carbon Steel Ingot = Sztabka stali węglowej +Stainless Steel Ingot = Sztabka nierdzewnej stali +Iron = Żelazo + +###nodes.lua +Uranium Ore = Ruda uranu +Chromium Ore = Ruda chromu +Zinc Ore = Ruda cynku +Granite = Granit +Marble = Marmur +Marble Bricks = Marmurowe cegły +Uranium Block = Blok uranu +Chromium Block = Blok chromu +Zinc Block = Blok cynku +Wrought Iron Block = Blok kutego żelaza +Cast Iron Block = Blok żelaziwa +Carbon Steel Block = Blok stali węglowej +Stainless Steel Block = Blok stali nierdzewnej +Brass Block = Blok mosiądzu +Wrought Iron = Kute żelazo + +###rubber.lua +Rubber Tree Sapling = Sadzonka kauczukowca +Rubber Tree = Kauczukowiec diff --git a/mods/technic_plus/technic_worldgen/locale/pt_BR.txt b/mods/technic_plus/technic_worldgen/locale/pt_BR.txt new file mode 100644 index 0000000..b20368f --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/pt_BR.txt @@ -0,0 +1,38 @@ +# Braziliam portuguese translation for technic_worldgen +# Tradução portuguesa brasileira para technic_worldgen +# By Sires + +###crafts.lua +Uranium Lump = Pedaço de Urânio +Uranium Ingot = Lingote de Urânio +Chromium Lump = Pedaço de Crômio +Chromium Ingot = Lingote de Crômio +Zinc Lump = Pedaço de Zinco +Zinc Ingot = Lingote de Zinco +Brass Ingot = Lingote de Latão +Wrought Iron Ingot = Lingote de Ferro Forjado +Cast Iron Ingot = Lingote de Ferro Fundido +Carbon Steel Ingot = Lingote de Aço Carbono +Stainless Steel Ingot = Lingote de Ferro Inoxidável +Iron = Ferro + +###nodes.lua +Uranium Ore = Minério de Urânio +Chromium Ore = Minério de Crômio +Zinc Ore = Minério de Zinco +Granite = Granito +Marble = Mármore +Marble Bricks = Tijolos de Mármore +Uranium Block = Bloco de Urânio +Chromium Block = Bloco de Crômio +Zinc Block = Bloco de Zinco +Wrought Iron Block = Bloco de Ferro Forjado +Cast Iron Block = Bloco de Ferro Fundido +Carbon Steel Block = Bloco de Aço Carbono +Stainless Steel Block = Bloco de Aço Inoxidável +Brass Block = Bloco de Latão +Wrought Iron = Ferro Forjado + +###rubber.lua +Rubber Tree Sapling = Muda de Árvore de Borracha +Rubber Tree = Árvore de Borracha diff --git a/mods/technic_plus/technic_worldgen/locale/template.txt b/mods/technic_plus/technic_worldgen/locale/template.txt new file mode 100644 index 0000000..40d0029 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/template.txt @@ -0,0 +1,37 @@ +# template.txt +# technic_worldgen translation template + +###crafts.lua +Uranium Lump = +Uranium Ingot = +Chromium Lump = +Chromium Ingot = +Zinc Lump = +Zinc Ingot = +Brass Ingot = +Wrought Iron Ingot = +Cast Iron Ingot = +Carbon Steel Ingot = +Stainless Steel Ingot = +Iron = + +###nodes.lua +Uranium Ore = +Chromium Ore = +Zinc Ore = +Granite = +Marble = +Marble Bricks = +Uranium Block = +Chromium Block = +Zinc Block = +Wrought Iron Block = +Cast Iron Block = +Carbon Steel Block = +Stainless Steel Block = +Brass Block = +Wrought Iron = + +###rubber.lua +Rubber Tree Sapling = +Rubber Tree = diff --git a/mods/technic_plus/technic_worldgen/locale/tr.txt b/mods/technic_plus/technic_worldgen/locale/tr.txt new file mode 100644 index 0000000..1c0fc44 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/tr.txt @@ -0,0 +1,38 @@ +# Turkish translation +# mahmutelmas06@hotmail.com +# Türkçe çeviri + +###crafts.lua +Uranium Lump = Uranyum yığını +Uranium Ingot = Uranyum külçesi +Chromium Lump = Krom yığını +Chromium Ingot = Krom külçesi +Zinc Lump = Çinko yığını +Zinc Ingot = Çünko külçesi +Brass Ingot = Pirinç yığını +Wrought Iron Ingot = İşlenmiş demir yığını +Cast Iron Ingot = Döküm demir yığını +Carbon Steel Ingot = Karbon çelik külçe +Stainless Steel Ingot =Paslanmaz çelik külçe +Iron = Demir + +###nodes.lua +Uranium Ore = Uranyum madeni +Chromium Ore = Krom madeni +Zinc Ore = Çinko madeni +Granite = Granit +Marble = Mermer +Marble Bricks = Mermer tuğla +Uranium Block = Uranyum blok +Chromium Block = Karbon blok +Zinc Block = Çinko blok +Wrought Iron Block = İşlenmiş demir blok +Cast Iron Block = Döküm demir blok +Carbon Steel Block = Karbon çelik blok +Stainless Steel Block = Paslanmaz çelik blok +Brass Block = Pirinç blok +Wrought Iron = İşlenmiş demir + +###rubber.lua +Rubber Tree Sapling = Kauçuk ağacı fidanı +Rubber Tree = Kauçuk ağacı diff --git a/mods/technic_plus/technic_worldgen/locale/zh_CN.txt b/mods/technic_plus/technic_worldgen/locale/zh_CN.txt new file mode 100644 index 0000000..41484e6 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/locale/zh_CN.txt @@ -0,0 +1,30 @@ +# Author: wzy2006 <3450354617@qq.com> +Uranium Lump =ÓËÁ£ +Uranium Ingot =Ó˶§ +Chromium Lump =¸õÁ£ +Chromium Ingot =¸õ¶§ +Zinc Lump =пÁ£ +Zinc Ingot =п¶§ +Brass Ingot =»Æͭ¶§ +Wrought Iron Ingot =ÊìÌú¶§ +Cast Iron Ingot =ÖýÌú¶§ +Carbon Steel Ingot =̼¸ֶ§ +Stainless Steel Ingot =²»Ðâ¸ֶ§ +Iron =Ìú +Uranium Ore =Ó˿óʯ +Chromium Ore =¸õ¿ó +Zinc Ore =п¿ó +Granite =»¨¸ÚÑÒ +Marble =´óÀíʯ +Marble Bricks =´óÀíʯש +Uranium Block =Ó˿é +Chromium Block =¸õ¿é +Zinc Block =п¿é +Wrought Iron Block =ÊìÌú¿é +Cast Iron Block =ÖýÌú¿é +Carbon Steel Block =̼¸ֿé +Stainless Steel Block =²»Ðâ¸ֿé +Brass Block =»Æͭ¿é +Wrought Iron =ÊìÌú +Rubber Tree Sapling =Ïð½ºÊ÷Ãç +Rubber Tree =Ïð½ºÊ÷ diff --git a/mods/technic_plus/technic_worldgen/mg.lua b/mods/technic_plus/technic_worldgen/mg.lua new file mode 100644 index 0000000..74807d7 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/mg.lua @@ -0,0 +1,90 @@ +mg.register_ore({ + name = "technic:mineral_uranium", + wherein = "default:stone", + seeddiff = 11, + maxvdistance = 10.5, + maxheight = -80, + minheight = -300, + sizen = 20, + sizedev = 10, + seglenghtn = 3, + seglenghtdev = 1, + segincln = 0.4, + segincldev = 0.6, + turnangle = 57, + numperblock = 1, + fork_chance = 0 +}) + +mg.register_ore({ + name = "technic:mineral_chromium", + wherein = "default:stone", + seeddiff = 12, + maxvdistance = 10.5, + maxheight = -100, + sizen = 50, + sizedev = 20, + seglenghtn = 8, + seglenghtdev = 3, + segincln = 0, + segincldev = 0.6, + turnangle = 57, + forkturnangle = 57, + numperblock = 2 +}) + +mg.register_ore({ + name = "technic:mineral_zinc", + wherein = "default:stone", + seeddiff = 13, + maxvdistance = 10.5, + maxheight = 2, + seglenghtn = 15, + seglenghtdev = 6, + segincln = 0, + segincldev = 0.6, + turnangle = 57, + forkturnangle = 57, + numperblock = 2 +}) + +mg.register_ore({ + name = "technic:mineral_lead", + wherein = "default:stone", + seeddiff = 14, + maxvdistance = 10.5, + maxheight = 16, + seglenghtn = 15, + seglenghtdev = 6, + segincln = 0, + segincldev = 0.6, + turnangle = 57, + forkturnangle = 57, + numperblock = 3 +}) + +if technic.config:get_bool("enable_granite_generation") then + mg.register_ore_sheet({ + name = "technic:granite", + wherein = "default:stone", + height_min = -31000, + height_max = -150, + tmin = 3, + tmax = 6, + threshhold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) +end + +if technic.config:get_bool("enable_marble_generation") then + mg.register_ore_sheet({ + name = "technic:marble", + wherein = "default:stone", + height_min = -31000, + height_max = -50, + tmin = 3, + tmax = 6, + threshhold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=23, octaves=3, persist=0.70} + }) +end diff --git a/mods/technic_plus/technic_worldgen/mod.conf b/mods/technic_plus/technic_worldgen/mod.conf new file mode 100644 index 0000000..49988f5 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/mod.conf @@ -0,0 +1,3 @@ +name = technic_worldgen +depends = default, basic_materials +optional_depends = intllib, mg, doors, farming, glooptest, mesecons_doors, vessels diff --git a/mods/technic_plus/technic_worldgen/nodes.lua b/mods/technic_plus/technic_worldgen/nodes.lua new file mode 100644 index 0000000..5adeb53 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/nodes.lua @@ -0,0 +1,196 @@ + +local S = technic.worldgen.gettext + +minetest.register_node( ":technic:mineral_uranium", { + description = S("Uranium Ore"), + tiles = { "default_stone.png^technic_mineral_uranium.png" }, + is_ground_content = true, + groups = {cracky=3, radioactive=1}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:uranium_lump", +}) + +minetest.register_node( ":technic:mineral_chromium", { + description = S("Chromium Ore"), + tiles = { "default_stone.png^technic_mineral_chromium.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:chromium_lump", +}) + +minetest.register_node( ":technic:mineral_zinc", { + description = S("Zinc Ore"), + tiles = { "default_stone.png^technic_mineral_zinc.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:zinc_lump", +}) + +minetest.register_node( ":technic:mineral_lead", { + description = S("Lead Ore"), + tiles = { "default_stone.png^technic_mineral_lead.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:lead_lump", +}) + +minetest.register_node( ":technic:mineral_sulfur", { + description = S("Sulfur Ore"), + tiles = { "default_stone.png^technic_mineral_sulfur.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + drop = "technic:sulfur_lump", +}) + +minetest.register_node( ":technic:granite", { + description = S("Granite"), + tiles = { "technic_granite.png" }, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node( ":technic:marble", { + description = S("Marble"), + tiles = { "technic_marble.png" }, + is_ground_content = true, + groups = {cracky=3, marble=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node( ":technic:marble_bricks", { + description = S("Marble Bricks"), + tiles = { "technic_marble_bricks.png" }, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node(":technic:uranium_block", { + description = S("Uranium Block"), + tiles = { "technic_uranium_block.png" }, + is_ground_content = true, + groups = {uranium_block=1, cracky=1, level=2, radioactive=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:chromium_block", { + description = S("Chromium Block"), + tiles = { "technic_chromium_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:zinc_block", { + description = S("Zinc Block"), + tiles = { "technic_zinc_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:lead_block", { + description = S("Lead Block"), + tiles = { "technic_lead_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_alias("technic:wrought_iron_block", "default:steelblock") + +minetest.override_item("default:steelblock", { + description = S("Wrought Iron Block"), + tiles = { "technic_wrought_iron_block.png" }, +}) + +minetest.register_node(":technic:cast_iron_block", { + description = S("Cast Iron Block"), + tiles = { "technic_cast_iron_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:carbon_steel_block", { + description = S("Carbon Steel Block"), + tiles = { "technic_carbon_steel_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:stainless_steel_block", { + description = S("Stainless Steel Block"), + tiles = { "technic_stainless_steel_block.png" }, + is_ground_content = true, + groups = {cracky=1, level=2}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_node(":technic:sulfur_block", { + description = S("Sulfur Block"), + tiles = { "technic_sulfur_block.png" }, + is_ground_content = true, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults() +}) + +minetest.register_craft({ + output = 'technic:marble_bricks 4', + recipe = { + {'technic:marble','technic:marble'}, + {'technic:marble','technic:marble'} + } +}) + +minetest.register_alias("technic:diamond_block", "default:diamondblock") +minetest.register_alias("technic:diamond", "default:diamond") +minetest.register_alias("technic:mineral_diamond", "default:stone_with_diamond") + +local function for_each_registered_node(action) + local really_register_node = minetest.register_node + minetest.register_node = function(name, def) + really_register_node(name, def) + action(name:gsub("^:", ""), def) + end + for name, def in pairs(minetest.registered_nodes) do + action(name, def) + end +end + +for_each_registered_node(function(node_name, node_def) + if node_name ~= "default:steelblock" and + node_name:find("steelblock", 1, true) and + node_def.description:find("Steel", 1, true) then + minetest.override_item(node_name, { + description = node_def.description:gsub("Steel", S("Wrought Iron")), + }) + end + local tiles = node_def.tiles or node_def.tile_images + if tiles then + local new_tiles = {} + local do_override = false + if type(tiles) == "string" then + tiles = {tiles} + end + for i, t in ipairs(tiles) do + if type(t) == "string" and t == "default_steel_block.png" then + do_override = true + t = "technic_wrought_iron_block.png" + end + table.insert(new_tiles, t) + end + if do_override then + minetest.override_item(node_name, { + tiles = new_tiles + }) + end + end +end) + diff --git a/mods/technic_plus/technic_worldgen/oregen.lua b/mods/technic_plus/technic_worldgen/oregen.lua new file mode 100644 index 0000000..90f4ba7 --- /dev/null +++ b/mods/technic_plus/technic_worldgen/oregen.lua @@ -0,0 +1,227 @@ +local uranium_params = { + offset = 0, + scale = 1, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.7 +} +local uranium_threshold = 0.55 + +local chromium_params = { + offset = 0, + scale = 1, + spread = {x = 100, y = 100, z = 100}, + seed = 421, + octaves = 3, + persist = 0.7 +} +local chromium_threshold = 0.55 + +local zinc_params = { + offset = 0, + scale = 1, + spread = {x = 100, y = 100, z = 100}, + seed = 422, + octaves = 3, + persist = 0.7 +} +local zinc_threshold = 0.5 + +local lead_params = { + offset = 0, + scale = 1, + spread = {x = 100, y = 100, z = 100}, + seed = 423, + octaves = 3, + persist = 0.7 +} +local lead_threshold = 0.3 + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_uranium", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 4, + clust_size = 3, + y_min = -300, + y_max = -80, + noise_params = uranium_params, + noise_threshold = uranium_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_chromium", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 2, + clust_size = 3, + y_min = -200, + y_max = -100, + noise_params = chromium_params, + noise_threshold = chromium_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_chromium", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 2, + clust_size = 3, + y_min = -31000, + y_max = -200, + flags = "absheight", + noise_params = chromium_params, + noise_threshold = chromium_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_zinc", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 5, + clust_size = 7, + y_min = -32, + y_max = 2, + noise_params = zinc_params, + noise_threshold = zinc_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_zinc", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -32, + flags = "absheight", + noise_params = zinc_params, + noise_threshold = zinc_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_lead", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -16, + y_max = 16, + noise_params = lead_params, + noise_threshold = lead_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_lead", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 5, + clust_size = 3, + y_min = -128, + y_max = -16, + noise_params = lead_params, + noise_threshold = lead_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_lead", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -128, + flags = "absheight", + noise_params = lead_params, + noise_threshold = lead_threshold, +}) + +-- Sulfur +local sulfur_buf = {} +local sulfur_noise + +minetest.register_on_generated(function(minp, maxp) + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local a = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + vm:get_data(sulfur_buf) + local pr = PseudoRandom(17 * minp.x + 42 * minp.y + 101 * minp.z) + sulfur_noise = sulfur_noise or minetest.get_perlin(9876, 3, 0.5, 100) + + local c_lava = minetest.get_content_id("default:lava_source") + local c_lava_flowing = minetest.get_content_id("default:lava_flowing") + local c_stone = minetest.get_content_id("default:stone") + local c_sulfur = minetest.get_content_id("technic:mineral_sulfur") + + local grid_size = 5 + for x = minp.x + math.floor(grid_size / 2), maxp.x, grid_size do + for y = minp.y + math.floor(grid_size / 2), maxp.y, grid_size do + for z = minp.z + math.floor(grid_size / 2), maxp.z, grid_size do + local c = sulfur_buf[a:index(x, y, z)] + if (c == c_lava or c == c_lava_flowing) + and sulfur_noise:get3d({x = x, y = z, z = z}) >= 0.4 then + for i in a:iter( + math.max(minp.x, x - grid_size), + math.max(minp.y, y - grid_size), + math.max(minp.z, z - grid_size), + math.min(maxp.x, x + grid_size), + math.min(maxp.y, y + grid_size), + math.min(maxp.z, z + grid_size) + ) do + if sulfur_buf[i] == c_stone and pr:next(1, 10) <= 7 then + sulfur_buf[i] = c_sulfur + end + end + end + end + end + end + + vm:set_data(sulfur_buf) + vm:write_to_map(sulfur_buf) +end) + + +if technic.config:get_bool("enable_marble_generation") then + minetest.register_ore({ + ore_type = "sheet", + ore = "technic:marble", + wherein = "default:stone", + clust_scarcity = 1, + clust_num_ores = 1, + clust_size = 3, + y_min = -31000, + y_max = -50, + noise_threshold = 0.4, + noise_params = { + offset = 0, scale = 15, spread = {x = 150, y = 150, z = 150}, + seed = 23, octaves = 3, persist = 0.70 + } + }) +end + +if technic.config:get_bool("enable_granite_generation") then + minetest.register_ore({ + ore_type = "sheet", + ore = "technic:granite", + wherein = "default:stone", + clust_scarcity = 1, + clust_num_ores = 1, + clust_size = 4, + y_min = -31000, + y_max = -150, + noise_threshold = 0.4, + noise_params = { + offset = 0, scale = 15, spread = {x = 130, y = 130, z = 130}, + seed = 24, octaves = 3, persist = 0.70 + } + }) +end diff --git a/mods/technic_plus/technic_worldgen/rubber.lua b/mods/technic_plus/technic_worldgen/rubber.lua new file mode 100644 index 0000000..11da9ca --- /dev/null +++ b/mods/technic_plus/technic_worldgen/rubber.lua @@ -0,0 +1,100 @@ +-- Code of rubber tree by PilzAdam + +local S = technic.worldgen.gettext + +minetest.register_node(":moretrees:rubber_tree_sapling", { + description = S("Rubber Tree Sapling"), + drawtype = "plantlike", + tiles = {"technic_rubber_sapling.png"}, + inventory_image = "technic_rubber_sapling.png", + wield_image = "technic_rubber_sapling.png", + paramtype = "light", + walkable = false, + groups = {dig_immediate=3, flammable=2, sapling=1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft({ + type = "fuel", + recipe = "moretrees:rubber_tree_sapling", + burntime = 10 +}) + +minetest.register_node(":moretrees:rubber_tree_trunk", { + description = S("Rubber Tree"), + tiles = {"default_tree_top.png", "default_tree_top.png", + "technic_rubber_tree_full.png"}, + groups = {tree=1, snappy=1, choppy=2, oddly_breakable_by_hand=1, + flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node(":moretrees:rubber_tree_trunk_empty", { + description = S("Rubber Tree"), + tiles = {"default_tree_top.png", "default_tree_top.png", + "technic_rubber_tree_empty.png"}, + groups = {tree=1, snappy=1, choppy=2, oddly_breakable_by_hand=1, + flammable=2, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node(":moretrees:rubber_tree_leaves", { + drawtype = "allfaces_optional", + description = S("Rubber Tree Leaves"), + tiles = {"technic_rubber_leaves.png"}, + paramtype = "light", + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = {{ + items = {"moretrees:rubber_tree_sapling"}, + rarity = 20, + }, + { + items = {"moretrees:rubber_tree_leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +}) + +technic.rubber_tree_model={ + axiom = "FFFFA", + rules_a = "[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b = "[&FFA]////[&FFA]////[&FFA]", + trunk = "moretrees:rubber_tree_trunk", + leaves = "moretrees:rubber_tree_leaves", + angle = 35, + iterations = 3, + random_level = 1, + trunk_type = "double", + thin_branches = true +} + +minetest.register_abm({ + nodenames = {"moretrees:rubber_tree_sapling"}, + label = "Worldgen: grow rubber tree sapling", + interval = 60, + chance = 20, + action = function(pos, node) + minetest.remove_node(pos) + minetest.spawn_tree(pos, technic.rubber_tree_model) + end +}) + +if technic.config:get_bool("enable_rubber_tree_generation") then + minetest.register_on_generated(function(minp, maxp, blockseed) + if math.random(1, 100) > 5 then + return + end + local tmp = { + x = (maxp.x - minp.x) / 2 + minp.x, + y = (maxp.y - minp.y) / 2 + minp.y, + z = (maxp.z - minp.z) / 2 + minp.z} + local pos = minetest.find_node_near(tmp, maxp.x - minp.x, + {"default:dirt_with_grass"}) + if pos ~= nil then + minetest.spawn_tree({x=pos.x, y=pos.y+1, z=pos.z}, technic.rubber_tree_model) + end + end) +end diff --git a/mods/technic_plus/technic_worldgen/textures/technic_brass_dust.png b/mods/technic_plus/technic_worldgen/textures/technic_brass_dust.png new file mode 100644 index 0000000..007bf81 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_brass_dust.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_carbon_steel_block.png b/mods/technic_plus/technic_worldgen/textures/technic_carbon_steel_block.png new file mode 100644 index 0000000..1841f77 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_carbon_steel_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_carbon_steel_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_carbon_steel_ingot.png new file mode 100644 index 0000000..ea26010 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_carbon_steel_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_cast_iron_block.png b/mods/technic_plus/technic_worldgen/textures/technic_cast_iron_block.png new file mode 100644 index 0000000..cc98001 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_cast_iron_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_cast_iron_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_cast_iron_ingot.png new file mode 100644 index 0000000..c18ee71 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_cast_iron_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_chromium_block.png b/mods/technic_plus/technic_worldgen/textures/technic_chromium_block.png new file mode 100644 index 0000000..f5cdfe9 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_chromium_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_chromium_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_chromium_ingot.png new file mode 100644 index 0000000..92b279c Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_chromium_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_chromium_lump.png b/mods/technic_plus/technic_worldgen/textures/technic_chromium_lump.png new file mode 100644 index 0000000..7c950ab Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_chromium_lump.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_granite.png b/mods/technic_plus/technic_worldgen/textures/technic_granite.png new file mode 100644 index 0000000..88a7b32 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_granite.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_lead_block.png b/mods/technic_plus/technic_worldgen/textures/technic_lead_block.png new file mode 100644 index 0000000..11da56a Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_lead_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_lead_dust.png b/mods/technic_plus/technic_worldgen/textures/technic_lead_dust.png new file mode 100644 index 0000000..af6ee29 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_lead_dust.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_lead_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_lead_ingot.png new file mode 100644 index 0000000..fae0cbf Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_lead_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_lead_lump.png b/mods/technic_plus/technic_worldgen/textures/technic_lead_lump.png new file mode 100644 index 0000000..64584cb Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_lead_lump.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_marble.png b/mods/technic_plus/technic_worldgen/textures/technic_marble.png new file mode 100644 index 0000000..3c3913d Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_marble.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_marble_bricks.png b/mods/technic_plus/technic_worldgen/textures/technic_marble_bricks.png new file mode 100644 index 0000000..7db142f Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_marble_bricks.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_mineral_chromium.png b/mods/technic_plus/technic_worldgen/textures/technic_mineral_chromium.png new file mode 100644 index 0000000..26af323 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_mineral_chromium.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_mineral_lead.png b/mods/technic_plus/technic_worldgen/textures/technic_mineral_lead.png new file mode 100644 index 0000000..0309cd3 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_mineral_lead.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_mineral_sulfur.png b/mods/technic_plus/technic_worldgen/textures/technic_mineral_sulfur.png new file mode 100644 index 0000000..28445b3 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_mineral_sulfur.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_mineral_uranium.png b/mods/technic_plus/technic_worldgen/textures/technic_mineral_uranium.png new file mode 100644 index 0000000..da0319e Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_mineral_uranium.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_mineral_zinc.png b/mods/technic_plus/technic_worldgen/textures/technic_mineral_zinc.png new file mode 100644 index 0000000..1251bea Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_mineral_zinc.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_rubber.png b/mods/technic_plus/technic_worldgen/textures/technic_rubber.png new file mode 100644 index 0000000..eb78e9f Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_rubber.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_rubber_leaves.png b/mods/technic_plus/technic_worldgen/textures/technic_rubber_leaves.png new file mode 100644 index 0000000..ffd63f5 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_rubber_leaves.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_rubber_sapling.png b/mods/technic_plus/technic_worldgen/textures/technic_rubber_sapling.png new file mode 100644 index 0000000..7d3dbf2 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_rubber_sapling.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_empty.png b/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_empty.png new file mode 100644 index 0000000..dc36fa5 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_empty.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_full.png b/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_full.png new file mode 100644 index 0000000..def5cf6 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_full.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_grindings.png b/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_grindings.png new file mode 100644 index 0000000..500e464 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_rubber_tree_grindings.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_stainless_steel_block.png b/mods/technic_plus/technic_worldgen/textures/technic_stainless_steel_block.png new file mode 100644 index 0000000..e1c5865 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_stainless_steel_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_sulfur_block.png b/mods/technic_plus/technic_worldgen/textures/technic_sulfur_block.png new file mode 100644 index 0000000..82c824b Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_sulfur_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_sulfur_dust.png b/mods/technic_plus/technic_worldgen/textures/technic_sulfur_dust.png new file mode 100644 index 0000000..4222c3b Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_sulfur_dust.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_sulfur_lump.png b/mods/technic_plus/technic_worldgen/textures/technic_sulfur_lump.png new file mode 100644 index 0000000..017c8e1 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_sulfur_lump.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_uranium_block.png b/mods/technic_plus/technic_worldgen/textures/technic_uranium_block.png new file mode 100644 index 0000000..3b47e7b Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_uranium_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_uranium_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_uranium_ingot.png new file mode 100644 index 0000000..a9777f9 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_uranium_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_uranium_lump.png b/mods/technic_plus/technic_worldgen/textures/technic_uranium_lump.png new file mode 100644 index 0000000..c0efc19 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_uranium_lump.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_wrought_iron_block.png b/mods/technic_plus/technic_worldgen/textures/technic_wrought_iron_block.png new file mode 100644 index 0000000..ccb6e96 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_wrought_iron_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_wrought_iron_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_wrought_iron_ingot.png new file mode 100644 index 0000000..b8dd386 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_wrought_iron_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_zinc_block.png b/mods/technic_plus/technic_worldgen/textures/technic_zinc_block.png new file mode 100644 index 0000000..9b94a6b Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_zinc_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_zinc_ingot.png b/mods/technic_plus/technic_worldgen/textures/technic_zinc_ingot.png new file mode 100644 index 0000000..9585447 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_zinc_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/technic_zinc_lump.png b/mods/technic_plus/technic_worldgen/textures/technic_zinc_lump.png new file mode 100644 index 0000000..f6c4f78 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/technic_zinc_lump.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_brass_ingot.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_brass_ingot.png new file mode 100644 index 0000000..538e08c Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_brass_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_chromium_ingot.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_chromium_ingot.png new file mode 100644 index 0000000..0353e0a Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_chromium_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_chromium_lump.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_chromium_lump.png new file mode 100644 index 0000000..c3326c6 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_chromium_lump.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_concrete_block.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_concrete_block.png new file mode 100644 index 0000000..71914c9 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_concrete_block.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_granite.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_granite.png new file mode 100644 index 0000000..88a7b32 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_granite.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_marble.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_marble.png new file mode 100644 index 0000000..3c3913d Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_marble.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_marble_bricks.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_marble_bricks.png new file mode 100644 index 0000000..7db142f Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_marble_bricks.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_chromium.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_chromium.png new file mode 100644 index 0000000..26af323 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_chromium.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_uranium.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_uranium.png new file mode 100644 index 0000000..da0319e Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_uranium.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_zinc.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_zinc.png new file mode 100644 index 0000000..1251bea Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_mineral_zinc.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_rebar.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_rebar.png new file mode 100644 index 0000000..fc0b963 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_rebar.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png new file mode 100644 index 0000000..03bb722 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_uranium.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_uranium.png new file mode 100644 index 0000000..c961f83 Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_uranium.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_zinc_ingot.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_zinc_ingot.png new file mode 100644 index 0000000..031e1ec Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_zinc_ingot.png differ diff --git a/mods/technic_plus/technic_worldgen/textures/x32/technic_zinc_lump.png b/mods/technic_plus/technic_worldgen/textures/x32/technic_zinc_lump.png new file mode 100644 index 0000000..85eea7a Binary files /dev/null and b/mods/technic_plus/technic_worldgen/textures/x32/technic_zinc_lump.png differ diff --git a/mods/technic_plus/wrench/depends.txt b/mods/technic_plus/wrench/depends.txt new file mode 100644 index 0000000..25c5256 --- /dev/null +++ b/mods/technic_plus/wrench/depends.txt @@ -0,0 +1,6 @@ +default +technic? +technic_chests? +technic_worldgen? +intllib? +drawers? diff --git a/mods/technic_plus/wrench/drawers.lua b/mods/technic_plus/wrench/drawers.lua new file mode 100644 index 0000000..3249326 --- /dev/null +++ b/mods/technic_plus/wrench/drawers.lua @@ -0,0 +1,45 @@ +if not minetest.get_modpath("drawers") then + return +end + +local INT, STRING = + wrench.META_TYPE_INT, + wrench.META_TYPE_STRING + +-- assemble definitions for type 1,2 and 4 +for _, drawer_type in ipairs({1,2,4}) do + + local def = { + lists = {"upgrades"}, + metas = {}, + after_place = drawers.spawn_visuals + } + + for i=1,drawer_type do + + local suffix + if drawer_type == 1 then + -- no suffix for base type + suffix = "" + else + -- index as suffix + suffix = i + end + + def.metas["name" .. suffix] = STRING + def.metas["count" .. suffix] = INT + def.metas["max_count" .. suffix] = INT + def.metas["base_stack_max" .. suffix] = INT + def.metas["entity_infotext" .. suffix] = STRING + def.metas["stack_max_factor" .. suffix] = INT + def.metas["meta_itemstack" .. suffix] = INT + def.metas["itemstack_wear" .. suffix] = INT + end + + wrench:register_node("drawers:wood" .. drawer_type, def) + wrench:register_node("drawers:acacia_wood" .. drawer_type, def) + wrench:register_node("drawers:aspen_wood" .. drawer_type, def) + wrench:register_node("drawers:junglewood" .. drawer_type, def) + wrench:register_node("drawers:pine_wood" .. drawer_type, def) + +end diff --git a/mods/technic_plus/wrench/init.lua b/mods/technic_plus/wrench/init.lua new file mode 100644 index 0000000..031c714 --- /dev/null +++ b/mods/technic_plus/wrench/init.lua @@ -0,0 +1,179 @@ +--[[ +Wrench mod + +Adds a wrench that allows the player to pickup nodes that contain an inventory +with items or metadata that needs perserving. +The wrench has the same tool capability as the normal hand. +To pickup a node simply right click on it. If the node contains a formspec, +you will need to shift+right click instead. +Because it enables arbitrary nesting of chests, and so allows the player +to carry an unlimited amount of material at once, this wrench is not +available to survival-mode players. +--]] + +local LATEST_SERIALIZATION_VERSION = 1 + +wrench = {} + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +dofile(modpath.."/support.lua") +dofile(modpath.."/technic.lua") +dofile(modpath.."/drawers.lua") + +-- Boilerplate to support localized strings if intllib mod is installed. +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +local function get_meta_type(name, metaname) + local def = wrench.registered_nodes[name] + return def and def.metas and def.metas[metaname] or nil +end + +local function get_pickup_name(name) + return "wrench:picked_up_"..(name:gsub(":", "_")) +end + +local function restore(pos, placer, itemstack) + local itemname = itemstack:get_name() + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local data = itemstack:get_meta():get_string("data") + data = (data ~= "" and data) or itemstack:get_metadata() + data = minetest.deserialize(data) + if not data then + minetest.remove_node(pos) + minetest.log("error", placer:get_player_name().." wanted to place ".. + itemname.." at "..minetest.pos_to_string(pos).. + ", but it had no data.") + minetest.log("verbose", "itemstack: "..itemstack:to_string()) + return true + end + minetest.set_node(pos, {name = data.name, param2 = node.param2}) + for name, value in pairs(data.metas) do + local meta_type = get_meta_type(data.name, name) + if meta_type == wrench.META_TYPE_INT then + meta:set_int(name, value) + elseif meta_type == wrench.META_TYPE_FLOAT then + meta:set_float(name, value) + elseif meta_type == wrench.META_TYPE_STRING then + meta:set_string(name, value) + end + end + local lists = data.lists + for listname, list in pairs(lists) do + inv:set_list(listname, list) + end + itemstack:take_item() + return itemstack +end + +for name, info in pairs(wrench.registered_nodes) do + local olddef = minetest.registered_nodes[name] + if olddef then + local newdef = {} + for key, value in pairs(olddef) do + newdef[key] = value + end + newdef.stack_max = 1 + newdef.description = S("%s with items"):format(newdef.description) + newdef.groups = {} + newdef.groups.not_in_creative_inventory = 1 + newdef.on_construct = nil + newdef.on_destruct = nil + newdef.after_place_node = function(pos, placer, itemstack) + + -- call restoration function with on_plcae callbacks + local new_stack = restore(pos, placer, itemstack) + + if type(info.after_place) == "function" then + -- call custom after_place function + info.after_place(pos) + end + + return new_stack + end + minetest.register_node(":"..get_pickup_name(name), newdef) + end +end + +minetest.register_tool("wrench:wrench", { + description = S("Wrench"), + inventory_image = "technic_wrench.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, + uses=0, maxlevel=3} + }, + damage_groups = {fleshy=1}, + }, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + if not placer or not pos then + return + end + local player_name = placer:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + local nname = minetest.get_node(pos).name + local def = wrench.registered_nodes[nname] + if not def then + return + end + + local stack = ItemStack(get_pickup_name(nname)) + local player_inv = placer:get_inventory() + if not player_inv:room_for_item("main", stack) then + return + end + local meta = minetest.get_meta(pos) + if def.owned and not minetest.check_player_privs(placer, "protection_bypass") then + local owner = meta:get_string("owner") + if owner and owner ~= player_name then + minetest.log("action", player_name.. + " tried to pick up an owned node belonging to ".. + owner.." at ".. + minetest.pos_to_string(pos)) + return + end + end + + local metadata = {} + metadata.name = nname + metadata.version = LATEST_SERIALIZATION_VERSION + + local inv = meta:get_inventory() + local lists = {} + for _, listname in pairs(def.lists or {}) do + local list = inv:get_list(listname) + for i, s in pairs(list) do + list[i] = s:to_string() + end + lists[listname] = list + end + metadata.lists = lists + + local item_meta = stack:get_meta() + metadata.metas = {} + for name, meta_type in pairs(def.metas or {}) do + if meta_type == wrench.META_TYPE_INT then + metadata.metas[name] = meta:get_int(name) + elseif meta_type == wrench.META_TYPE_FLOAT then + metadata.metas[name] = meta:get_float(name) + elseif meta_type == wrench.META_TYPE_STRING then + metadata.metas[name] = meta:get_string(name) + end + end + + item_meta:set_string("data", minetest.serialize(metadata)) + minetest.remove_node(pos) + itemstack:add_wear(65535 / 20) + player_inv:add_item("main", stack) + return itemstack + end, +}) diff --git a/mods/technic_plus/wrench/locale/de.txt b/mods/technic_plus/wrench/locale/de.txt new file mode 100644 index 0000000..b285cd3 --- /dev/null +++ b/mods/technic_plus/wrench/locale/de.txt @@ -0,0 +1,7 @@ +# German Translation for technic_wrench +# Deutsche Übersetzung von technic_wrench +# by Xanthin + +Wrench = Schraubenschluessel +%s with items = %s mit Gegenstaenden + diff --git a/mods/technic_plus/wrench/locale/es.txt b/mods/technic_plus/wrench/locale/es.txt new file mode 100644 index 0000000..1d79a96 --- /dev/null +++ b/mods/technic_plus/wrench/locale/es.txt @@ -0,0 +1,5 @@ +# technic_wrench traducido por Carlos Barraza + +Wrench = Llave Inglesa +%s with items = %s con elementos + diff --git a/mods/technic_plus/wrench/locale/fr.txt b/mods/technic_plus/wrench/locale/fr.txt new file mode 100644 index 0000000..a66b6e3 --- /dev/null +++ b/mods/technic_plus/wrench/locale/fr.txt @@ -0,0 +1,5 @@ +# technic_wrench translation template + +Wrench = Clé +%s with items = %s avec des objets + diff --git a/mods/technic_plus/wrench/locale/pl.txt b/mods/technic_plus/wrench/locale/pl.txt new file mode 100644 index 0000000..272eaa0 --- /dev/null +++ b/mods/technic_plus/wrench/locale/pl.txt @@ -0,0 +1,7 @@ +# Polish Translation for technic_wrench +# Polskie tłumaczenie technic_wrench +# by mat9117 + +Wrench = Klucz +%s with items = %s z rzeczami + diff --git a/mods/technic_plus/wrench/locale/pt_BR.txt b/mods/technic_plus/wrench/locale/pt_BR.txt new file mode 100644 index 0000000..670c3eb --- /dev/null +++ b/mods/technic_plus/wrench/locale/pt_BR.txt @@ -0,0 +1,7 @@ +# Braziliam portuguese translation for wrench +# Tradução portuguesa brasileira para wrench +# By Sires + +Wrench = Chave Inglesa +%s with items = %s com items + diff --git a/mods/technic_plus/wrench/locale/template.txt b/mods/technic_plus/wrench/locale/template.txt new file mode 100644 index 0000000..eff2da2 --- /dev/null +++ b/mods/technic_plus/wrench/locale/template.txt @@ -0,0 +1,5 @@ +# technic_wrench translation template + +Wrench = +%s with items = + diff --git a/mods/technic_plus/wrench/locale/tr.txt b/mods/technic_plus/wrench/locale/tr.txt new file mode 100644 index 0000000..2050bce --- /dev/null +++ b/mods/technic_plus/wrench/locale/tr.txt @@ -0,0 +1,5 @@ +# Turkish translation by mahmutelmas06 +# mahmutelmas06@hotmail.com + +Wrench = İngiliz anahtarı +%s with items = Araçlarla birlikte %s diff --git a/mods/technic_plus/wrench/locale/zh_CN.txt b/mods/technic_plus/wrench/locale/zh_CN.txt new file mode 100644 index 0000000..b73041d --- /dev/null +++ b/mods/technic_plus/wrench/locale/zh_CN.txt @@ -0,0 +1,2 @@ +Wrench =°âÊÖ +%s with items =%s´øÎïƷ diff --git a/mods/technic_plus/wrench/mod.conf b/mods/technic_plus/wrench/mod.conf new file mode 100644 index 0000000..a18b4f7 --- /dev/null +++ b/mods/technic_plus/wrench/mod.conf @@ -0,0 +1,3 @@ +name = wrench +depends = default +optional_depends = technic, technic_chests, technic_worldgen, intllib diff --git a/mods/technic_plus/wrench/support.lua b/mods/technic_plus/wrench/support.lua new file mode 100644 index 0000000..4c1a371 --- /dev/null +++ b/mods/technic_plus/wrench/support.lua @@ -0,0 +1,71 @@ +--[[ +supported_nodes +This table stores all nodes that are compatible with the wrench mod. +Syntax: + [] = { + lists = {""}, + metas = {[""] = STRING, + [""] = INT, + [""] = FLOAT}, + owned = true, + store_meta_always = true, + } + owned - nodes that are protected by owner requirements (Ex. locked chests) + store_meta_always - when nodes are broken this ensures metadata and + inventory is always stored (Ex. active state for machines) +--]] + +wrench.META_TYPE_FLOAT = 1 +wrench.META_TYPE_STRING = 2 +wrench.META_TYPE_INT = 3 + +local STRING, FLOAT = + wrench.META_TYPE_STRING, + wrench.META_TYPE_FLOAT + +wrench.registered_nodes = { + ["default:chest"] = { + lists = {"main"}, + }, + ["default:chest_locked"] = { + lists = {"main"}, + metas = {owner = STRING, + infotext = STRING}, + owned = true, + }, + ["default:furnace"] = { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, + }, + ["default:furnace_active"] = { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, + store_meta_always = true, + }, + ["default:sign_wall"] = { + metas = {infotext = STRING, + text = STRING}, + }, +} + +function wrench:original_name(name) + for key, value in pairs(self.registered_nodes) do + if name == value.name then + return key + end + end +end + +function wrench:register_node(name, def) + if minetest.registered_nodes[name] then + self.registered_nodes[name] = def + end +end diff --git a/mods/technic_plus/wrench/technic.lua b/mods/technic_plus/wrench/technic.lua new file mode 100644 index 0000000..5b529e8 --- /dev/null +++ b/mods/technic_plus/wrench/technic.lua @@ -0,0 +1,343 @@ + +local INT, STRING, FLOAT = + wrench.META_TYPE_INT, + wrench.META_TYPE_STRING, + wrench.META_TYPE_FLOAT + +wrench:register_node("technic:iron_chest", { + lists = {"main"}, +}) +wrench:register_node("technic:iron_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING}, + owned = true, +}) +wrench:register_node("technic:copper_chest", { + lists = {"main"}, +}) +wrench:register_node("technic:copper_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING}, + owned = true, +}) +wrench:register_node("technic:silver_chest", { + lists = {"main"}, + metas = {infotext = STRING, + formspec = STRING}, +}) +wrench:register_node("technic:silver_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING, + formspec = STRING}, + owned = true, +}) +wrench:register_node("technic:gold_chest", { + lists = {"main"}, + metas = {infotext = STRING, + formspec = STRING}, +}) +wrench:register_node("technic:gold_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING, + formspec = STRING}, + owned = true, +}) +wrench:register_node("technic:mithril_chest", { + lists = {"main"}, + metas = {infotext = STRING, + formspec = STRING}, +}) +wrench:register_node("technic:mithril_locked_chest", { + lists = {"main"}, + metas = {infotext = STRING, + owner = STRING, + formspec = STRING}, + owned = true, +}) +wrench:register_node("technic:lv_electric_furnace", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:lv_electric_furnace_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_electric_furnace", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_electric_furnace_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:coal_alloy_furnace", { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, +}) +wrench:register_node("technic:coal_alloy_furnace_active", { + lists = {"fuel", "src", "dst"}, + metas = {infotext = STRING, + fuel_totaltime = FLOAT, + fuel_time = FLOAT, + src_totaltime = FLOAT, + src_time = FLOAT}, +}) +wrench:register_node("technic:alloy_furnace", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:alloy_furnace_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_alloy_furnace", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_alloy_furnace_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:tool_workshop", { + lists = {"src", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT}, +}) +wrench:register_node("technic:grinder", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:grinder_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_grinder", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_grinder_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:extractor", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:extractor_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_extractor", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_extractor_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:compressor", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:compressor_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_compressor", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_compressor_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:cnc", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT, + cnc_product = STRING}, +}) +wrench:register_node("technic:cnc_active", { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + LV_EU_demand = INT, + LV_EU_input = INT, + src_time = INT, + cnc_product = STRING}, +}) +wrench:register_node("technic:mv_centrifuge", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) +wrench:register_node("technic:mv_centrifuge_active", { + lists = {"src", "dst", "upgrade1", "upgrade2"}, + metas = {infotext = STRING, + formspec = STRING, + MV_EU_demand = INT, + MV_EU_input = INT, + tube_time = INT, + src_time = INT}, +}) + + +local chest_mark_colors = { + '_black', + '_blue', + '_brown', + '_cyan', + '_dark_green', + '_dark_grey', + '_green', + '_grey', + '_magenta', + '_orange', + '_pink', + '_red', + '_violet', + '_white', + '_yellow', + '', +} + +for i = 1, 15 do + wrench:register_node("technic:gold_chest"..chest_mark_colors[i], { + lists = {"main"}, + metas = {infotext = STRING,formspec = STRING}, + }) + wrench:register_node("technic:gold_locked_chest"..chest_mark_colors[i], { + lists = {"main"}, + metas = {infotext = STRING,owner = STRING,formspec = STRING}, + owned = true, + }) +end + +if minetest.get_modpath("technic") then + for tier, _ in pairs(technic.machines) do + local ltier = tier:lower() + for i = 0, 8 do + wrench:register_node("technic:"..ltier.."_battery_box"..i, { + lists = {"src", "dst"}, + metas = {infotext = STRING, + formspec = STRING, + [tier.."_EU_demand"] = INT, + [tier.."_EU_supply"] = INT, + [tier.."_EU_input"] = INT, + internal_EU_charge = INT, + last_side_shown = INT}, + }) + end + end +end + diff --git a/mods/technic_plus/wrench/textures/technic_wrench.png b/mods/technic_plus/wrench/textures/technic_wrench.png new file mode 100644 index 0000000..0b57c7f Binary files /dev/null and b/mods/technic_plus/wrench/textures/technic_wrench.png differ diff --git a/mods/vizlib/API.md b/mods/vizlib/API.md new file mode 100644 index 0000000..96dc386 --- /dev/null +++ b/mods/vizlib/API.md @@ -0,0 +1,152 @@ +# API Documentation + +## Quick Links + +- [`axis`](#axis) +- [`options`](#options) +- [`shape`](#shape) +- [`vizlib.colors`](#vizlibcolors) +- [`vizlib.default_color`](#vizlibdefault_color) +- [`vizlib.select_color()`](#vizlibselect_color) +- [`vizlib.random_color()`](#vizlibrandom_color) +- [`vizlib.erase_shape(shape)`](#vizliberase_shapeshape) +- [`vizlib.draw_point(pos, options)`](#vizlibdraw_pointpos-options) +- [`vizlib.draw_circle(pos, radius, axis, options)`](#vizlibdraw_circlepos-radius-axis-options) +- [`vizlib.draw_sphere(pos, radius, options)`](#vizlibdraw_spherepos-radius-options) +- [`vizlib.draw_line(pos1, pos2, options)`](#vizlibdraw_linepos1-pos2-options) +- [`vizlib.draw_square(pos, radius, axis, options)`](#vizlibdraw_squarepos-radius-axis-options) +- [`vizlib.draw_cube(pos, radius, options)`](#vizlibdraw_cubepos-radius-options) +- [`vizlib.draw_area(pos1, pos2, options)`](#vizlibdraw_areapos1-pos2-options) + + +## Data Types + +#### **`axis`** + +A string consisting of either "x", "y" or "z". Required by certain drawing functions. Must be lower case. + +#### **`options`** + +A table of values used to set shape options when passed to a drawing function. All values are optional. + +**Values** +- `color` - String. The color of the shape. Defaults to `vizlib.default_color`. +- `infinite` - Boolean. If true, the shape will never expire. By default the shape will expire after 10 seconds. +- `player` - String or player object. If set, only the specified player will see the shape. + +#### **`shape`** + +A table of values defining a created shape. Returned from all drawing functions. + +**Values** +- `name` - String. The player name, if a player was specified upon creation. +- `expiry` - The time this shape will expire, if not infinite. Can be compared to `os.time()`. +- `ids` - Table. The IDs for the particle spawners this shape is made of. + + +## Colors + +#### **`vizlib.colors`** + +Provides a list of 24 colors, sorted by hue. Each value is a table containing two values: +- `name` - The name of the color, in lowercase. +- `hex` - The RGB hex code for the color, including the `#` prefix. + +#### **`vizlib.default_color`** + +The default color for shapes if no color is specified upon creation. + +Value is set by the [`vizlib_default_color`](settingtypes.txt) setting. + +#### **`vizlib.select_color()`** + +Selects a random color from `vizlib.colors`. + +**Returns** +- A hex color code, including the `#` prefix. + +#### **`vizlib.random_color()`** + +Generates a completely random color. + +**Returns** +- A hex color code, including the `#` prefix. + + +## Utility + +#### **`vizlib.erase_shape(shape)`** + +Removes a shape from the world. + +Useful for removing shapes created with `options.infinite = true`. + +**Arguments** +- `shape` - The shape to be removed. + + +## Drawing + +#### **`vizlib.draw_point(pos, options)`** + +Draws a point (one slightly bigger particle). + +**Arguments** +- `pos` - Vector. The position of the point. +- `options` - Table. See [`options`](#options) above. + +#### **`vizlib.draw_circle(pos, radius, axis, options)`** + +Draws an approximate circle on a particular axis. + +**Arguments** +- `pos` - Vector. The position of the center of the circle. +- `radius` - Number. The radius of the circle. +- `axis` - String. See [`axis`](#axis) above. The axis the circle will be positioned perpendicular to. +- `options` - Table. See [`options`](#options) above. + +#### **`vizlib.draw_sphere(pos, radius, options)`** + +Draws an approximate sphere. + +**Arguments** +- `pos` - Vector. The position of the center of the sphere. +- `radius` - Number. The radius of the sphere. +- `options` - Table. See [`options`](#options) above. + +#### **`vizlib.draw_line(pos1, pos2, options)`** + +Draws a line from `pos1` to `pos2`. + +**Arguments** +- `pos1` - Vector. The starting point of the line. +- `pos2` - Vector. The ending point of the line. +- `options` - Table. See [`options`](#options) above. + +#### **`vizlib.draw_square(pos, radius, axis, options)`** + +Draws a square on a particular axis. + +**Arguments** +- `pos` - Vector. The position of the center of the square. +- `radius` - Number. The distance from the center to the edge of the square. +- `axis` - String. See [`axis`](#axis) above. The axis the square will be positioned perpendicular to. +- `options` - Table. See [`options`](#options) above. + +#### **`vizlib.draw_cube(pos, radius, options)`** + +Draws a cube. + +**Arguments** +- `pos` - Vector. The position of the center of the cube. +- `radius` - Number. The distance from the center to the side of the cube. +- `options` - Table. See [`options`](#options) above. + +#### **`vizlib.draw_area(pos1, pos2, options)`** + +Draws a rectangular cuboid between `pos1` and `pos2`. + +**Arguments** +- `pos1` - Vector. The first corner of the area. +- `pos2` - Vector. The second corner of the area. +- `options` - Table. See [`options`](#options) above. diff --git a/mods/vizlib/LICENSE b/mods/vizlib/LICENSE new file mode 100644 index 0000000..936dda0 --- /dev/null +++ b/mods/vizlib/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 OgelGames + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/vizlib/README.md b/mods/vizlib/README.md new file mode 100644 index 0000000..0cedae7 --- /dev/null +++ b/mods/vizlib/README.md @@ -0,0 +1,68 @@ +# Minetest Visulization Library [vizlib] + +[![luacheck](https://github.com/OgelGames/vizlib/workflows/luacheck/badge.svg)](https://github.com/OgelGames/vizlib/actions) +[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE.md) +[![Minetest](https://img.shields.io/badge/Minetest-5.0+-blue.svg)](https://www.minetest.net) +[![ContentDB](https://content.minetest.net/packages/OgelGames/vizlib/shields/downloads/)](https://content.minetest.net/packages/OgelGames/vizlib/) + +## Overview + +This mod is a code library for visualizing basic shapes in-game. You can draw lines, circles, cubes, spheres and more. + +It's ideal for showing the working area or range of functional nodes, and a better alternative to using entities. + +![Overview](overview.gif?raw=true "Overview") + +## Usage + +Simply add `vizlib` to your mod's dependencies, and call any of the API functions from your code. + +See [API.md](API.md) for detailed documentation. + +## Examples + +Drawing a line between two points. + +```lua +local pos1 = vector.new(-2, 0, -2) +local pos2 = vector.new(2, 2, 2) +vizlib.draw_line(pos1, pos2) +``` + +Drawing a blue sphere for the player Sam and removing it after 60 seconds. + +```lua +local pos = vector.new(0, 5, 0) +local options = { + color = "#0000ff", + player = "Sam", + infinite = true, +} +local shape = vizlib.draw_sphere(pos, 3, options) +minetest.after(60, vizlib.erase_shape, shape) +``` + +Showing a working range when punching a node with an empty hand. + +```lua +on_punch = function(pos, _, player) + if not player or player:get_wielded_item():get_name() ~= "" then + -- Only show range when using an empty hand + return + end + local radius = minetest.get_meta(pos):get_int("radius") + 0.5 + vizlib.draw_cube(pos, radius, {player = player}) +end +``` + +## Installation + +Download the [master branch](https://github.com/OgelGames/vizlib/archive/master.zip) or the [latest release](https://github.com/OgelGames/vizlib/releases), and follow [the usual installation steps](https://wiki.minetest.net/Installing_Mods). + +Alternatively, you can download and install the mod from [ContentDB](https://content.minetest.net/packages/OgelGames/vizlib) or the online content tab in Minetest. + +## License + +All code is licensed under the [MIT License](LICENSE). + +`vizlib_particle.png` is licensed as [CC0](https://creativecommons.org/publicdomain/zero/1.0/). \ No newline at end of file diff --git a/mods/vizlib/api.lua b/mods/vizlib/api.lua new file mode 100644 index 0000000..4a2360d --- /dev/null +++ b/mods/vizlib/api.lua @@ -0,0 +1,274 @@ + +local circles = {} +-- Calculate the values for the segments of the circles +do + local sqrt2 = math.sqrt(2) * 0.5 + local rad90 = math.rad(90) + local pos = vector.new(sqrt2, 0, sqrt2) + local vel = vector.new((1 - sqrt2) * 2, 0, -sqrt2) + local acc = vector.new((1 - sqrt2) * -2, 0, 0) + local axes = { + x = vector.new(1, 0, 0), + y = vector.new(0, 1, 0), + z = vector.new(0, 0, 1), + } + for _,axis in ipairs({"y", "x", "z"}) do -- This order is important + circles[axis] = {} + if axis == "x" then + pos = vector.rotate_around_axis(pos, axes.z, rad90) + vel = vector.rotate_around_axis(vel, axes.z, rad90) + acc = vector.rotate_around_axis(acc, axes.z, rad90) + elseif axis == "z" then + pos = vector.rotate_around_axis(pos, axes.y, rad90) + vel = vector.rotate_around_axis(vel, axes.y, rad90) + acc = vector.rotate_around_axis(acc, axes.y, rad90) + end + for i=1, 4 do + circles[axis][i] = { + pos = vector.rotate_around_axis(pos, axes[axis], rad90 * i), + vel = vector.rotate_around_axis(vel, axes[axis], rad90 * i), + acc = vector.rotate_around_axis(acc, axes[axis], rad90 * i), + } + end + end +end + +local function get_valid_options(options) + if type(options) ~= "table" then + options = {} + end + local color = options.color or vizlib.default_color + for _,c in ipairs(vizlib.colors) do + if c.name == color then + color = c.hex + end + end + local time = options.infinite and 0 or 10 + local density = options.infinite and 1 or 10 + local name + local t = type(options.player) + if t == "string" then + name = options.player + elseif t == "userdata" or t == "table" then + name = options.player:get_player_name() + end + return color, name, time, density +end + +local function make_shape(name, time, ids) + local shape = {name = name} + if time > 0 then + shape.expiry = os.time() + time + end + if type(ids) ~= "table" then + shape.ids = {ids} + else + shape.ids = ids + end + return shape +end + +local function make_arc(arc, pos, radius, color, name, time, density) + pos = vector.add(pos, vector.multiply(arc.pos, radius)) + local vel = vector.multiply(arc.vel, radius) + local acc = vector.multiply(arc.acc, radius) + return minetest.add_particlespawner({ + playername = name, + time = time, + amount = math.ceil(radius * density * 6.0), + minpos = pos, + maxpos = pos, + minvel = vel, + maxvel = vel, + minacc = acc, + maxacc = acc, + minexptime = 2, + maxexptime = 2, + texture = "vizlib_particle.png^[multiply:"..color, + glow = 14, + }) +end + +local function make_line(pos1, pos2, color, name, time, density) + local distance = vector.distance(pos1, pos2) + local dir = vector.direction(pos1, pos2) + local vel = vector.multiply(dir, math.min(distance, 10.0)) + local expt = math.max(distance / 10.0, 1.0) + return minetest.add_particlespawner({ + playername = name, + time = time, + amount = math.ceil(math.min(distance, 10.0) * density * 3.0), + minpos = pos1, + maxpos = pos1, + minvel = vel, + maxvel = vel, + minexptime = expt, + maxexptime = expt, + texture = "vizlib_particle.png^[multiply:"..color, + glow = 14, + }) +end + +local function make_point(pos, color, name, time, density) + return minetest.add_particlespawner({ + playername = name, + time = time, + amount = density * 2, + minpos = pos, + maxpos = pos, + minexptime = 2.0, + maxexptime = 2.0, + texture = "vizlib_particle.png^[multiply:"..color, + glow = 14, + size = 1.5, + }) +end + +-------------------------------------------------- +-- API Functions. See API.md for details. +-------------------------------------------------- + +function vizlib.select_color() + return vizlib.colors[math.random(24)].hex +end + +function vizlib.random_color() + local r = math.random(0, 255) + local g = math.random(0, 255) + local b = math.random(0, 255) + return string.format("#%02x%02x%02x", r, g, b) +end + +function vizlib.draw_point(pos, options) + local color, name, time, density = get_valid_options(options) + local ids = make_point(pos, color, name, time, density) + return make_shape(name, time, ids) +end + +function vizlib.draw_circle(pos, radius, axis, options) + local color, name, time, density = get_valid_options(options) + local ids = {} + for _,arc in pairs(circles[axis]) do + table.insert(ids, make_arc(arc, pos, radius, color, name, time, density)) + end + return make_shape(name, time, ids) +end + +function vizlib.draw_sphere(pos, radius, options) + local color, name, time, density = get_valid_options(options) + local ids = {} + for _,circle in pairs(circles) do + for _,arc in pairs(circle) do + table.insert(ids, make_arc(arc, pos, radius, color, name, time, density)) + end + end + return make_shape(name, time, ids) +end + +function vizlib.draw_line(pos1, pos2, options) + local color, name, time, density = get_valid_options(options) + local ids = make_line(pos1, pos2, color, name, time, density) + return make_shape(name, time, ids) +end + +function vizlib.draw_square(pos, radius, axis, options) + local color, name, time, density = get_valid_options(options) + local p1, p2, p3, p4 + if axis == "x" then + p1 = vector.add(pos, vector.new(0, -radius, -radius)) + p2 = vector.add(pos, vector.new(0, radius, -radius)) + p3 = vector.add(pos, vector.new(0, radius, radius)) + p4 = vector.add(pos, vector.new(0, -radius, radius)) + elseif axis == "y" then + p1 = vector.add(pos, vector.new(-radius, 0, -radius)) + p2 = vector.add(pos, vector.new( radius, 0, -radius)) + p3 = vector.add(pos, vector.new( radius, 0, radius)) + p4 = vector.add(pos, vector.new(-radius, 0, radius)) + elseif axis == "z" then + p1 = vector.add(pos, vector.new(-radius, -radius, 0)) + p2 = vector.add(pos, vector.new( radius, -radius, 0)) + p3 = vector.add(pos, vector.new( radius, radius, 0)) + p4 = vector.add(pos, vector.new(-radius, radius, 0)) + end + local ids = { + make_line(p1, p2, color, name, time, density), + make_line(p2, p3, color, name, time, density), + make_line(p3, p4, color, name, time, density), + make_line(p4, p1, color, name, time, density), + } + return make_shape(name, time, ids) +end + +function vizlib.draw_cube(pos, radius, options) + local color, name, time, density = get_valid_options(options) + local p1 = vector.add(pos, vector.new(-radius, radius, -radius)) + local p2 = vector.add(pos, vector.new( radius, radius, -radius)) + local p3 = vector.add(pos, vector.new( radius, radius, radius)) + local p4 = vector.add(pos, vector.new(-radius, radius, radius)) + local p5 = vector.add(pos, vector.new(-radius, -radius, -radius)) + local p6 = vector.add(pos, vector.new( radius, -radius, -radius)) + local p7 = vector.add(pos, vector.new( radius, -radius, radius)) + local p8 = vector.add(pos, vector.new(-radius, -radius, radius)) + local ids = { + -- Top + make_line(p1, p2, color, name, time, density), + make_line(p2, p3, color, name, time, density), + make_line(p3, p4, color, name, time, density), + make_line(p4, p1, color, name, time, density), + -- Bottom + make_line(p5, p6, color, name, time, density), + make_line(p6, p7, color, name, time, density), + make_line(p7, p8, color, name, time, density), + make_line(p8, p5, color, name, time, density), + -- Sides + make_line(p1, p5, color, name, time, density), + make_line(p2, p6, color, name, time, density), + make_line(p3, p7, color, name, time, density), + make_line(p4, p8, color, name, time, density), + } + return make_shape(name, time, ids) +end + +function vizlib.draw_area(pos1, pos2, options) + local color, name, time, density = get_valid_options(options) + local minp, maxp = {}, {} + for _,c in pairs({"x", "y", "z"}) do + minp[c] = math.min(pos1[c], pos2[c]) + maxp[c] = math.max(pos1[c], pos2[c]) + end + local p1 = vector.new(minp.x, maxp.y, minp.z) + local p2 = vector.new(maxp.x, maxp.y, minp.z) + local p3 = vector.new(maxp.x, maxp.y, maxp.z) + local p4 = vector.new(minp.x, maxp.y, maxp.z) + local p5 = vector.new(minp.x, minp.y, minp.z) + local p6 = vector.new(maxp.x, minp.y, minp.z) + local p7 = vector.new(maxp.x, minp.y, maxp.z) + local p8 = vector.new(minp.x, minp.y, maxp.z) + local ids = { + -- Top + make_line(p1, p2, color, name, time, density), + make_line(p2, p3, color, name, time, density), + make_line(p3, p4, color, name, time, density), + make_line(p4, p1, color, name, time, density), + -- Bottom + make_line(p5, p6, color, name, time, density), + make_line(p6, p7, color, name, time, density), + make_line(p7, p8, color, name, time, density), + make_line(p8, p5, color, name, time, density), + -- Sides + make_line(p1, p5, color, name, time, density), + make_line(p2, p6, color, name, time, density), + make_line(p3, p7, color, name, time, density), + make_line(p4, p8, color, name, time, density), + } + return make_shape(name, time, ids) +end + +function vizlib.erase_shape(shape) + if type(shape) ~= "table" or not shape.ids then + return + end + for _,id in pairs(shape.ids) do + minetest.delete_particlespawner(id) + end +end diff --git a/mods/vizlib/init.lua b/mods/vizlib/init.lua new file mode 100644 index 0000000..eeea6ea --- /dev/null +++ b/mods/vizlib/init.lua @@ -0,0 +1,33 @@ + +vizlib = {} + +vizlib.colors = { + {name = "red", hex = "#ff0000"}, + {name = "vermilion", hex = "#ff4000"}, + {name = "orange", hex = "#ff8000"}, + {name = "amber", hex = "#ffbf00"}, + {name = "yellow", hex = "#ffff00"}, + {name = "lime", hex = "#bfff00"}, + {name = "chartreuse", hex = "#80ff00"}, + {name = "harlequin", hex = "#40ff00"}, + {name = "green", hex = "#00ff00"}, + {name = "malachite", hex = "#00ff40"}, + {name = "spring", hex = "#00ff80"}, + {name = "turquoise", hex = "#00ffbf"}, + {name = "cyan", hex = "#00ffff"}, + {name = "cerulean", hex = "#00bfff"}, + {name = "azure", hex = "#0080ff"}, + {name = "sapphire", hex = "#0040ff"}, + {name = "blue", hex = "#0000ff"}, + {name = "indigo", hex = "#4000ff"}, + {name = "violet", hex = "#8000ff"}, + {name = "mulberry", hex = "#bf00ff"}, + {name = "magenta", hex = "#ff00ff"}, + {name = "fuchsia", hex = "#ff00bf"}, + {name = "rose", hex = "#ff0080"}, + {name = "crimson", hex = "#ff0040"} +} + +vizlib.default_color = minetest.settings:get("vizlib_default_color") or "#ff0000" + +dofile(minetest.get_modpath("vizlib").."/api.lua") diff --git a/mods/vizlib/mod.conf b/mods/vizlib/mod.conf new file mode 100644 index 0000000..d3dfac5 --- /dev/null +++ b/mods/vizlib/mod.conf @@ -0,0 +1,3 @@ +name = vizlib +description = Minetest visulization library +min_minetest_version = 5.0 diff --git a/mods/vizlib/screenshot.png b/mods/vizlib/screenshot.png new file mode 100644 index 0000000..2ecda60 Binary files /dev/null and b/mods/vizlib/screenshot.png differ diff --git a/mods/vizlib/settingtypes.txt b/mods/vizlib/settingtypes.txt new file mode 100644 index 0000000..a381df5 --- /dev/null +++ b/mods/vizlib/settingtypes.txt @@ -0,0 +1,2 @@ +# The default color for shapes if no color is specified upon creation. Must be a valid color string. +vizlib_default_color (Default particle color) string #ff0000 diff --git a/mods/vizlib/textures/vizlib_particle.png b/mods/vizlib/textures/vizlib_particle.png new file mode 100644 index 0000000..b6734bc Binary files /dev/null and b/mods/vizlib/textures/vizlib_particle.png differ diff --git a/mods/wilhelminessounds/LICENSE b/mods/wilhelminessounds/LICENSE new file mode 100644 index 0000000..da2fe74 --- /dev/null +++ b/mods/wilhelminessounds/LICENSE @@ -0,0 +1,32 @@ + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Ambience mod Copyright (c) 2022 TenPlus1 + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2022 under (MIT) License (c) 2022 + +All sounds are from Freesound (www.freesound.org) and licensed under Plublic Domain or Creative Commons. Thanks for the sounds to: + +Connum, symphoid, speedenza, mensageirocs, univ-lyon3, jalastram, kinoton, retroguy23, reinsamba, straget, vykroft, inspectorj, klankbeeld, +soundofsong, l-finck, folkart, felix_blume, Snipes3000, supersciri, juskiddink, qubodup, haysmit, inchadney, jaromarsalek, danjocross, +samarobryn, edufigueres, shortrecord, arnaud, digifishmusic, urupin, sonatorio, genghis-attenborough, eric5335, szegvari, samsterbirdies, +electroviolence, zixem, szegvari, iampagan and zouliangqaz. diff --git a/mods/wilhelminessounds/depends.txt b/mods/wilhelminessounds/depends.txt new file mode 100644 index 0000000..0ab249d --- /dev/null +++ b/mods/wilhelminessounds/depends.txt @@ -0,0 +1,7 @@ +default +ambience +livingfloatlands? +livingdesert? +livingjungle? +livingcaves? +naturalbiomes? \ No newline at end of file diff --git a/mods/wilhelminessounds/description.txt b/mods/wilhelminessounds/description.txt new file mode 100644 index 0000000..85fa922 --- /dev/null +++ b/mods/wilhelminessounds/description.txt @@ -0,0 +1 @@ +Adds ambient sounds to the landscapes of Living Floatlands, Living Desert, Living Jungle, Living Caves and Natural Biomes \ No newline at end of file diff --git a/mods/wilhelminessounds/init.lua b/mods/wilhelminessounds/init.lua new file mode 100644 index 0000000..a76eb56 --- /dev/null +++ b/mods/wilhelminessounds/init.lua @@ -0,0 +1,24 @@ + +local modname = "wilhelminessounds" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("wilhelminessounds") or + dofile(path .. "intllib.lua") + + + +-- plants +dofile(path .. "livingcavessounds.lua") -- +dofile(path .. "livingdesertsounds.lua") -- +dofile(path .. "livingfloatlandssounds.lua") -- +dofile(path .. "livingjunglesounds.lua") -- +dofile(path .. "naturalbiomessounds.lua") -- + + + + +print (S("[MOD] Sounds loaded")) diff --git a/mods/wilhelminessounds/intllib.lua b/mods/wilhelminessounds/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/wilhelminessounds/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/wilhelminessounds/livingcavessounds.lua b/mods/wilhelminessounds/livingcavessounds.lua new file mode 100644 index 0000000..73b4156 --- /dev/null +++ b/mods/wilhelminessounds/livingcavessounds.lua @@ -0,0 +1,92 @@ +ambience.add_set("bacteriacave", { + frequency = 25, + nodes = {"livingcaves:bacteriacave_bottom"}, + sounds = { + {name = "livingcaves_bacteriacave", length = 12, ephemeral = true}, + {name = "livingcaves_bacteriacave2", length = 9, ephemeral = true}, + {name = "livingcaves_bacteriacave3", length = 12, ephemeral = true}, + {name = "livingcaves_bacteriacave4", length = 14, ephemeral = true}, + {name = "livingcaves_bacteriacave5", length = 11, ephemeral = true}, + {name = "livingcaves_bacteriacave6", length = 25, ephemeral = true}, + }, +nodes = {"livingcaves:bacteriacave_bottom"}, + + sound_check = function(def) + + local c = (def.totals["livingcaves:bacteriacave_bottom"] or 0) + + if c > 5 then + return "bacteriacave" + end + end +}) + +ambience.add_set("dripstonecave", { + frequency = 30, + nodes = {"livingcaves:dripstonecave_bottom"}, + sounds = { + {name = "livingcaves_dripstone", length = 6, ephemeral = true}, + {name = "livingcaves_dripstone2", length = 5, ephemeral = true}, + {name = "livingcaves_dripstone3", length = 7, ephemeral = true}, + {name = "livingcaves_dripstone4", length = 11, ephemeral = true}, + {name = "livingcaves_dripstone5", length = 20, ephemeral = true}, + {name = "livingcaves_dripstone6", length = 4, ephemeral = true}, + {name = "livingcaves_dripstone7", length = 4, ephemeral = true}, + }, +nodes = {"livingcaves:dripstonecave_bottom"}, + + sound_check = function(def) + + local c = (def.totals["livingcaves:dripstonecave_bottom"] or 0) + + if c > 5 then + return "dripstonecave" + end + end +}) + +ambience.add_set("icecave", { + frequency = 30, + nodes = {"livingcaves:icecave_ice"}, + sounds = { + {name = "livingcaves_icecave", length = 15, ephemeral = true}, + {name = "livingcaves_icecave2", length = 22, ephemeral = true}, + {name = "livingcaves_icecave33", length = 8, ephemeral = true}, + }, +nodes = {"livingcaves:icecave_ice"}, + + sound_check = function(def) + + local c = (def.totals["livingcaves:icecave_ice"] or 0) + + if c > 5 then + return "icecave" + end + end +}) + +ambience.add_set("mushcave", { + frequency = 30, + nodes = {"livingcaves:mushcave_bottom"}, + sounds = { + {name = "livingcaves_mushcave", length = 10, ephemeral = true}, + {name = "livingcaves_mushcave2", length = 14, ephemeral = true}, + {name = "livingcaves_mushcave3", length = 8, ephemeral = true}, + {name = "livingcaves_mushcave4", length = 14, ephemeral = true}, + {name = "livingcaves_mushcave5", length = 10, ephemeral = true}, + {name = "livingcaves_mushcave6", length = 10, ephemeral = true}, + {name = "livingcaves_mushcave7", length = 8, ephemeral = true}, + {name = "livingcaves_mushcave8", length = 12, ephemeral = true}, + }, +nodes = {"livingcaves:mushcave_bottom"}, + + sound_check = function(def) + + local c = (def.totals["livingcaves:mushcave_bottom"] or 0) + + if c > 5 then + return "mushcave" + end + end +}) + diff --git a/mods/wilhelminessounds/livingdesertsounds.lua b/mods/wilhelminessounds/livingdesertsounds.lua new file mode 100644 index 0000000..d1267b3 --- /dev/null +++ b/mods/wilhelminessounds/livingdesertsounds.lua @@ -0,0 +1,83 @@ +ambience.add_set("livingdesert_desert_day", { + frequency = 45, + nodes = {"livingdesert:coldsteppe_ground"}, + sounds = { + {name = "livingdesert_desertsound6", length = 12, ephemeral = true}, + {name = "livingdesert_desertsound2", length = 6, ephemeral = true}, + {name = "livingdesert_desertsound3", length = 12, ephemeral = true}, + }, +nodes = {"livingdesert:coldsteppe_ground"}, + + sound_check = function(def) + + local c = (def.totals["livingdesert:coldsteppe_ground"] or 0) + + if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingdesert_desert_day" + end + end +}) + +ambience.add_set("livingdesert_desert_night", { + frequency = 45, + nodes = {"livingdesert:coldsteppe_ground"}, + sounds = { + {name = "livingdesert_desertsound5", length = 4, ephemeral = true}, + {name = "livingdesert_desertsound4", length = 6, ephemeral = true}, + {name = "livingdesert_desertsound3", length = 12, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + }, +nodes = {"livingdesert:coldsteppe_ground"}, + + sound_check = function(def) + + local c = (def.totals["livingdesert:coldsteppe_ground"] or 0) + + if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingdesert_desert_night" + end + end +}) + +ambience.add_set("livingdesert_steppe", { + frequency = 45, + nodes = {"livingdesert:coldsteppe_ground2"}, + sounds = { + {name = "livingdesert_desertsound1", length = 15, ephemeral = true}, + {name = "livingdesert_desertsound2", length = 6, ephemeral = true}, + {name = "livingdesert_desertsound3", length = 12, ephemeral = true}, + }, +nodes = {"livingdesert:coldsteppe_ground2"}, + + sound_check = function(def) + + local c = (def.totals["livingdesert:coldsteppe_ground2"] or 0) + + if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingdesert_steppe" + end + end +}) + +ambience.add_set("livingdesert_steppe_night", { + frequency = 45, + nodes = {"livingdesert:coldsteppe_ground2"}, + sounds = { + {name = "livingdesert_desertsound5", length = 4, ephemeral = true}, + {name = "livingdesert_desertsound4", length = 6, ephemeral = true}, + {name = "livingdesert_desertsound3", length = 12, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + }, +nodes = {"livingdesert:coldsteppe_ground2"}, + + sound_check = function(def) + + local c = (def.totals["livingdesert:coldsteppe_ground2"] or 0) + + if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingdesert_steppe_night" + end + end +}) \ No newline at end of file diff --git a/mods/wilhelminessounds/livingfloatlandssounds.lua b/mods/wilhelminessounds/livingfloatlandssounds.lua new file mode 100644 index 0000000..7544591 --- /dev/null +++ b/mods/wilhelminessounds/livingfloatlandssounds.lua @@ -0,0 +1,170 @@ +ambience.add_set("livingfloatlands_coldsteppe_day", { + frequency = 45, + nodes = {"livingfloatlands:coldsteppe_litter"}, + sounds = { + {name = "livingfloatlands_coldsteppe", length = 10, ephemeral = true}, + {name = "livingfloatlands_coldsteppe2", length = 4, ephemeral = true}, + {name = "livingfloatlands_coldsteppe3", length = 13, ephemeral = true}, + }, +nodes = {"livingfloatlands:coldsteppe_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:coldsteppe_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingfloatlands_coldsteppe_day" + end + end +}) + +ambience.add_set("livingfloatlands_coldsteppe_night", { + frequency = 45, + nodes = {"livingfloatlands:coldsteppe_litter"}, + sounds = { + {name = "livingfloatlands_coldsteppe4", length = 7, ephemeral = true}, + {name = "livingfloatlands_coldsteppe5", length = 14, ephemeral = true}, + {name = "livingfloatlands_coldsteppe6", length = 10, ephemeral = true}, + {name = "wilhelminessounds_owlandwind", length = 8, ephemeral = true}, + {name = "wilhelminessounds_owlandwind2", length = 5, ephemeral = true}, + }, +nodes = {"livingfloatlands:coldsteppe_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:coldsteppe_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingfloatlands_coldsteppe_night" + end + end +}) + +ambience.add_set("livingfloatlands_giantforest_day", { + frequency = 45, + nodes = {"livingfloatlands:giantforest_litter"}, + sounds = { + {name = "livingfloatlands_giantforest", length = 7, ephemeral = true}, + {name = "livingfloatlands_giantforest2", length = 4, ephemeral = true}, + {name = "livingfloatlands_giantforest3", length = 9, ephemeral = true}, + {name = "livingfloatlands_giantforest4", length = 5, ephemeral = true}, + {name = "livingfloatlands_giantforest5", length = 5, ephemeral = true}, + }, +nodes = {"livingfloatlands:giantforest_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:giantforest_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingfloatlands_giantforest_day" + end + end +}) + +ambience.add_set("livingfloatlands_giantforest_night", { + frequency = 45, + nodes = {"livingfloatlands:giantforest_litter"}, + sounds = { + {name = "livingfloatlands_giantforest6", length = 17, ephemeral = true}, + {name = "livingfloatlands_giantforest7", length = 12, ephemeral = true}, + {name = "livingfloatlands_giantforest8", length = 10, ephemeral = true}, + }, +nodes = {"livingfloatlands:giantforest_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:giantforest_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingfloatlands_giantforest_night" + end + end +}) + +ambience.add_set("livingfloatlands_paleodesert_day", { + frequency = 35, + nodes = {"livingfloatlands:paleodesert_litter"}, + sounds = { + {name = "livingfloatlands_paleodesert3", length = 7, ephemeral = true}, + {name = "livingdesert_desertsound1", length = 15, ephemeral = true}, + {name = "livingdesert_desertsound2", length = 6, ephemeral = true}, + + }, +nodes = {"livingfloatlands:paleodesert_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:paleodesert_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingfloatlands_paleodesert_day" + end + end +}) + +ambience.add_set("livingfloatlands_paleodesert_night", { + frequency = 40, + nodes = {"livingfloatlands:paleodesert_litter"}, + sounds = { + {name = "livingfloatlands_paleodesert2", length = 4, ephemeral = true}, + {name = "livingfloatlands_paleodesert3", length = 7, ephemeral = true}, + {name = "wilhelminessounds_cricket", length = 14, ephemeral = true}, + {name = "livingfloatlands_paleodesert", length = 5, ephemeral = true}, + }, +nodes = {"livingfloatlands:paleodesert_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:paleodesert_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingfloatlands_paleodesert_night" + end + end +}) + +ambience.add_set("livingfloatlands_paleojungle_day", { + frequency = 45, + nodes = {"livingfloatlands:paleojungle_litter"}, + sounds = { + {name = "livingfloatlands_paleojungle", length = 13, ephemeral = true}, + {name = "livingfloatlands_paleojungle2", length = 5, ephemeral = true}, + {name = "livingfloatlands_paleojungle3", length = 4, ephemeral = true}, + + }, +nodes = {"livingfloatlands:paleojungle_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:paleojungle_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingfloatlands_paleojungle_day" + end + end +}) + +ambience.add_set("livingfloatlands_paleojungle_night", { + frequency = 35, + nodes = {"livingfloatlands:paleojungle_litter"}, + sounds = { + {name = "livingfloatlands_paleojungle4", length = 24, ephemeral = true}, + {name = "wilhelminessounds_cricket2", length = 16, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + }, +nodes = {"livingfloatlands:paleojungle_litter"}, + + sound_check = function(def) + + local c = (def.totals["livingfloatlands:paleojungle_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingfloatlands_paleojungle_night" + end + end +}) \ No newline at end of file diff --git a/mods/wilhelminessounds/livingjunglesounds.lua b/mods/wilhelminessounds/livingjunglesounds.lua new file mode 100644 index 0000000..a550d17 --- /dev/null +++ b/mods/wilhelminessounds/livingjunglesounds.lua @@ -0,0 +1,42 @@ +ambience.add_set("livingjungle_day", { + frequency = 60, + nodes = {"livingjungle:jungleground"}, + sounds = { + {name = "livingjungle_jungleday", length = 17, ephemeral = true}, + {name = "livingjungle_jungleday2", length = 35, ephemeral = true}, + {name = "livingjungle_jungleday3", length = 5, ephemeral = true}, + {name = "livingjungle_jungleday4", length = 1, ephemeral = true}, + }, +nodes = {"livingjungle:jungleground"}, + + sound_check = function(def) + + local c = (def.totals["livingjungle:jungleground"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "livingjungle_day" + end + end +}) + +ambience.add_set("livingjungle_night", { + frequency = 60, + nodes = {"livingjungle:jungleground"}, + sounds = { + {name = "livingjungle_junglenite", length = 28, ephemeral = true}, + {name = "livingjungle_junglenite2", length = 8, ephemeral = true}, + {name = "livingjungle_junglenite3", length = 2, ephemeral = true}, + {name = "livingjungle_junglenite4", length = 2, ephemeral = true}, + }, +nodes = {"livingjungle:jungleground"}, + + sound_check = function(def) + + local c = (def.totals["livingjungle:jungleground"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "livingjungle_night" + end + end +}) \ No newline at end of file diff --git a/mods/wilhelminessounds/mod.conf b/mods/wilhelminessounds/mod.conf new file mode 100644 index 0000000..9842793 --- /dev/null +++ b/mods/wilhelminessounds/mod.conf @@ -0,0 +1,2 @@ +name = wilhelminessounds + diff --git a/mods/wilhelminessounds/naturalbiomessounds.lua b/mods/wilhelminessounds/naturalbiomessounds.lua new file mode 100644 index 0000000..3b99ab9 --- /dev/null +++ b/mods/wilhelminessounds/naturalbiomessounds.lua @@ -0,0 +1,317 @@ +ambience.add_set("naturalbiomes_alderswamp_day", { + frequency = 55, + nodes = {"naturalbiomes:alderswamp_litter"}, + sounds = { + {name = "naturalbiomes_alderswamp5", length = 7, ephemeral = true}, + {name = "naturalbiomes_alderswamp4", length = 9, ephemeral = true}, + {name = "naturalbiomes_alderswamp3", length = 5, ephemeral = true}, + }, +nodes = {"naturalbiomes:alderswamp_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:alderswamp_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "naturalbiomes_alderswamp_day" + end + end +}) + +ambience.add_set("naturalbiomes_alderswamp_night", { + frequency = 55, + nodes = {"naturalbiomes:alderswamp_litter"}, + sounds = { + {name = "wilhelminessounds_nighttime2", length = 15, ephemeral = true}, + {name = "naturalbiomes_alderswamp", length = 13, ephemeral = true}, + {name = "naturalbiomes_alderswamp2", length = 6, ephemeral = true}, + }, +nodes = {"naturalbiomes:alderswamp_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:alderswamp_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_alderswamp_night" + end + end +}) + +ambience.add_set("naturalbiomes_alpine_day", { + frequency = 50, + nodes = {"naturalbiomes:alpine_litter"}, + sounds = { + {name = "naturalbiomes_alpine", length = 3, ephemeral = true}, + {name = "naturalbiomes_alpine2", length = 4, ephemeral = true}, + {name = "naturalbiomes_alpine3", length = 4, ephemeral = true}, + {name = "naturalbiomes_alpine4", length = 10, ephemeral = true}, + }, +nodes = {"naturalbiomes:alpine_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:alpine_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "naturalbiomes_alpine_day" + end + end +}) +ambience.add_set("naturalbiomes_alpine_night", { + frequency = 50, + nodes = {"naturalbiomes:alpine_litter"}, + sounds = { + {name = "wilhelminessounds_cricket2", length = 16, ephemeral = true}, + {name = "wilhelminessounds_nighttime2", length = 15, ephemeral = true}, + {name = "wilhelminessounds_owl", length = 8, ephemeral = true}, + }, +nodes = {"naturalbiomes:alpine_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:alpine_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_alpine_night" + end + end +}) + +ambience.add_set("naturalbiomes_bambooforest_day", { + frequency = 50, + nodes = {"naturalbiomes:bambooforest_litter"}, + sounds = { + {name = "naturalbiomes_bambooforest3", length = 2, ephemeral = true}, + {name = "naturalbiomes_bambooforest4", length = 3, ephemeral = true}, + {name = "wilhelminessounds_cricket2", length = 16, ephemeral = true}, + {name = "wilhelminessounds_cricket", length = 14, ephemeral = true}, + }, +nodes = {"naturalbiomes:bambooforest_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:bambooforest_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "naturalbiomes_bambooforest_day" + end + end +}) + +ambience.add_set("naturalbiomes_bambooforest_night", { + frequency = 60, + nodes = {"naturalbiomes:bambooforest_litter"}, + sounds = { + {name = "naturalbiomes_bambooforest", length = 17, ephemeral = true}, + {name = "naturalbiomes_bambooforest2", length = 48, ephemeral = true}, + {name = "wilhelminessounds_owl", length = 8, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + }, +nodes = {"naturalbiomes:bambooforest_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:bambooforest_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_bambooforest_night" + end + end +}) + +ambience.add_set("naturalbiomes_heath_day", { + frequency = 55, + nodes = {"naturalbiomes:heath_litter"}, + sounds = { + {name = "naturalbiomes_heath3", length = 14, ephemeral = true}, + {name = "naturalbiomes_heath4", length = 11, ephemeral = true}, + {name = "naturalbiomes_heath5", length = 18, ephemeral = true}, + }, +nodes = {"naturalbiomes:heath_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:heath_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 2 then + return "naturalbiomes_heath_day" + end + end +}) + +ambience.add_set("naturalbiomes_heath_night", { + frequency = 55, + nodes = {"naturalbiomes:heath_litter"}, + sounds = { + {name = "naturalbiomes_heath2", length = 1, ephemeral = true}, + {name = "naturalbiomes_heath", length = 2, ephemeral = true}, + {name = "wilhelminessounds_owl", length = 8, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + }, +nodes = {"naturalbiomes:heath_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:heath_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 2 then + return "naturalbiomes_heath_night" + end + end +}) + +ambience.add_set("naturalbiomes_mediterran_day", { + frequency = 50, + nodes = {"naturalbiomes:mediterran_litter"}, + sounds = { + {name = "naturalbiomes_mediterran", length = 6, ephemeral = true}, + {name = "naturalbiomes_mediterran2", length = 6, ephemeral = true}, + {name = "naturalbiomes_mediterran3", length = 8, ephemeral = true}, + {name = "naturalbiomes_mediterran4", length = 9, ephemeral = true}, + {name = "naturalbiomes_mediterran5", length = 8, ephemeral = true}, + }, +nodes = {"naturalbiomes:mediterran_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:mediterran_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "naturalbiomes_mediterran_day" + end + end +}) + +ambience.add_set("naturalbiomes_mediterran_night", { + frequency = 50, + nodes = {"naturalbiomes:mediterran_litter"}, + sounds = { + {name = "naturalbiomes_mediterran6", length = 5, ephemeral = true}, + {name = "wilhelminessounds_nighttime2", length = 15, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + {name = "wilhelminessounds_cricket", length = 14, ephemeral = true}, + }, +nodes = {"naturalbiomes:mediterran_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:mediterran_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_mediterran_night" + end + end +}) + +ambience.add_set("naturalbiomes_outback_day", { + frequency = 50, + nodes = {"naturalbiomes:outback_litter"}, + sounds = { + {name = "naturalbiomes_outback2", length = 4, ephemeral = true}, + {name = "naturalbiomes_outback3", length = 11, ephemeral = true}, + {name = "naturalbiomes_outback4", length = 5, ephemeral = true}, + {name = "naturalbiomes_outback", length = 14, ephemeral = true}, + }, +nodes = {"naturalbiomes:outback_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:outback_litter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "naturalbiomes_outback_day" + end + end +}) + +ambience.add_set("naturalbiomes_outback_night", { + frequency = 50, + nodes = {"naturalbiomes:outback_litter"}, + sounds = { + {name = "livingfloatlands_paleojungle4", length = 24, ephemeral = true}, + {name = "wilhelminessounds_cricket2", length = 16, ephemeral = true}, + {name = "wilhelminessounds_cricket", length = 14, ephemeral = true}, + }, +nodes = {"naturalbiomes:outback_litter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:outback_litter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_outback_night" + end + end +}) + +ambience.add_set("naturalbiomes_wetsavanna_day", { + frequency = 55, + nodes = {"naturalbiomes:savannalitter"}, + sounds = { + {name = "naturalbiomes_wetsavanna", length = 10, ephemeral = true}, + {name = "naturalbiomes_wetsavanna2", length = 13, ephemeral = true}, + {name = "naturalbiomes_wetsavanna5", length = 8, ephemeral = true}, + {name = "naturalbiomes_wetsavanna6", length = 8, ephemeral = true}, + }, +nodes = {"naturalbiomes:savannalitter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:savannalitter"] or 0) + +if (def.tod > 0.2 and def.tod < 0.8) + and c > 5 then + return "naturalbiomes_wetsavanna_day" + end + end +}) + +ambience.add_set("naturalbiomes_wetsavanna_night", { + frequency = 50, + nodes = {"naturalbiomes:savannalitter"}, + sounds = { + {name = "naturalbiomes_wetsavanna3", length = 3, ephemeral = true}, + {name = "naturalbiomes_wetsavanna4", length = 1, ephemeral = true}, + {name = "wilhelminessounds_cricket2", length = 16, ephemeral = true}, + {name = "wilhelminessounds_cricket", length = 14, ephemeral = true}, + }, +nodes = {"naturalbiomes:savannalitter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:savannalitter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_wetsavanna_night" + end + end +}) + +ambience.add_set("naturalbiomes_bushland_night", { + frequency = 60, + nodes = {"naturalbiomes:bushland_bushlandlitter"}, + sounds = { + {name = "wilhelminessounds_cricket2", length = 17, ephemeral = true}, + {name = "wilhelminessounds_cricket", length = 48, ephemeral = true}, + {name = "wilhelminessounds_owl", length = 8, ephemeral = true}, + {name = "wilhelminessounds_nighttime", length = 21, ephemeral = true}, + }, +nodes = {"naturalbiomes:bushland_bushlandlitter"}, + + sound_check = function(def) + + local c = (def.totals["naturalbiomes:bushland_bushlandlitter"] or 0) + +if (def.tod < 0.2 or def.tod > 0.8) and c > 5 then + return "naturalbiomes_bushland_night" + end + end +}) + diff --git a/mods/wilhelminessounds/screenshot.png b/mods/wilhelminessounds/screenshot.png new file mode 100644 index 0000000..4ce88dc Binary files /dev/null and b/mods/wilhelminessounds/screenshot.png differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_bacteriacave.ogg b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave.ogg new file mode 100644 index 0000000..4cc0088 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_bacteriacave2.ogg b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave2.ogg new file mode 100644 index 0000000..ca25a3f Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_bacteriacave3.ogg b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave3.ogg new file mode 100644 index 0000000..f0397c3 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_bacteriacave4.ogg b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave4.ogg new file mode 100644 index 0000000..5d7fd0c Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_bacteriacave5.ogg b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave5.ogg new file mode 100644 index 0000000..4837358 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave5.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_bacteriacave6.ogg b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave6.ogg new file mode 100644 index 0000000..71756dd Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_bacteriacave6.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone.ogg new file mode 100644 index 0000000..7348798 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone2.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone2.ogg new file mode 100644 index 0000000..8771761 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone3.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone3.ogg new file mode 100644 index 0000000..25fd8b0 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone4.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone4.ogg new file mode 100644 index 0000000..717aa32 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone5.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone5.ogg new file mode 100644 index 0000000..4478eb8 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone5.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone6.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone6.ogg new file mode 100644 index 0000000..897aecc Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone6.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_dripstone7.ogg b/mods/wilhelminessounds/sounds/livingcaves_dripstone7.ogg new file mode 100644 index 0000000..fd0d823 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_dripstone7.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_icecave.ogg b/mods/wilhelminessounds/sounds/livingcaves_icecave.ogg new file mode 100644 index 0000000..115b769 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_icecave.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_icecave2.ogg b/mods/wilhelminessounds/sounds/livingcaves_icecave2.ogg new file mode 100644 index 0000000..8ea9a48 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_icecave2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_icecave3.ogg b/mods/wilhelminessounds/sounds/livingcaves_icecave3.ogg new file mode 100644 index 0000000..fb0910c Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_icecave3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave.ogg new file mode 100644 index 0000000..5277a5a Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave2.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave2.ogg new file mode 100644 index 0000000..d07448c Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave3.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave3.ogg new file mode 100644 index 0000000..56fca3d Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave4.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave4.ogg new file mode 100644 index 0000000..412e4f5 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave5.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave5.ogg new file mode 100644 index 0000000..b7633c2 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave5.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave6.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave6.ogg new file mode 100644 index 0000000..860b7fb Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave6.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave7.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave7.ogg new file mode 100644 index 0000000..c2e6907 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave7.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingcaves_mushcave8.ogg b/mods/wilhelminessounds/sounds/livingcaves_mushcave8.ogg new file mode 100644 index 0000000..392f618 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingcaves_mushcave8.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingdesert_desertsound1.ogg b/mods/wilhelminessounds/sounds/livingdesert_desertsound1.ogg new file mode 100644 index 0000000..85ab216 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingdesert_desertsound1.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingdesert_desertsound2.ogg b/mods/wilhelminessounds/sounds/livingdesert_desertsound2.ogg new file mode 100644 index 0000000..0c0bb98 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingdesert_desertsound2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingdesert_desertsound3.ogg b/mods/wilhelminessounds/sounds/livingdesert_desertsound3.ogg new file mode 100644 index 0000000..4a67f54 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingdesert_desertsound3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingdesert_desertsound4.ogg b/mods/wilhelminessounds/sounds/livingdesert_desertsound4.ogg new file mode 100644 index 0000000..a676b2c Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingdesert_desertsound4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingdesert_desertsound5.ogg b/mods/wilhelminessounds/sounds/livingdesert_desertsound5.ogg new file mode 100644 index 0000000..e3a7923 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingdesert_desertsound5.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingdesert_desertsound6.ogg b/mods/wilhelminessounds/sounds/livingdesert_desertsound6.ogg new file mode 100644 index 0000000..f7612c7 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingdesert_desertsound6.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe.ogg new file mode 100644 index 0000000..603b40e Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe2.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe2.ogg new file mode 100644 index 0000000..e7878a1 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe3.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe3.ogg new file mode 100644 index 0000000..873e943 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe4.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe4.ogg new file mode 100644 index 0000000..285a782 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe5.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe5.ogg new file mode 100644 index 0000000..0c9e7cf Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe5.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe6.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe6.ogg new file mode 100644 index 0000000..93acf64 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_coldsteppe6.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest.ogg new file mode 100644 index 0000000..792012f Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest2.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest2.ogg new file mode 100644 index 0000000..bc834eb Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest3.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest3.ogg new file mode 100644 index 0000000..61330b2 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest4.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest4.ogg new file mode 100644 index 0000000..a812406 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest5.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest5.ogg new file mode 100644 index 0000000..118424a Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest5.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest6.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest6.ogg new file mode 100644 index 0000000..484afc0 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest6.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest7.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest7.ogg new file mode 100644 index 0000000..cb7b996 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest7.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_giantforest8.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest8.ogg new file mode 100644 index 0000000..2e6a699 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_giantforest8.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert.ogg new file mode 100644 index 0000000..1477b57 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert2.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert2.ogg new file mode 100644 index 0000000..29c1361 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert3.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert3.ogg new file mode 100644 index 0000000..e9e99ed Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleodesert3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle.ogg new file mode 100644 index 0000000..9970152 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle2.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle2.ogg new file mode 100644 index 0000000..83cd8bc Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle3.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle3.ogg new file mode 100644 index 0000000..4c4de8c Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle4.ogg b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle4.ogg new file mode 100644 index 0000000..8cb2b83 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingfloatlands_paleojungle4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_jungleday.ogg b/mods/wilhelminessounds/sounds/livingjungle_jungleday.ogg new file mode 100644 index 0000000..ba6c99e Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_jungleday.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_jungleday2.ogg b/mods/wilhelminessounds/sounds/livingjungle_jungleday2.ogg new file mode 100644 index 0000000..06d54b5 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_jungleday2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_jungleday3.ogg b/mods/wilhelminessounds/sounds/livingjungle_jungleday3.ogg new file mode 100644 index 0000000..82857cb Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_jungleday3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_jungleday4.ogg b/mods/wilhelminessounds/sounds/livingjungle_jungleday4.ogg new file mode 100644 index 0000000..61d450f Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_jungleday4.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_junglenite.ogg b/mods/wilhelminessounds/sounds/livingjungle_junglenite.ogg new file mode 100644 index 0000000..acb6961 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_junglenite.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_junglenite2.ogg b/mods/wilhelminessounds/sounds/livingjungle_junglenite2.ogg new file mode 100644 index 0000000..2dacbfc Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_junglenite2.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_junglenite3.ogg b/mods/wilhelminessounds/sounds/livingjungle_junglenite3.ogg new file mode 100644 index 0000000..9228e93 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_junglenite3.ogg differ diff --git a/mods/wilhelminessounds/sounds/livingjungle_junglenite4.ogg b/mods/wilhelminessounds/sounds/livingjungle_junglenite4.ogg new file mode 100644 index 0000000..ca0f138 Binary files /dev/null and b/mods/wilhelminessounds/sounds/livingjungle_junglenite4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp.ogg new file mode 100644 index 0000000..9873d80 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp2.ogg new file mode 100644 index 0000000..188b352 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp3.ogg new file mode 100644 index 0000000..de2c3cc Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp4.ogg new file mode 100644 index 0000000..72fdfa3 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp5.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp5.ogg new file mode 100644 index 0000000..f29afe5 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alderswamp5.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alpine.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alpine.ogg new file mode 100644 index 0000000..45ba0f5 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alpine.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alpine2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alpine2.ogg new file mode 100644 index 0000000..006650d Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alpine2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alpine3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alpine3.ogg new file mode 100644 index 0000000..b5cda74 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alpine3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_alpine4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_alpine4.ogg new file mode 100644 index 0000000..3408f34 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_alpine4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest.ogg new file mode 100644 index 0000000..fc08cf4 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest2.ogg new file mode 100644 index 0000000..4a25c56 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest3.ogg new file mode 100644 index 0000000..4473941 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest4.ogg new file mode 100644 index 0000000..9b24c07 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_bambooforest4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_heath.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_heath.ogg new file mode 100644 index 0000000..0d08bc4 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_heath.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_heath2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_heath2.ogg new file mode 100644 index 0000000..3be0678 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_heath2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_heath3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_heath3.ogg new file mode 100644 index 0000000..047dd2e Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_heath3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_heath4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_heath4.ogg new file mode 100644 index 0000000..8a1172a Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_heath4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_heath5.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_heath5.ogg new file mode 100644 index 0000000..991e7cd Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_heath5.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_mediterran.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran.ogg new file mode 100644 index 0000000..45a42df Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_mediterran2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran2.ogg new file mode 100644 index 0000000..23e54db Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_mediterran3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran3.ogg new file mode 100644 index 0000000..5f28f45 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_mediterran4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran4.ogg new file mode 100644 index 0000000..878f3f8 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_mediterran5.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran5.ogg new file mode 100644 index 0000000..4e3b97e Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran5.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_mediterran6.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran6.ogg new file mode 100644 index 0000000..4703da4 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_mediterran6.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_outback.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_outback.ogg new file mode 100644 index 0000000..7eb32d7 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_outback.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_outback2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_outback2.ogg new file mode 100644 index 0000000..43f9603 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_outback2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_outback3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_outback3.ogg new file mode 100644 index 0000000..cca9293 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_outback3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_outback4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_outback4.ogg new file mode 100644 index 0000000..aba135f Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_outback4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna.ogg new file mode 100644 index 0000000..e6f0eff Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna2.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna2.ogg new file mode 100644 index 0000000..efe6d81 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna2.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna3.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna3.ogg new file mode 100644 index 0000000..8cd54a4 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna3.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna4.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna4.ogg new file mode 100644 index 0000000..f95201f Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna4.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna5.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna5.ogg new file mode 100644 index 0000000..a4ad681 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna5.ogg differ diff --git a/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna6.ogg b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna6.ogg new file mode 100644 index 0000000..066b473 Binary files /dev/null and b/mods/wilhelminessounds/sounds/naturalbiomes_wetsavanna6.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_cricket.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_cricket.ogg new file mode 100644 index 0000000..e581a9b Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_cricket.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_cricket2.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_cricket2.ogg new file mode 100644 index 0000000..ccf4b06 Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_cricket2.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_nighttime.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_nighttime.ogg new file mode 100644 index 0000000..8e2fea5 Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_nighttime.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_nighttime2.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_nighttime2.ogg new file mode 100644 index 0000000..9540b34 Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_nighttime2.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_owl.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_owl.ogg new file mode 100644 index 0000000..d4b5076 Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_owl.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_owlandwind.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_owlandwind.ogg new file mode 100644 index 0000000..c2e1b88 Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_owlandwind.ogg differ diff --git a/mods/wilhelminessounds/sounds/wilhelminessounds_owlandwind2.ogg b/mods/wilhelminessounds/sounds/wilhelminessounds_owlandwind2.ogg new file mode 100644 index 0000000..6613a75 Binary files /dev/null and b/mods/wilhelminessounds/sounds/wilhelminessounds_owlandwind2.ogg differ diff --git a/mods/winuserleafdecay/LICENSE b/mods/winuserleafdecay/LICENSE new file mode 100644 index 0000000..987fde1 --- /dev/null +++ b/mods/winuserleafdecay/LICENSE @@ -0,0 +1,25 @@ + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Modified Code by Liil/Wilhelmine/Skandarella (c) 2023 under (MIT) License (c) 2023 + + + diff --git a/mods/winuserleafdecay/README.txt b/mods/winuserleafdecay/README.txt new file mode 100644 index 0000000..a978738 --- /dev/null +++ b/mods/winuserleafdecay/README.txt @@ -0,0 +1,15 @@ +Since there is still no way for Windows users to convert schematics without having the problem of standard param2 = 1 for placed leaves, I made this little mod to have an alternate leafdecay. + +With this mod, all trees in my mods have a working leafdecay function. If you are a windows user and have no option to change param2 =1 to param2 =0 in schematic files, you can modify my mod to create +your own lefdecay, or you can contact me on Minetest Forum or github and I can support your mod, if you send me the needed list of leaves and trunks, for example: + +winuserleafdecay.register_winleafdecay({ + trunks = {"nameofyourmod:yourbiome_yourtree_trunk"}, + leaves = {"nameofyourmod:yourbiome_yourtree_leaves", nameofyourmod:yourbiome_yourtree_fruit"}, + radius = 3 +}) + +To activate the Winuser Leafedecay, you have to add two things to your leaves and other tree objects that are falling down when the trunk is chopped(fruits, nuts) code: + +For leaves that should decay you have to add under groups: winleafdecay = 3 +For fruits, tree mushrooms or nuts that should fall down: winleafdecay_drop = 1, winleafdecay = 3 \ No newline at end of file diff --git a/mods/winuserleafdecay/depends.txt b/mods/winuserleafdecay/depends.txt new file mode 100644 index 0000000..e5ba8e2 --- /dev/null +++ b/mods/winuserleafdecay/depends.txt @@ -0,0 +1,5 @@ +default +livingfloatlands? +livingdesert? +livingjungle? +naturalbiomes? \ No newline at end of file diff --git a/mods/winuserleafdecay/description.txt b/mods/winuserleafdecay/description.txt new file mode 100644 index 0000000..a965783 --- /dev/null +++ b/mods/winuserleafdecay/description.txt @@ -0,0 +1 @@ +With this mod, all trees in Wilhelmines mods have a working leafdecay function. \ No newline at end of file diff --git a/mods/winuserleafdecay/functions.lua b/mods/winuserleafdecay/functions.lua new file mode 100644 index 0000000..7c1de2c --- /dev/null +++ b/mods/winuserleafdecay/functions.lua @@ -0,0 +1,79 @@ +winuserleafdecay = {} + +local function winleafdecay_after_destruct(pos, oldnode, def) +for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if node.param2 ~= 3 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) + end + end +end + +local movement_gravity = tonumber( + minetest.settings:get("movement_gravity")) or 9.81 + +local function winleafdecay_on_timer(pos, def) +if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if minetest.get_item_group(item, "winleafdecay_drop") ~= 0 or + not is_leaf then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) + + -- spawn a few particles for the removed node + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}), + maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) +end + +function winuserleafdecay.register_winleafdecay(def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + winleafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + winleafdecay_on_timer(pos, def) + end, + }) + end +end + diff --git a/mods/winuserleafdecay/init.lua b/mods/winuserleafdecay/init.lua new file mode 100644 index 0000000..0a53484 --- /dev/null +++ b/mods/winuserleafdecay/init.lua @@ -0,0 +1,22 @@ + +local modname = "winuserleafdecay" +local modpath = minetest.get_modpath(modname) +local mg_name = minetest.get_mapgen_setting("mg_name") + +-- Load support for intllib. +local path = minetest.get_modpath(minetest.get_current_modname()) .. "/" + +local S = minetest.get_translator and minetest.get_translator("winuserleafdecay") or + dofile(path .. "intllib.lua") + + + +-- lua +dofile(path .. "functions.lua") -- +dofile(path .. "leafdecay.lua") -- + + + + + +print (S("[MOD] leafdecay loaded")) diff --git a/mods/winuserleafdecay/intllib.lua b/mods/winuserleafdecay/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/winuserleafdecay/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/winuserleafdecay/leafdecay.lua b/mods/winuserleafdecay/leafdecay.lua new file mode 100644 index 0000000..28e95ff --- /dev/null +++ b/mods/winuserleafdecay/leafdecay.lua @@ -0,0 +1,237 @@ +if minetest.get_modpath("livingfloatlands") then + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:giantforest_paleoredwood_trunk"}, + leaves = {"livingfloatlands:giantforest_paleoredwood_leaves", "livingfloatlands:giantforest_tinderfungus"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:coldsteppe_pine_trunk"}, + leaves = {"livingfloatlands:coldsteppe_pine_leaves", "livingfloatlands:coldsteppe_pine_pinecone"}, + radius = 5 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:coldsteppe_pine2_trunk"}, + leaves = {"livingfloatlands:coldsteppe_pine2_leaves", "livingfloatlands:coldsteppe_pine2_pinecone"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:coldsteppe_pine3_trunk"}, + leaves = {"livingfloatlands:coldsteppe_pine3_leaves", "livingfloatlands:coldsteppe_pine3_pinecone"}, + radius = 5 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:giantforest_paleooak_trunk"}, + leaves = {"livingfloatlands:giantforest_paleooak_leaves", "livingfloatlands:giantforest_oaknut"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:paleodesert_joshua_trunk"}, + leaves = {"livingfloatlands:paleodesert_joshua_leaves"}, + radius = 3 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:paleodesert_paleopine_trunk"}, + leaves = {"livingfloatlands:paleodesert_paleopine_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:paleojungle_clubmoss_trunk"}, + leaves = {"livingfloatlands:paleojungle_clubmoss_leaves", "livingfloatlands:paleojungle_clubmoss_fruit"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:paleojungle_conifere_trunk"}, + leaves = {"livingfloatlands:paleojungle_conifere_leaves"}, + radius = 8 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingfloatlands:paleojungle_paleopalm_trunk"}, + leaves = {"livingfloatlands:paleojungle_paleopalm_leaves"}, + radius = 3 +}) + +end + +if minetest.get_modpath("naturalbiomes") then + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:alder_trunk"}, + leaves = {"naturalbiomes:alder_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:alppine1_trunk"}, + leaves = {"naturalbiomes:alppine1_leaves"}, + radius = 5 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:alppine2_trunk"}, + leaves = {"naturalbiomes:alppine2_leaves"}, + radius = 3 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:bamboo_trunk", "naturalbiomes:smallbamboo"}, + leaves = {"naturalbiomes:bamboo_leaves"}, + radius = 4 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:banana_trunk"}, + leaves = {"naturalbiomes:banana_leaves", "naturalbiomes:banana", "naturalbiomes:banana_bunch"}, + radius = 4 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:olive_trunk"}, + leaves = {"naturalbiomes:olive_leaves", "naturalbiomes:olives"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:pine_trunk"}, + leaves = {"naturalbiomes:pine_leaves"}, + radius = 8 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:med_bush_stem"}, + leaves = {"naturalbiomes:med_bush_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:outback_trunk"}, + leaves = {"naturalbiomes:outback_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:outback_bush_stem"}, + leaves = {"naturalbiomes:outback_bush_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:palm_trunk"}, + leaves = {"naturalbiomes:palm_leaves", "naturalbiomes:coconut"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:beach_bush_stem"}, + leaves = {"naturalbiomes:beach_bush_leaves"}, + radius = 4 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:acacia_trunk"}, + leaves = {"naturalbiomes:acacia_leaves"}, + radius = 7 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:heath_willow_trunk"}, + leaves = {"naturalbiomes:heath_willow_leaves2"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:heath_juniper_trunk"}, + leaves = {"naturalbiomes:heath_juniper_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:heath_birch_trunk"}, + leaves = {"naturalbiomes:heath_birch_leaves"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:bushland_hazelnut_stem"}, + leaves = {"naturalbiomes:bushland_hazelnut_leaves", "naturalbiomes:bushland_hazelnut_leaves2"}, + radius = 4 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:bushland_wildrose_stem"}, + leaves = {"naturalbiomes:bushland_wildrose_leaves2", "naturalbiomes:bushland_wildrose_leaves"}, + radius = 4 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"naturalbiomes:bushland_blackberry_stem"}, + leaves = {"naturalbiomes:bushland_blackberry_leaves2", "naturalbiomes:bushland_blackberry_leaves"}, + radius = 4 +}) + +end + +if minetest.get_modpath("livingjungle") then + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingjungle:samauma_trunk"}, + leaves = {"livingjungle:samauma_leaves", "livingjungle:lianaleaves", "livingjungle:lianabranch", "livingjungle:lianabranch3"}, + radius = 9 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingjungle:liana_stem"}, + leaves = {"livingjungle:lianaleaves", "livingjungle:lianabranch", "livingjungle:lianabranch3"}, + radius = 6 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingjungle:mangrove_root2", "livingjungle:mangrove_stem"}, + leaves = {"livingjungle:mangrove_leaves"}, + radius = 5 +}) + +end + +if minetest.get_modpath("livingdesert") then + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingdesert:date_palm_trunk"}, + leaves = {"livingdesert:date_palm_leaves", "livingdesert:date_palm_fruits"}, + radius = 3 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingdesert:euphorbia_trunk"}, + leaves = {"livingdesert:euphorbia_leaves"}, + radius = 3 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingdesert:figcactus_trunk"}, + leaves = {"livingdesert:figcactus_flower", "livingdesert:figcactus_fruit"}, + radius = 3 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingdesert:saxaul_trunk"}, + leaves = {"livingdesert:saxaul_leaves"}, + radius = 3 +}) + +winuserleafdecay.register_winleafdecay({ + trunks = {"livingdesert:pine_trunk"}, + leaves = {"livingdesert:pine_leaves", "livingdesert:pine_leaves2", "livingdesert:pine_leaves3"}, + radius = 3 +}) + +end diff --git a/mods/winuserleafdecay/mod.conf b/mods/winuserleafdecay/mod.conf new file mode 100644 index 0000000..d64aef6 --- /dev/null +++ b/mods/winuserleafdecay/mod.conf @@ -0,0 +1,2 @@ +name = winuserleafdecay + diff --git a/mods/winuserleafdecay/screenshot.png b/mods/winuserleafdecay/screenshot.png new file mode 100644 index 0000000..2673fad Binary files /dev/null and b/mods/winuserleafdecay/screenshot.png differ diff --git a/runner.lua b/runner.lua index 58a695b..bf367c1 100755 --- a/runner.lua +++ b/runner.lua @@ -75,7 +75,7 @@ local techage = "Unnamed Luanti TechAge Pack" local technic = "Unnamed Luanti Technic Pack" check_dependencies(technic) --- copy_pack_mods(techage, "../Luanti_Servers/mods") +copy_pack_mods(technic, "../Luanti_Servers/data/worlds/technic/worldmods") standardize_data() utility.save_data(data)